SAML2 va JWT: OpenID ulanishning 2-qismini tushunish

Ushbu xabar OpenID Connect (OIDC) haqidagi muhokamamizni davom ettiradi. Biz OIDC tomonidan aniqlangan uchta autentifikatsiya oqimlaridan birini - Avtorizatsiya kodi Grant oqimini ko'rib chiqamiz.

OIDC haqiqiylik tekshiruvi oqimi

OAuth2 Avtorizatsiya Grantslarini va Kengaytma Grantlarini belgilaydigan joyda, OIDC spetsifikatsiyasi Autentifikatsiya qilish oqimlarini belgilaydi. Tushunchalar o'xshash. Spetsifikatsiya uchta autentifikatsiya oqimini belgilaydi; ushbu oqimlar OPga yuborilgan parametrlar, javoblarning mazmuni va javob qanday qayta ishlanganligi bilan farqlanadi. Avtorizatsiyalashning so'nggi nuqtasiga (va Autentifikatsiya qilish oqimi tafsilotlariga) bo'lgan so'rovlar o'rtasidagi farqlovchi return_type parametridir. Ushbu parametr OAuth2 spec va OAuth2 Multiple Response Types spec orasida aniqlangan bir nechta yaroqli qiymatga ega:

Avtorizatsiya kodi oqimi: kod

Aniq oqim: id_token

Noaniq oqim: id_token token

Gibrid oqim: kod id_token

Gibrid oqim: kod belgisi

Gibrid oqim: kod id_token token

Xo'sh, bularning barchasi nimani anglatadi? Har doim siz "javob" kodi parametrida "kod" qiymatini ko'rsangiz, avtorizatsiya kodi avtorizatsiya qilishning so'nggi nuqtasida qaytariladi. Istalgan vaqtda "id_token" javob berish parametriga kiritilgan bo'lsa, id_token javobga qo'shiladi. Har qanday vaqtda "token" javob_metri parametriga kiritilgan, access_token esa avtorizatsiya tugatish nuqtasidan javobga kiritiladi. Ushbu tafsilotlar javobning tuzilishiga, Relying Party (RP, Client) tomonidan keyingi ishlov berish choralari va quyida ko'rib chiqilgandek qanday foydalanish holatlari ko'rib chiqilishiga ta'sir qiladi. Eslatma,

  • OIDC avtorizatsiya kodlari oqimi to'g'ridan-to'g'ri OAuth2 avtorizatsiya kodi grantini kengaytiradi. OIDC noma'lum oqimi va OIDC gibrid oqimi OIDC avtorizatsiya kodi oqimini kengaytiradi.
  • OIDC tomonidan aniqlangan avtorizatsiya kodining javob turi va OAuth2 spetsifikatori tomonidan belgilangan bir xil turdagi javobning turidan farq qiladi.

Ushbu xabarda ishlatilgan barcha namunaviy so'rovlar va javoblar OIDC spetsifikatsiyalarida keltirilgan misollar bo'yicha tafovutlardir.

