如何在我的SPA加载过程中validation和更新JWT id_token?
我对OAuth 2.0
和OpenID Connect
相当OAuth 2.0
,而且我无法理解stream程的某些部分(或者我应该使用哪些最佳实践)…
对不起,冗长的职位:)
我的设置:
-
OP
(OpenID提供者),基本上是使用oauth2orize-openid
和passport
来authentication和授权用户的express
服务器。 我们称之为http://authserver.com
-
Single page application
(react + webpack)需要根据我的OP
对用户进行身份validation,我们称之为http://my-spa.com
由于它是一个SPA(静态的webpack服务),我不得不使用Implicit Flow
。
我的问题
一旦用户导航到http://my-spa.com
,应用程序被加载,然后检查localStorage
是否存在id_token
。
id_token
在localStorage
没有id_token
:
- 由于没有令牌,我redirect到
http://authserver.com/dialog/authorize
-
response_type=id_token
-
scope=openid profile
-
- 一旦用户成功通过身份validation和授权,
authserver
使用URI片段中的id_token
redirect到my-spa
- 我将
id_token
存储在localStorage
,用户可以开始使用该应用程序。
加载时在localStorage
有一个id_token
用户closures浏览器并再次打开。 这是我不知所措的地方。 由于已经有一个令牌(来自以前的login),我需要检查它是否有效。
有什么最好的做法呢? 以下是我认为是正确的:
- redirect到
http://authserver.com/dialog/authorize
使用:-
prompt=none
-
id_token_hint=CURRENT_TOKEN
-
- 一旦
OP
收到这个请求,它应该validationJWT签名,尝试自动批准用户,并重新引导一个新的JWT。
令牌get在一段时间后过期
假设一个login用户的JWT过期了,应该什么时候请求一个新的? 什么应该引发更新?
什么是/tokeninfo
或/userinfo
?
据我了解,JWT存储了识别用户所需的全部数据。 不过,我见过的例子调用/tokeninfo
或/userinfo
。
如果我已经有sub
标识,这些端点只是为了validation标记(假设我只需要标识的标识)。
智威汤逊签名validation
除OP
, my-spa
是否应该validationJWT签名(可能是公钥)?
重新使用此令牌访问第三个服务的REST API
如果我有另一个Web服务api,请将其称为http://my-service.com/api
,它需要知道哪个用户从我的SPA中调用它,这些是我相信我需要执行的步骤:
- 将
id_token
添加为每个ajax请求的不Bearer
令牌 -
my-service.com
应该validationJWT签名(使用公共密钥?)并决定是允许还是拒绝对受保护资源的访问
任何帮助将不胜感激!
你的问题很大,我会尝试回答所有标记的短语?
以一种通用的方式(不考虑你使用的具体框架)
加载时在localStorage中有一个id_token。
用户closures浏览器并再次打开。 有什么最好的做法呢?
你可以select乐观,继续使用令牌,或悲观,并要求一个新的。
-
如果到期时间足够长, 继续使用令牌 。 我假设在每个请求中都会validation令牌,所以如果令牌无效,您将收到一个401,您可以请求一个新的令牌
-
如果过期很短,或者您想在浏览器打开您的应用程序时要求新的用户身份validation, 请求一个新的令牌 。 如果您想检查JWT是否仍然有效,那么使用auth服务器进行redirect对于SPA来说不是用户友好的。 我build议执行一个AJAX调用来validation和请求一个新的令牌。
令牌get在一段时间后过期
这是我上面解释的第一个案例。 您可以防止它在每个请求上发出一个新的令牌,或者在一段固定的时间(例如1小时)之后
什么是/ tokeninfo或/用户信息?
我不知道这些服务,但是可以推断它们的含义。 JWT已签名,因此您可以信任所包含的数据(签名仍然有效时)
JWT签名validation,在OP旁边,my-spa是否应该validationJWT签名(可能是公钥)?
您必须validation每个请求的签名。 如果使用对称密钥(即HMAC),则使用相同的密钥对JWT进行签名和validation。 使用非对称密钥(RSA),JWT使用私钥进行签名并使用公钥进行validation
重新使用此令牌访问第三个服务的REST API
将id_token添加为每个ajax请求的无记号令牌,
正确,通常使用授权标题
my-service.com应该validationJWT签名(使用公共密钥?)并决定是允许还是拒绝对受保护资源的访问
当然,任何使用JWT的服务都必须validation签名。 外部服务不拥有私钥,因此在这种情况下需要使用不对称密钥。 您需要发布公钥,以便外部服务可以validation令牌