如何在我的SPA加载过程中validation和更新JWT id_token?

我对OAuth 2.0OpenID Connect相当OAuth 2.0 ,而且我无法理解stream程的某些部分(或者我应该使用哪些最佳实践)…

对不起,冗长的职位:)

我的设置:

  1. OP (OpenID提供者),基本上是使用oauth2orize-openidpassport来authentication和授权用户的express服务器。 我们称之为http://authserver.com

  2. Single page application (react + webpack)需要根据我的OP对用户进行身份validation,我们称之为http://my-spa.com

由于它是一个SPA(静态的webpack服务),我不得不使用Implicit Flow

我的问题

一旦用户导航到http://my-spa.com ,应用程序被加载,然后检查localStorage是否存在id_token

id_tokenlocalStorage没有id_token

  1. 由于没有令牌,我redirect到http://authserver.com/dialog/authorize
    • response_type=id_token
    • scope=openid profile
  2. 一旦用户成功通过身份validation和授权, authserver使用URI片段中的id_tokenredirect到my-spa
  3. 我将id_token存储在localStorage ,用户可以开始使用该应用程序。

加载时在localStorage有一个id_token

用户closures浏览器并再次打开。 这是我不知所措的地方。 由于已经有一个令牌(来自以前的login),我需要检查它是否有效。

有什么最好的做法呢? 以下是我认为是正确的:

  1. redirect到http://authserver.com/dialog/authorize使用:
    • prompt=none
    • id_token_hint=CURRENT_TOKEN
  2. 一旦OP收到这个请求,它应该validationJWT签名,尝试自动批准用户,并重新引导一个新的JWT。

令牌get在一段时间后过期

假设一个login用户的JWT过期了,应该什么时候请求一个新的? 什么应该引发更新?

什么是/tokeninfo/userinfo

据我了解,JWT存储了识别用户所需的全部数据。 不过,我见过的例子调用/tokeninfo/userinfo

如果我已经有sub标识,这些端点只是为了validation标记(假设我只需要标识的标识)。

智威汤逊签名validation

OPmy-spa是否应该validationJWT签名(可能是公钥)?

重新使用此令牌访问第三个服务的REST API

如果我有另一个Web服务api,请将其称为http://my-service.com/api ,它需要知道哪个用户从我的SPA中调用它,这些是我相信我需要执行的步骤:

  1. id_token添加为每个ajax请求的不Bearer令牌
  2. 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令牌