Avtorizatsiya kodi oqimi (OIDC v1.0 spetsifikatsiya, 3.1 bo'lim): bu OAuth2 avtorizatsiya kodi grantining OIDC versiyasi. Ushbu oqim javob kodi turini "kod" ga o'rnatgan. Bu erda keltirilgan misol Avtorizatsiya kodi grantida mavjud bo'lgan barcha funktsiyalardan foydalanadi:

  • Yakuniy foydalanuvchini autentifikatsiya qilish
  • Ixtiyoriy partiyani autentifikatsiya qilish (mijoz, ilova), ixtiyoriy ravishda.
  • Relaying Party (RP) oxirgi foydalanuvchi hisob ma'lumotlarini (parol) ko'rmaydi
  • Foydalanuvchi agenti kirish tokenini yoki ID tokenini ko'rmaydi
  • SSO dan RPgacha
  • Ko'p kirish tokenlarini yoki ko'p qirrali kirish tokenlarini oling.
  • Access Token yordamida API Provayderiga (Resurs Server) qo'ng'iroq qilish.
SSO va API qo'ng'iroqlari bilan avtorizatsiya kodi oqimi (javob_tip = kod)

Yuqoridagi diagrammadagi qadamlar keyingi Iste'molchi veb-sayt manzilini veb-brauzerga yoki shunga o'xshash amalni kiritish orqali dasturga kirish jarayonini boshlaydi - diagrammada ko'rsatilmagan. Keyin brauzer (foydalanuvchi agenti) so'rovni yuboradigan RP-ga so'rov yuboradi va u tasdiqlangan seansning bir qismi emasligini ko'radi, shuningdek diagrammada ko'rsatilmagan (spetsifikatsiya bu qismni qamrab olmaydi).

Haqiqiylikni tekshirish talabi

RP foydalanuvchi agentini OpenID Provayderiga yo'naltiradi (OP) - qadam (A). Olingan so'rov quyidagicha ko'rinadi.

GET / oidc / avtorizatsiya qilinsinmi?
 javob_type = kod
 & miqyosi = ochiq% 20profile% 20 elektron pochta
 & client_id = s6BhdRkqt3
 & holat = af0ifjsldkj
 & qayta yo'naltirish_uri = https% 3A% 2F% 2Fclient.example.org% 2Fcb HTTP / 1.1
 Xost: server.example.com

OP foydalanuvchi agentini OP-step (B) tomonidan boshqariladigan kirish jarayoniga yo'naltiradi. Autentifikatsiya qanday ishlashi tafsilotlari OIDC spetsifikatsiyalariga kirmaydi. Biz OIDC autentifikatsiya protokoli deb nomladik, lekin foydalanuvchi qanday autentifikatsiya qilinganligini aniqlamaydi. Bu SAML2 veb-brauzerining SSO Profili qanday ishlashidan farq qilmaydi - foydalanuvchining haqiqiy autentifikatsiyasi identifikator provayderining imkoniyatlariga bog'liq bo'lgan turli xil mexanizmlar bo'lishi mumkin. Autentifikatsiya ishining oqimi oxirgi foydalanuvchiga tegishli bo'lgan resurslar bo'yicha RPga rozilik berishga imkon beradigan tekshirishni o'z ichiga olishi mumkin (Resurs bo'yicha RPga berilgan vakolatli kirish).

Muvaffaqiyatli autentifikatsiya javobi

Muvaffaqiyatli autentifikatsiyadan so'ng, OP foydalanuvchini sessiyani kuzatish ma'lumotlari to'plami bilan avtorizatsiyalashning so'nggi nuqtasiga yo'naltiradi (seans cookie shaklida, amalga oshirishga bog'liq). Avtorizatsiya qilishning so'nggi nuqtasi HTTP yo'naltirishni (Avtorizatsiya kodi bilan) quyidagi bosqichga (C) o'xshash narsaga o'xshash RP URL manziliga qaytaradi:

HTTP / 1.1 302 topildi
 Manzil: https://client.example.org/cb?
 kod = SplxlOBeZQQYbYS6WxSbIA
 & holat = af0ifjsldkj

Natijada, Agent Agenti RPga quyidagi so'rovni yuboradi:

Https://client.example.org/cb oling?
 kod = SplxlOBeZQQYbYS6WxSbIA
 & holat = af0ifjsldkj

Haqiqiylikni tekshirishda xato

Agar autentifikatsiya qilish va tasdiqlash bosqichida xatolik yuz bersa (yoki avtorizatsiya kodini qaytarishga olib keladigan boshqa biron bir narsa), Authorization Endpoint quyidagiga o'xshash xatoni qaytaradi:

HTTP / 1.1 302 topildi
  Manzil: https://client.example.org/cb?
    error = invalid_request
    & error_description =
      Qo'llab-quvvatlanmaydigan% 20response_type% 20 qiymat
    & holat = af0ifjsldkj

