最近在看了一点oidc
相关的协议内容,想以此来做单点登录。但看了协议,还有好多不太明白的地方。
oidc
相比oauth2
来说, 多了一个id_token
,用于身份认证,而本身oauth2
部分的又有access_token
及refresh_token
,access_token
是用于保护资源的,refresh_token
是用于刷新access_token
的.
那举个简单的使用场景:
一个平台,有以下几个服务,
统一身份认证的服务identify
(基于oidc
协议实现的idp
)
服务 A(a.com)
服务 B(b.com)
那在 oidc 体系中,a.com
, b.com
实际上是两个应用(client)
正常的流程就是:
a.com
判断本地是否有token
(基于localstorage
是否有相关的存储),
如果有,则每次正常请求携带token
,
如果没有,则携带 client 信息(client_id,redirct_uri,scope 等)跳转至identify
服务的登录页面,
identify
服务会对用户的用户名密码认证,认证成功后跳转至a.com/callback?code=xxxxx&state=xxx
a.com
根据code
码获取到id_token
,access_token
和refresh_token
那么有以下疑问:
问题 1: 前端中header
头上使用的authorization
是塞id_token
还是access_token
? 按照定义,应该是id_token
吧。
那access_token
的作用是不是如果我的资源只是限定有没有登录,登录就可以访问所有的资源(api 的鉴权有另外的鉴权服务),那其实access_token
在这种场景下就没有意义?
问题 2:refresh_token
的作用是用来刷新id_token
还是access_token
? 因为refresh_token
, access_token
是 oauth2 就有的概念,最开始 refresh_token 肯定是刷 access_token 的,
那如果使用id_token
,因为 jwt 的签发后无法回收,id_token
理论上也是时效设置成比较短的一个时长,那这样必然是需要 refresh_token 去保证自动时长续期,所以可以使用返回的 refresh_token 值去
刷新 id_token 么?
问题 3:在多应用场景的单点登录下,比如a.com
按照以上流程登录了,那理论上在同一个浏览器下,访问b.com
应该也是登录状态的。那这个登录状态是怎么判断呢?b.com
的本地存储里肯定是没有存储 id_token 的。
那此时,是不是在a.com
登录的时候,登录成功其实就应该在identify
的前端的localstorage
里存储id_token
?那这样问题又来了,刷新token
了怎么办? 刷新 token 一般在应用端发起,
但又影响不到identify
服务的前端存储. 没有想到比较完美的闭环
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.