Azure AD B2C 使用 PHP 验证 JWT

Posted

技术标签:

【中文标题】Azure AD B2C 使用 PHP 验证 JWT【英文标题】:Azure AD B2C Validate JWT with PHP 【发布时间】:2017-09-25 20:02:34 【问题描述】:

警告:我完全是 JWT 新手,并试图弄清楚这一切。

首先...我的理解是: JWT 包含由. 分隔的三个段。第一部分可以进行 base64 解码以获得“某些东西”,我可以在其中验证第二个(和第三个?)段中的声明。

我能够取回id_token,并且可以将每个段分成其各自的 JSON 对象...但这根本不安全 :)

我查看了这个https://github.com/firebase/php-jwt,但我不确定我需要提供什么 KEY 来解码 JWT(我知道我可以解码第一段并获得用于 JWT 的 kid,但是当我拥有它时具体的key 对象...我不确定要传递给firebase 来解码什么?https://login.microsoftonline.com/fabrikamb2c.onmicrosoft.com/discovery/v2.0/keys?p=b2c_1_sign_in

请原谅我对 JWT 的糟糕理解:/

编辑:更多信息

使用此 ID TOKEN: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IklkVG9rZW5TaWduaW5nS2V5Q29udGFpbmVyIn0. eyJleHAiOjE0NDIzNjAwMzQsIm5iZiI6MTQ0MjM1NjQzNCwidmVyIjoiMS4wIiwiaXNzIjoiaHR0cHM6Ly9s b2dpbi5taWNyb3NvZnRvbmxpbmUuY29tLzc3NTUyN2ZmLTlhMzctNDMwNy04YjNkLWNjMzExZjU4ZDkyNS92 Mi4wLyIsImFjciI6ImIyY18xX3NpZ25faW5fc3RvY2siLCJzdWIiOiJOb3Qgc3VwcG9ydGVkIGN1cnJlbnRs eS4gVXNlIG9pZCBjbGFpbS4iLCJhdWQiOiI5MGMwZmU2My1iY2YyLTQ0ZDUtOGZiNy1iOGJiYzBiMjlkYzYi LCJpYXQiOjE0NDIzNTY0MzQsImF1dGhfdGltZSI6MTQ0MjM1NjQzNCwiaWRwIjoiZmFjZWJvb2suY29tIn0. h-uiKcrT882pSKUtWCpj-_3b3vPs3bOWsESAhPMrL-iIIacKc6_uZrWxaWvIYkLra5czBcGKWrYwrAC8ZvQe DJWZ50WXQrZYODEW1OUwzaD_I1f1HE0c2uvaWdGXBpDEVdsD3ExKaFlKGjFR2V7F-fPThkVDdKmkUDQX3bVc yyj2V2nlCQ9jd7aGnokTPfLfpOjuIrTsAdPcGpe5hfSEuwYDmqOJjGs9Jp1f-eSNEiCDQOaTBSvr479L5ptP XWeQZyX2SypN05Rjr05bjZh3j70ZUimiocfJzjibeoDCaQTz907yAg91WYuFOrQxb-5BaUoR7K-O7vxr2M-_ CQhoFA

我可以将标题段eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IklkVG9rZW5TaWduaW5nS2V5Q29udGFpbmVyIn0解码为"typ":"JWT","alg":"RS256","kid":"IdTokenSigningKeyContainer"

然后看https://login.microsoftonline.com/fabrikamb2c.onmicrosoft.com/discovery/v2.0/keys?p=b2c_1_sign_in

我知道这个关键对象被使用了

"kid":"IdTokenSigningKeyContainer","use":"sig","kty":"RSA","e":"AQAB","n":"tLDZVZ2Eq_DFwNp24yeSq_Ha0MYbYOJs_WXIgVxQGabu5cZ9561OUtYWdB6xXXZLaZxFG02P5U2rC_CT1r0lPfC_KHYrviJ5Y_Ekif7iFV_1omLAiRksQziwA1i-hND32N5kxwEGNmZViVjWMBZ43wbIdWss4IMhrJy1WNQ07Fqp1Ee6o7QM1hTBve7bbkJkUAfjtC7mwIWqZdWoYIWBTZRXvhMgs_Aeb_pnDekosqDoWQ5aMklk3NvaaBBESqlRAJZUUf5WDFoJh7yRELOFF4lWJxtArTEiQPWVTX6PCs0klVPU6SRQqrtc4kKLCp1AC5EJqPYRGiEJpSz2nUhmAQ"

那么...我会将什么值传递给 firebase?

【问题讨论】:

请从这里开始:github.com/Azure-Samples/… 谢谢!我能够从该存储库中解析出一些逻辑/功能,并在我的 Firebase 和 LibSec 实例中使用它,现在有了一个可行的解决方案:) 【参考方案1】:

以防万一有人想快速起床和/或像我一样感到困惑;我可以推荐问题评论中指出的链接@astaykov

https://github.com/Azure-Samples/active-directory-b2c-php-webapp-openidconnect

连同我为授权代码授予创建的一个简单类(处理获取 SSO URL、OAuth2 令牌和使用外部库验证 id_token)

https://gist.github.com/rcosgrave/ec92938181096fd8847a38c9cc6a37d0

【讨论】:

请接受您自己的答案,以便其他人从中受益。谢谢

以上是关于Azure AD B2C 使用 PHP 验证 JWT的主要内容,如果未能解决你的问题,请参考以下文章

azure 应用服务身份验证模块是不是支持 azure ad b2c?

使用 Azure AD B2C 作为服务进行身份验证

Azure AD B2C 受众验证失败

使用 azure AD B2C 进行 blazor web api 身份验证

Azure AD B2C 错误 - IDX10501:签名验证失败

如何使用 Azure AD B2C 保护 Blazor Wasm 应用访问的 Azure 函数?