【问题标题】:Can I use Authorization Code grants for an SPA tightly coupled with an API (that I own)?我可以将授权码授予与 API(我拥有的)紧密耦合的 SPA 吗?
【发布时间】:2018-06-30 13:14:29
【问题描述】:

我正在构建一个 Angular(版本 5)应用程序,它只与一个后端、我的 API(Web 服务器上的烧瓶应用程序)对话,而后者又与我的数据库对话。该应用程序用于数据输入和可视化,其中数据不断加载并保存到后端/从后端保存。我可以控制所有三个部分。

我正在考虑使用 Auth0 来处理身份验证/用户管理。

我的问题是,我可以将此应用程序视为“常规”Web 应用程序并使用身份验证代码授予,而不是通常推荐用于 SPA 的隐式授予吗?那就是:

  1. SPA 将通过重定向到相应 auth0 页面的 /login 端点从 auth0 获取授权码
  2. 授权代码通过某个端点(可能是 /callback 端点)传递给 API。
  3. API 与 Auth0 对话以交换交换 AC 以获得令牌。
  4. 每次请求都会将令牌传递给数据库,如果令牌无效则拒绝(可以使用 postgresql 在数据库中检查令牌有效性)
  5. API 服务器上的令牌与用户之间的关联是通过加密的 cookie(Flask 的“会话”变量)完成的

阅读大量关于隐式授权与身份验证代码授权的讨论,似乎主要区别在于,在真正的 SPA 应用程序中,没有一个由资源提供者控制的服务器可以存储客户端密钥或令牌.但是,就我的情况而言,我不能将 SPA 应用程序视为传统的(重 ajax 的)网页吗?

我在 auth0 论坛中发现了这个post,它暗示这可能“很脆弱,因为实际上你有一个 OAuth2 流由两个独立的组件处理”,但我不明白组件之间的独立性如何应该有所作为。

【问题讨论】:

  • 我认为应该将授权码发送回 SPA,然后 SPA 调用 /oauth2/token 将其交换为令牌?

标签: oauth-2.0 single-page-application auth0


【解决方案1】:

是的,您可以使用身份验证代码授权。如果你使用它,会有一些设计含义:

  • 您的后端将扮演 OAuth2 客户端的角色,而不是 SPA
  • 如果您将令牌从后端传递到您的 SPA 并将其用于身份验证(如果这就是您对问题中第 4 点的意思),则令牌将在一段时间后过期,用户将不得不通过再次进行身份验证过程,这可能很烦人。

所以我建议:

  • 要执行身份验证,后端应该有两个端点 - 一个用于重定向到 OAuth2 服务器,一个用于接受来自 OAuth2 服务器的重定向(包含身份验证代码)。无需将代码获取到您的 SPA。
  • 后端交换令牌代码。如果需要,可以将令牌保存在后端会话中,或者只将用户信息保存在会话中 - 您可能不再需要令牌。

所以使用这两种授权的主要区别在于,使用隐式授权,您的 SPA 需要能够在过期之前更新令牌(请参阅OpenID Connect Session Management),而使用身份验证代码授权,后端需要是有状态的- 为其客户保持会话。

【讨论】:

  • 我同意将初始 oauth2 端点保留在 API 端,但这会导致 302 重定向响应,从而导致 CORS 错误,因为 API 和 SPA 在不同域上运行。并且在 XmlHttpRequest 的情况下也无法拦截 302,因为浏览器会在 JS 对其进行操作之前对其进行处理。那么,是否只返回带有自定义响应的 ouath url,然后再次从客户端打开该 url?
  • 要从后端重定向到 OAuth2 服务器,您必须执行整个浏览器请求,而不是 XmlHttpRequest。所以CORS没有问题。您也可以通过从后端获取 URL 并从 JavaScript 执行重定向来做到这一点,但随后您会将后端详细信息带到前端。
  • 在 SPA 中,像角度一样,有没有办法从 API 端执行整个请求?因为 SPA 旨在使用 ajax 调用。
  • 您可以使用简单的 HTML 锚元素 <a href="/redirect-to-oauth">Authenticate</a> 或使用 JavaScript 中的 window.location.hrefwindow.open
  • 是的。我只这样做了。但想检查是否可以从 API 本身启动流。似乎可以用于 MVC 应用程序,但不能用于带有 API 的 SPA。
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2018-10-31
  • 2019-12-31
  • 2017-01-10
  • 2018-01-12
  • 2019-07-10
  • 2020-01-12
相关资源
最近更新 更多