Token so'rovi

Ayni paytda, RP avtorizatsiya kodini oxirgi foydalanuvchi parolini (yoki boshqa hisobga olish ma'lumotlarini) ko'rmasdan oldi. Endi RP kirish tokenini, identifikator tokenini va boshqa ma'lumotlarni tokenning so'nggi nuqtasidan olishlari kerak. Shunday qilib, RP tokenning oxirgi nuqtasiga (D) quyidagi so'rov kabi narsani yuboradi:

POST / oidc / token HTTP / 1.1
 Xost: server.example.com
 Tarkib turi: application / x-www-form-urlencoded
 grant_type = avtorizatsiya_ kodi &
 kod = SplxlOBeZQQYbYS6WxSbIA &
 yo'naltirish_uri = https% 3A% 2F% 2Fclient.example.org% 2Fcb &
 client_id = s6BhdRkqt3 &
 mijoz_secret = blah_blah_blah_1234

Mijoz_secret parametri, agar RP maxfiy mijoz bo'lsa, mavjud bo'lishi kerak (umumiy OAuth2 Avtorizatsiya Kodi Grantidagi kabi). OIDC spetsifikatsiyasining 9-bo'limida tavsiflangan Token Endpoint-ga RP-ni tasdiqlashning alternativ usullari mavjud; OAuth2 spec Basic Authentication-ni ham qo'llab-quvvatlaydi (afzal qilingan usul).

Tokenga javob

Mualliflik kodi oqimi uchun belgi oxirgi nuqtadan javob quyidagi kabi ko'rinadi - qadam (E).

HTTP / 1.1 200 OK
 Tarkib turi: dastur / json
 Keshni boshqarish: do'kon yo'q
 Pragma: kesh yo'q
 {
 "Access_token": "SlAV32hkKG",
 "Token_type": "Yetkazib beruvchi",
 "Yangilash_token": "8xLOxBtZp8",
 "Expires_in": 3600,
 "Id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc
 yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5
 NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ
 fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz
 AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q
 Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ
 NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd
 QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS
 K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4
 XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg ”
 }

Tokenlarni tekshirish

Endi ID Token (yuqoridagi id_token mulki) OIDC (F) bosqichining 3.1.3.7 bo'limiga muvofiq tasdiqlanishi kerak - bu qismni o'tkazib yubormang, bu xavfsizlikka zarar etkazadi. Ushbu autentifikatsiya qilish oqimi uchun, ID Token-da at_hash (Access Token hash) xususiyati mavjud bo'lib, undan kirish tokenini tekshirish uchun foydalanish mumkin; bu ixtiyoriy, ammo tavsiya etilgan - qadam (G).

OIDC stsenariylarida, RP ustidagi autentifikatsiya bosqichlarida ID Token ishlatiladi va Kirish Token uchun foydalaniladi

  • ixtiyoriy ravishda UserInfo Endpoint-dan ma'lumot olish
  • Resurs serveriga qo'ng'iroq qilish (bizning misolimizda API Provayderi)

Bu OAuth2 qanday ishlashidan juda farq qiladi.

Token doirasiga kirish

Endi, agar kirish tokenida auditoriya tushunchasi bo'lsa (noaniq tokenlar bilan bog'liq bo'lmasligi mumkin), unda (ehtimol senariyga bog'liq holda) noyob kirish tokenlari RP tomonidan UserInfo Endpoint-ga kirish uchun kerak bo'lishi mumkin. va Resurs Serveriga kirish. Agar shunday bo'lsa, Token Endpoint-ga ikkinchi qo'ng'iroqni xuddi shu avtorizatsiya kodi bilan Resurs Server auditoriyasi bilan ikkinchi kirish tokenini so'rash mumkin, agar OP shunday kirishga ruxsat berilgan deb taxmin qilinsa. Boshqa potentsial yondoshish ko'p sonli auditoriyani qo'llab-quvvatlaydigan kengaytirilgan Access Token-dan foydalanishdir - JWT bunga imkon beradi - ammo sizning OPingiz uni qo'llab-quvvatlashi kerak va sizning xavfsizlik belgilaringiz bilan qiziqarli narsalarni amalga oshiradigan aktyorlar soni ko'payishi mumkin (va potentsial xavfsizlik masalalari). Shunday qilib, ortib borayotgan xavf).

