如何在SPA加载期间验证和续订JWT id_token?

时间:2017-01-05 09:29:16

标签: node.js jwt single-page-application openid-connect oauth2orize

我是OAuth 2.0OpenID Connect的新手,我无法理解流程的某些部分(或者我应该使用哪些最佳做法)......

对于冗长的帖子抱歉:)

我的设置:

  1. OP(OpenID提供程序),它基本上是express服务器,使用oauth2orize-openidpassport对用户进行身份验证和授权。我们称之为http://authserver.com

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

  3. 由于它是SPA(由webpack静态提供),我必须使用Implicit Flow

    我的问题

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

    加载id_token

    没有localStorage

    1. 由于没有令牌,我会重定向到http://authserver.com/dialog/authorize
      • response_type=id_token
      • scope=openid profile
    2. 用户成功通过身份验证并获得授权后,authserver会使用URI片段中的my-spa重定向回id_token
    3. 我将id_token存储在localStorage中,用户可以开始使用该应用。
    4. 加载时id_token中有localStorage

      用户关闭浏览器并再次打开它。 这是我无法理解该怎么做的地方。由于已经有一个令牌(从之前的登录),我需要检查它是否有效。

      这样做的最佳做法是什么?这是我认为是正确的:

      1. 使用以下方式重定向到http://authserver.com/dialog/authorize
        • prompt=none
        • id_token_hint=CURRENT_TOKEN
      2. 一旦OP收到此请求,它应该验证JWT签名,尝试自动批准用户并使用新的JWT重定向。
      3. 令牌在一段时间后过期

        让我们说一个登录用户让JWT过期,什么时候应该要求新的?什么应该触发更新?

        /tokeninfo/userinfo是什么?

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

        如果我已经拥有sub id,这些端点是否仅用于验证令牌(假设我只需要主题的ID)?

        JWT签名验证

        OP旁边,是否my-spa验证JWT签名(可能是公钥)?

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

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

        1. id_token添加为Bearer令牌到每个ajax请求
        2. my-service.com应该验证JWT签名(使用公钥吗?)并决定是允许还是拒绝访问受保护资源
        3. 我们将不胜感激任何帮助!

1 个答案:

答案 0 :(得分:3)

您的问题很大,我将尝试以通用方式回答所有标有?的短语(不考虑您使用的特定框架)

  

加载localStorage时会出现id_token。

     

用户关闭浏览器并再次打开它。这样做的最佳做法是什么?

您可以选择乐观并继续使用令牌,或悲观并请求新的令牌。

  • 如果到期时间足够长,请继续使用令牌。我假设在每个请求中都验证了令牌,因此如果令牌无效,您将收到401并且您可以申请新的

  • 请求新令牌如果到期时间很短,或者您希望在浏览器打开您的应用程序时需要新的用户身份验证。如果要检查JWT是否仍然有效,使用auth服务器的重定向对于SPA不是用户友好的。我建议执行一个AJAX调用来验证并请求一个新令牌。

  

令牌在一段时间后过期

这是我上面解释的第一个案例。您可以阻止它在每个请求上或在固定的时间段(即1小时)之后发布新令牌

  

什么是/ tokeninfo或/ userinfo?

我不知道这些服务,但可以推断出它们的含义。 JWT已签名,因此您可以信任所包含的数据(签名仍然有效)

  

JWT签名验证,   在OP旁边,my-spa应该验证JWT签名(可能是公钥)吗?

您必须验证每个请求的签名。如果使用对称密钥(即HMAC),JWT将使用相同的密钥进行签名和验证。使用非对称密钥(RSA),JWT使用私钥签名并使用公钥进行验证

  

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

     

将id_token作为承载令牌添加到每个ajax请求

正确,通常使用授权标题

  

my-service.com应验证JWT签名(使用公钥?)并决定是允许还是拒绝访问受保护资源

当然,任何使用JWT的服务都必须验证签名。外部服务不拥有私钥,因此在这种情况下需要使用不对称密钥。您需要发布公钥,以便外部服务可以验证令牌