Id TokenId Token是OIDC的特有概念,它是一个包含用户信息(claims)的JWT令牌,如下所示:
eyJ4NXQjUzI1NiI6IlN4cXFkV1l4VDdCWnJkSC11VnBnQUhmWDJxMzRxUHl4eDRvblg2bXYtcUkiLCJraWQiOiJqb3NlIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJ1c2VyIiwiYXVkIjoiZTJmYTdlNjQtMjQ5Yi00NmYwLWFlMWQtNzk3NjEwZTg4NjE1IiwiYXpwIjoiZTJmYTdlNjQtMjQ5Yi00NmYwLWFlMWQtNzk3NjEwZTg4NjE1IiwiaXNzIjoiaHR0cDpcL1wvbG9jYWxob3N0OjkwMDAiLCJleHAiOjE2NTM2MjUxMjgsImlhdCI6MTY1MzYyMzMyOCwibm9uY2UiOiJXNm5LeTlxZnFWMkRvSDN1TDVGVGNVOUVGR2k4dWlqay1lcDIyV3RGQ2NZIn0.VDBOF867LnQIB52XGkSMT6hAu0NpyJsPA3soIAt3WWb4dwDmdiMrq5xpRuewURknmBmhZaJHT2QETEFWGhwB5gnq4kw4yPlvOpUuKxqfPsr9plA0HV_mQF9WFearRmVI12hGBrgj0Htgf4I5K6Nz8c4K0ibrdmcHSwonrb856TVep0Ne1cr21tOcmYmptgGco_vNsKvPsua0Hxff56_ikGDYonY5y7q6leFP5F9LAKUgRjPdhXM6OzdpHfP8XkiiPor9A1WWW0VhxmxCGe7dfQF_0QFYtmWnAymSS1PExUz4KdKGjPKtPanZe6ufym-5-ErSc-kH0mWi6AxvYt_5VQ
我们对头部和负载两个部分进行解码看一看。
头部:
{
"x5t#S256": "SxqqdWYxT7BZrdH-uVpgAHfX2q34qPyxx4onX6mv-qI",
"kid": "felord.cn",
"alg": "RS256"}
头部包含了常规的JWT Header信息,符合JOSE规范。
负载:
{
"sub": "user",
"aud": "e2fa7e64-249b-46f0-ae1d-797610e88615",
"azp": "e2fa7e64-249b-46f0-ae1d-797610e88615",
"iss": "http://localhost:9000",
"exp": 1653625128,
"iat": 1653623328,
"nonce": "W6nKy9qfqV2DoH3uL5FTcU9EFGi8uijk-ep22WtFCcY"}
从上面看,负载包含了一系列的claim,它们的含义如图:
Id Token构成
如何进行OIDC认证
OIDC的认证流程主要是由OAuth2的几种授权流程扩展而来,有以下三种:
Authorization Code Flow 基于OAuth2授权码流程进行OIDC认证授权
Implicit Flow基于OAuth2隐匿流,由于OAuth2.1移除了隐匿流,所以这个应该也会被移除。
Hybrid Flow基于以上两者的混合流,也应该会被移除。
至于为什么没客户端凭据模式,是因为客户端凭据被设计用来做客户端之间的交互和End User根本没半毛钱关系。所以重点就是Authorization Code Flow。
Authorization Code Flow
关于授权码流,其实我觉得没有什么可多说的,如果你是OIDC Authorization Code Flow,你必须在请求中的scope
参数中携带openid
,授权服务器收到请求后会多返回一个EU的用户信息ID Token。流程上和OAuth2授权码流程完全一样。
❝请注意,OIDC必须使用JWT作为令牌风格。
用户信息端点
OIDC还提供用户信息端点,这个端点是一个资源端点。它的请求方式为:
GET /userinfo HTTP/1.1Host: localhost:9000Authorization: Bearer eyJ4NXQjUzI1NiI6IlN4cXFkV1l4VDdCWnJkSC11VnBnQUhmWDJxMzRxUHl4eDRvblg2bXYtcUkiLCJraWQiOiJqb3NlIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJ1c2VyIiwiYXVkIjoiZTJmYTdlNjQtMjQ5Yi00NmYwLWFlMWQtNzk3NjEwZTg4NjE1IiwibmJmIjoxNjUzNTQ2OTUwLCJzY29wZSI6WyJvcGVuaWQiLCJtZXNzYWdlLnJlYWQiLCJtZXNzYWdlLndyaXRlIl0sImlzcyI6Imh0dHA6XC9cL2xvY2FsaG9zdDo5MDAwIiwiZXhwIjoxNjUzNTQ3MjUwLCJpYXQiOjE2NTM1NDY5NTB9.MxySV9FwP3JVdThc7DkoROfseEPW1fRXRD1ljWN05keCzwaiAwvRap-QyA5gYJewpid7fOFwnD5ETDns3-ia_QHRYp5RIPWnc-cb__9_JITTpLso_AiXpwxCr6TxrKt5Ax_jzkL9_MGrHQl7BqUpCAecc_NccS4WAR6pmIiNexAMrXusn2a5VodFxv18BpgRv_dJ9w_a3tmYXBWAC1apSoXXlpaI96NIprXOUnJWyKGlYS1VsXc6YMYArDBOamvtFD74L9UaTLCj1n5GU1FKlTGE061c07eKFk91O9IgOc5YR0Uzu-VNhea0NB5SlwImhUJSE4Ab11RlJD_eg0Oc9g
也可以是POST请求。基本的返回值为:
HTTP/1.1 200 OK
Content-Type: application/json {
"sub": "felord.cn"
}
如果你还想返回比如邮箱地址、头像、昵称、真实姓名之类的用户信息,需要携带额外的scope
。
总结
OIDC还有很多东西,初学者掌握上面的基本功能即可,更多的功能需要参考OIDC官方文档[16]。OIDC的用途比原生的OAuth2更加广泛,它是一个完全开放的标准,兼容了其它的一些IDP协议。后续在合适的时机,我会在专栏中讲解如何运用这些协议。
专栏地址:
https://blog.csdn.net/qq_35067322/category_11691173.html
参考资料
[1]OIDC术语列表: http://openid.net/specs/openid-connect-core-1_0.html#Terminology
[2]Core: https://openid.net/specs/openid-connect-core-1_0.html
[3]Discovery: https://openid.net/specs/openid-connect-discovery-1_0.html
[4]Dynamic Registration: https://openid.net/specs/openid-connect-registration-1_0.html
[5]OAuth 2.0 Multiple Response Types: https://openid.net/specs/oauth-v2-multiple-response-types-1_0.html
[6]OAuth 2.0 Form Post Response Mode: https://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html
[7]RP-Initiated Logout: https://openid.net/specs/openid-connect-rpinitiated-1_0.html
[8]Session Management: http://openid.net/specs/openid-connect-session-1_0.html
[9]Front-Channel Logout: http://openid.net/specs/openid-connect-frontchannel-1_0.html
[10]Back-Channel Logout: http://openid.net/specs/openid-connect-backchannel-1_0.html
[11]OpenID Connect Federation: https://openid.net/specs/openid-connect-federation-1_0.html
[12]Initiating User Registration via OpenID Connect: https://openid.net/specs/openid-connect-prompt-create-1_0.html
[13]Basic Client Implementer’s Guide: https://openid.net/specs/openid-connect-basic-1_0.html
[14]Implicit Client Implementer’s Guide: https://openid.net/specs/openid-connect-implicit-1_0.html
[15]OpenID 2.0 to OpenID Connect Migration 1.0: https://openid.net/specs/openid-connect-migration-1_0.html
[16]OIDC官方文档: https://openid.net/developers/specs/
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/3908.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
打赏微信支付宝扫一扫,打赏作者吧~
休息一下~~