0

我一直在深入研究 OAuth2 / OpenID Connect(OIDC),在很多方面我都觉得自己更聪明,但在很多方面,我担心一个简单的错误会让我变得脆弱。我正在构建超标准的商业应用程序。所以是时候问路了:

  • 平台:Pivotal Cloud Foundry / UAA
  • 后端:Spring Boot 1.5.x(但现在看 2.0)
  • 前端:反应 SPA
  • OAuth2:授权代码授权与openid范围

我得到id_token, access_token, 和refresh_token

我有一百万个问题,但让我们从基础开始:

  1. 可以接受id_token并将其发送到浏览器中的反应代码并将其存储在会话存储中吗?否则,UI 究竟应该如何知道有关登录者的信息?

  2. 如果我有id_token,我还关心/userinfo端点吗?我的猜测是否定的。

  3. 每次 UI 调用 api 时,它都会传递身份验证代码?spring 代码是否会依次调用/oauth/token每次?Spring 代码是否应该(或是否)缓存 auth 代码和返回的令牌之间的关系?

4

2 回答 2

2

您只要求openid范围,那么为什么需要访问权限和刷新令牌?而且由于您希望 React 应用程序使用 ID 令牌,我建议您使用隐式流程 - 将 ID 令牌直接获取到您的前端。

  1. 您可以将令牌保留在 SessionStorage 中。
  2. ID 令牌可能包含您需要的所有信息,因此如果/userinfo端点没有提供您想要的任何其他信息,您可以忽略它。
  3. 出于安全原因,验证码只能使用一次。所以拿到token之后再保留也没有意义。如果您想保持后端 API 无状态(无会话),您可以使用访问令牌。然后最好有可能在身份验证服务器上配置特定于后端的范围,或者仅使用/userinfo端点来获取有关用户的信息。或者,如果您想将前端和后端视为一个 OAuth2 客户端(相同的 ID 令牌受众),并且您在后端只需要用户身份,则可以使用 ID 令牌。
于 2018-03-05T08:12:38.377 回答
0

SPA 的推荐流程是有意义implicit的,并且在实践中使用该oidc-client-js库是有意义的。在此流程中,access_token无需额外的授权代码步骤即可将其直接返回给客户端。没有refresh_token发出。

access_token在此拓扑中,令牌存储在客户端的 sessionStorage 中(默认情况下,但这是可插入的),并且您通过传递Authorization 标头(通常)向后端发出请求。令牌更新不是通过刷新令牌完成的,而是通过后台静默授权端点调用自动完成的。这种方法的缺点是,如果您的应用程序被 XSS 入侵,那么攻击者可以立即使用您的令牌。

但是,如果您更喜欢使用服务器端流程(与表单发布响应类型混合)和(仅限 https)cookie 身份验证,那么您可以。客户端代码只需要实现某种 CSRF 缓解措施,但根本不需要了解 OpenID Connect 问题。

于 2018-03-05T15:32:45.143 回答