OpenID Connect认证流程
本文使用最常用的Authorization Code的Code认证方式,IdP采用ZITADEL
首先依赖方会要求提供discovery endpoint
,具体地址由IdP提供,一般为{idp_domain}/.well-known/openid-configuration
,该链接包含认证所需的很多endpoint。
然后在授权服务器注册应用,注册完成后会得到Client ID
与Client Secret
,注册时填写的callback地址由依赖方提供,用于用户完成授权后客户端调用callback地址传递授权码。
认证流程
重定向授权页面
由依赖方在登录页面发起授权请求
1 | {idp_domain}/oauth/v2/authorize |
其中CLIENT_ID
为注册应用时获得的Client ID,REDIRECT_URI
为注册应用时填写的callback地址,SCOPE
为授权范围,具体范围需要参考IdP,在discovery endpoint
中scopes_supported
也可以看到可以申请的授权范围,STATE
为由依赖方产生的随机值,用于防止CSRF攻击,在授权完成调用callback地址时会附加在链接中,便于依赖方校对。
重定向callback地址
用户授权完成后重定向至callback url
1 | {callback_url} |
其中CODE
为授权码,STATE
与上文一致
请求Access Token
依赖方后端收到授权码,校验state后向token endpoint
请求Access Token
后端构建Authorization头:
1 | Authorization: "Basic " + base64( formUrlEncode(client_id) + ":" + formUrlEncode(client_secret) ) |
1 | {idp_domain}/oauth/v2/token |
CODE
,REDIRECT_URI
,SCOPE
同上文一致
返回如下Json:
1 | { |
ZITADELrefresh_token
需要在scope内添加offline_access
,否则返回内容不会有refresh_token
ZITADELid_token
默认不会含有email,profile之类的信息(即使scope已声明),需要在应用设置,令牌设置内勾选在 ID Token 中包含用户信息
,或者直接向userinfo_endpoint
请求用户信息。
获取用户信息
后端向userinfo_endpoint
请求用户信息
1 | {idp_domain}/oidc/v1/userinfo |
其中ACCESS_TOKEN
为上文拿到的Access Token
返回如下Json
不同IdP可能不一样
1 | { |
Use this card to join MyBlog and participate in a pleasant discussion together .
Welcome to GoodBoyboy 's Blog,wish you a nice day .