3

我很陌生OAuth 2.0OpenID Connect而且我很难理解流程的某些部分(或者我应该使用哪些最佳实践)......

很抱歉这篇冗长的帖子:)

我的设置:

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

  2. 一个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

  1. 由于没有令牌,我重定向到http://authserver.com/dialog/authorize
    • response_type=id_token
    • scope=openid profile
  2. 用户成功认证和授权后,使用URI 片段中的authserver重定向回my-spaid_token
  3. 我将其存储在id_tokenlocalStorage,用户可以开始使用该应用程序。

有负载id_token_localStorage

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

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

  1. 重定向到http://authserver.com/dialog/authorize使用:
    • prompt=none
    • id_token_hint=CURRENT_TOKEN
  2. 一旦OP收到此请求,它应该验证 JWT 签名,尝试自动批准用户并使用新的 JWT 重定向回来。

令牌在一段时间后过期

假设一个登录用户的 JWT 过期了,它什么时候应该要求一个新的?什么应该触发更新?

/tokeninfo或者是为了什么/userinfo

据我了解,JWT 存储了识别用户所需的所有数据。但是,我已经看到了调用/tokeninfoor的示例/userinfo

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

JWT 签名验证

除了OP, 是否应该my-spa验证 JWT 签名(可能使用公钥)?

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

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

  1. id_token作为Bearer令牌添加到每个 ajax 请求
  2. my-service.com应该验证 JWT 签名(使用公钥?)并决定是允许还是拒绝访问受保护的资源

任何帮助将不胜感激!

4

1 回答 1

3

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

加载时 localStorage 中有一个 id_token。

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

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

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

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

令牌在一段时间后过期

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

/tokeninfo 或 /userinfo 有什么用?

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

JWT 签名验证,除了 OP,my-spa 是否应该验证 JWT 签名(可能使用公钥)?

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

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

将 id_token 作为 Bearer 令牌添加到每个 ajax 请求,

正确,通常使用 Authorization 标头

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

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

于 2017-01-06T22:04:52.633 回答