Saya sedang mengimplementasikan OAuth 2.0 JWT access_token di server otentikasi saya. Tapi, saya tidak mengerti apa perbedaan antara aud
klaim JWT dan nilai client_id
header HTTP. Apakah mereka sama? Jika tidak, dapatkah Anda menjelaskan perbedaan antara keduanya?
Kecurigaan saya adalah itu aud
harus merujuk ke server sumber daya, dan client_id
harus merujuk ke salah satu aplikasi klien yang dikenali oleh server otentikasi (yaitu aplikasi web, atau aplikasi iOS).
Dalam kasus saya saat ini, server sumber daya saya juga merupakan klien aplikasi web saya.
aud REQUIRED for session_token. Contains the client_id of the client receiving the assertion.
aud
Klaim JWT (Audience)Menurut RFC 7519 :
aud
Klaim Audience ( ) seperti yang didefinisikan oleh spesifikasi bersifat umum, dan khusus untuk aplikasi. Tujuan penggunaan adalah untuk mengidentifikasi penerima token yang dituju. Yang dimaksud penerima adalah khusus aplikasi. Nilai audiens bisa berupa daftar string, atau bisa berupa string tunggal jika hanya ada satuaud
klaim. Pencipta token tidak memberlakukan yangaud
divalidasi dengan benar, tanggung jawab berada pada penerima untuk menentukan apakah token tersebut harus digunakan.Apa pun nilainya, ketika penerima memvalidasi JWT dan ingin memvalidasi bahwa token dimaksudkan untuk digunakan untuk tujuannya, itu HARUS menentukan nilai apa dalam
aud
mengidentifikasi dirinya sendiri, dan token hanya boleh memvalidasi jika ID yang dinyatakan penerima adalah hadir dalamaud
klaim. Tidak masalah jika ini adalah URL atau string khusus aplikasi lainnya. Misalnya, jika sistem saya memutuskan untuk mengidentifikasi dirinyaaud
dengan string:api3.app.com
maka sistem seharusnya hanya menerima JWT jikaaud
klaim berisiapi3.app.com
daftar nilai audiensnya.Tentu saja penerima dapat memilih untuk mengabaikannya
aud
, jadi ini hanya berguna jika penerima menginginkan validasi positif bahwa token dibuat khusus untuknya.Penafsiran saya berdasarkan spesifikasinya adalah bahwa
aud
klaim tersebut berguna untuk membuat JWT yang dibuat khusus yang hanya valid untuk tujuan tertentu. Untuk satu sistem, ini mungkin berarti Anda ingin token valid untuk beberapa fitur, tetapi tidak valid untuk yang lain. Anda dapat menerbitkan token yang dibatasi hanya untuk "audiens" tertentu, sambil tetap menggunakan kunci dan algoritme validasi yang sama.Karena pada umumnya, JWT dibuat oleh layanan tepercaya, dan digunakan oleh sistem tepercaya lainnya (sistem yang tidak ingin menggunakan token yang tidak valid), sistem ini hanya perlu mengoordinasikan nilai yang akan mereka gunakan.
Tentu saja,
aud
sepenuhnya opsional dan dapat diabaikan jika kasus penggunaan Anda tidak menjaminnya. Jika Anda tidak ingin membatasi token untuk digunakan oleh audiens tertentu, atau tidak ada sistem Anda yang benar-benar akan memvalidasiaud
token tersebut, maka itu tidak berguna.Contoh: Akses vs. Segarkan Token
Satu contoh yang dibuat-buat (namun sederhana) yang dapat saya pikirkan adalah mungkin kita ingin menggunakan JWT untuk mengakses dan menyegarkan token tanpa harus menerapkan kunci enkripsi dan algoritme terpisah, tetapi hanya ingin memastikan bahwa token akses tidak akan divalidasi sebagai token penyegaran, atau sebaliknya -versa.
Dengan menggunakan
aud
kita dapat menentukan klaimrefresh
untuk token penyegaran dan klaimaccess
untuk token akses setelah membuat token ini. Saat permintaan dibuat untuk mendapatkan token akses baru dari token penyegaran, kita perlu memvalidasi bahwa token penyegaran adalah token penyegaran asli. Theaud
validasi seperti dijelaskan di atas akan memberitahu kita apakah tanda itu sebenarnya refresh valid token mencari khusus untuk klaimrefresh
diaud
.ID Klien OAuth vs.
aud
Klaim JWTClient ID OAuth sama sekali tidak terkait, dan tidak memiliki korelasi langsung dengan
aud
klaim JWT . Dari perspektif OAuth, token adalah objek buram.Aplikasi yang menerima token ini bertanggung jawab untuk mem-parsing dan memvalidasi arti dari token ini. Saya tidak melihat banyak manfaat dalam menentukan ID Klien OAuth dalam
aud
klaim JWT .sumber
Jika Anda datang ke sini mencari OpenID Connect (OIDC): OAuth 2.0! = OIDC
Saya menyadari bahwa ini diberi tag untuk oauth 2.0 dan BUKAN OIDC, namun sering kali ada penggabungan antara 2 standar karena kedua standar dapat menggunakan JWT dan
aud
klaim. Dan satu (OIDC) pada dasarnya merupakan perpanjangan dari yang lain (OAUTH 2.0). (Saya menemukan pertanyaan ini sendiri untuk mencari OIDC.)Token Akses OAuth 2.0 ##
Untuk token OAuth 2.0 Access , jawaban yang ada sudah cukup memadai. Selain itu, berikut adalah satu bagian yang relevan dari Kerangka Kerja OAuth 2.0 (RFC 6749)
Token ID OIDC ##
OIDC memiliki Token ID selain token Akses. Spesifikasi OIDC secara eksplisit tentang penggunaan
aud
klaim dalam Token ID. ( openid-connect-core-1.0 )selanjutnya OIDC menentukan
azp
klaim yang digunakan sehubungan denganaud
ketikaaud
memiliki lebih dari satu nilai.sumber
Meskipun ini sudah tua, saya pikir pertanyaan itu valid bahkan sampai hari ini
Ya, aud harus mengacu pada pihak yang mengonsumsi token. Dan client_id mengacu pada pihak yang memperoleh token.
Dalam skenario OP, aplikasi web dan server sumber daya keduanya milik pihak yang sama. Jadi ini berarti klien dan audiens menjadi sama. Tetapi mungkin ada situasi di mana hal ini tidak terjadi.
Pikirkan tentang SPA yang menggunakan sumber daya yang dilindungi OAuth. Dalam skenario ini SPA adalah klien. Sumber daya yang dilindungi adalah audiens token akses.
Skenario kedua ini menarik. Ada draf yang berfungsi bernama " Indikator Resource untuk OAuth 2.0 " yang menjelaskan di mana Anda dapat menentukan audiens yang dituju dalam permintaan otorisasi Anda. Jadi token yang dihasilkan akan dibatasi untuk audiens yang ditentukan. Selain itu, Azure OIDC menggunakan pendekatan serupa yang memungkinkan pendaftaran sumber daya dan mengizinkan permintaan autentikasi berisi parameter sumber daya untuk menentukan token akses audiens yang dituju. Mekanisme tersebut memungkinkan adpotations OAuth memiliki pemisahan antara klien dan pihak yang mengonsumsi token (audiens).
sumber