Keyinchalik, agar RP qo'shimcha da'volarni talab qilsa, ularni oldindan aytib o'tilganidek - H (H) va (I) bosqichlarini olish uchun OPning UserInfo Endpoint-ga murojaat qilishi mumkin. Shunisi qiziqki, RPda identifikator Token bor va unda UserInfo Endpoint tomonidan qaytarilishi mumkin bo'lgan har qanday da'vo bo'lishi mumkin. Ammo, OP sotuvchilari ushbu xususiyatning moslashuvchanligini cheklashlari mumkin.

Resurs serveriga qo'ng'iroq qilish

Keyingi bosqichda (J) o'rganganimizdek, RP Resurs serveridagi Resursga kirishga ruxsat bering (uni API provayderi orqali API deb ataymiz), Avtorizatsiya sarlavhasida kirish token bilan API-ga qo'ng'iroq qilish orqali. OAuth2-ni tushunishda, kirish tokenini JWT token deb taxmin qilishdi; JWT spektri resurslar serverida (API Provayderi) kirish tokenini qanday tekshirishni belgilaydi. Agar kirish tokeni noaniq token bo'lsa, u holda Resurs serveri aniqlanmagan (va ehtimol amalga oshirishga bog'liq) mexanizmlardan foydalangan holda OP bilan aloqa o'rnatishi kerak. 2015 yil oktyabr oyida OAuth 2.0 Token Introspection (RFC 7662) nashr qilindi, unda "himoyalangan manbani so'rash usulini belgilaydi.
 faol holatini aniqlash uchun OAuth 2.0 avtorizatsiya serveri
 OAuth 2.0 token va ushbu token haqida meta-ma'lumotni aniqlash. "Asosan, u tokenni tasdiqlashi va u to'g'risida ma'lumot olishiga imkon beruvchi Avtorizatsiya Serverining so'nggi nuqtasini belgilaydi (Token Introspection Endpoint). OIDC UserInfo Endpoint va ushbu yangi so'nggi nuqta o'rtasida ba'zi bir kelishmovchilik mavjud, ammo OAuth2 Token Introspection Endpoint noaniq kirish tokenini tekshirish imkoniyatini beradi (ammo bu uning asosiy maqsadi emas). Biroq, kirish tokeni tasdiqlangan, so'rovni qayta ishlash Resurs Serverida (API Provayderi) - Step (K) da davom etgunga qadar bajarilishi kerak.

Va nihoyat, Resurs Server foydalanuvchi identifikatori tokenini oxirgi kirish uchun tegishli (va ruxsat berilgan) da'volar bilan (L) va (M) qadamlar bilan olish uchun UserInfo so'nggi nuqtasiga yuborishi mumkin. API so'rovini qayta ishlash davom ettirilishi mumkin va javob RPga qaytarilishi mumkin (ushbu stsenariyda API iste'molchisi sifatida ishlaydi).

Biz hozirgina boshdan kechirgan xuddi shu stsenariy quyidagi tartib diagrammasida tasvirlangan.

Xulosa

Shu bilan OIDC avtorizatsiya kodini berish autentifikatsiya qilish oqimini ko'rib chiqamiz.

Keyingi xabarda biz oxirgi ikkita autentifikatsiya oqimlarini o'rganamiz: noaniq oqim va gibrid oqim.

Iltimos, quyida savol yoki izoh qoldiring.