我很陌生OAuth 2.0
,OpenID Connect
而且我很难理解流程的某些部分(或者我应该使用哪些最佳实践)......
很抱歉这篇冗长的帖子:)
我的设置:
一个
OP
(OpenID 提供者),它基本上是一个express
使用oauth2orize-openid
并passport
验证和授权用户的服务器。让我们称之为http://authserver.com
一个
Single page application
(react+webpack)需要针对 my 对用户进行身份验证OP
,我们称之为http://my-spa.com
因为它是一个 SPA(由 webpack 静态提供),所以我必须使用Implicit Flow
.
我的问题
一旦用户导航到http://my-spa.com
,应用程序被加载,然后它检查localStorage
是否id_token
存在。
没有id_token
加载localStorage
:
- 由于没有令牌,我重定向到
http://authserver.com/dialog/authorize
response_type=id_token
scope=openid profile
- 用户成功认证和授权后,使用URI 片段中的
authserver
重定向回my-spa
id_token
- 我将其存储在
id_token
中localStorage
,用户可以开始使用该应用程序。
有负载id_token
_localStorage
用户关闭浏览器并再次打开。这是我很难理解该怎么做的地方。由于已经有一个令牌(来自以前的登录),我需要检查它是否有效。
这样做的最佳做法是什么?这是我认为正确的:
- 重定向到
http://authserver.com/dialog/authorize
使用:prompt=none
id_token_hint=CURRENT_TOKEN
- 一旦
OP
收到此请求,它应该验证 JWT 签名,尝试自动批准用户并使用新的 JWT 重定向回来。
令牌在一段时间后过期
假设一个登录用户的 JWT 过期了,它什么时候应该要求一个新的?什么应该触发更新?
/tokeninfo
或者是为了什么/userinfo
?
据我了解,JWT 存储了识别用户所需的所有数据。但是,我已经看到了调用/tokeninfo
or的示例/userinfo
。
如果我已经有了sub
id,这些端点是否只是用于验证令牌(假设我只需要主题的 id)?
JWT 签名验证
除了OP
, 是否应该my-spa
验证 JWT 签名(可能使用公钥)?
重新使用此令牌来访问第三个服务的 REST API
如果我有另一个 Web 服务 api,调用它http://my-service.com/api
需要知道哪个用户从我的 SPA 调用它,这些是我认为我需要执行的步骤:
- 将
id_token
作为Bearer
令牌添加到每个 ajax 请求 my-service.com
应该验证 JWT 签名(使用公钥?)并决定是允许还是拒绝访问受保护的资源
任何帮助将不胜感激!