0

我有一个网站mywebsite.com,用户可以在其中登录。登录是通过将未经身份验证的会话重定向到ssologin.com上的 SSO 提供商来处理的,该提供商验证凭据,然后使用访问令牌重定向回 mywebsite.com 以便它可以创建本地会话。

该网站是一个单页 Web 应用程序,它使用 JavaScript 调用通过 API 网关 3scale 公开的 API。

我想了解的是如何让 3scale 兑现颁发给网站的 OAuth 访问令牌。我猜它应该足够简单,因为 3scale 似乎将此委托给授权 URL,但我不确定这背后的机制以及它是否正在做我期望的事情。

谁能解释我是否 - 以及如何 - 我可以做到这一点?我已经阅读了文档,但我无法理解它,因为它掩盖了在授予 OAuth 访问令牌之后发生的事情,并且它没有涉及可能创建令牌的场景-带(即看不见 3scale)。

我认为我想在这种情况下使用的流程是客户端 Web 应用程序/隐式授权流程,但如果我错了,请纠正我。

我试图破译帮助文件,但我仍然有很多问题:

  • 我假设我将 3scale OAuth 登录 URL 配置为与 mywebsite.com 重定向到的 URL 完全相同?或者我是否需要一个不同的页面来处理不同的逻辑,以及 API 调用通常不是交互式/面向用户的事实?
  • 用户通过 ssologin.com OAuth 登录页面登录网站后返回的访问令牌是否可用于后续 API 调用,或者 3scale 是否需要自己的令牌,因此需要自己的登录重定向?(是否有状态存储在网关的任何位置?)
  • 访问令牌如何传递给 API 调用:作为参数、作为 HTTP 标头或通过其他机制?

实际上我想做的实际上是使用 OpenID Connect 并取回一个 ID 令牌,但 3scale 本身并不支持这一点。我可以用 3scale 做些什么来伪造它并仍然返回一个 ID 令牌,从而有效地使其表现得像 OpenID Connect?

4

1 回答 1

4

TL;DR:使用 3scale API 调用来存储 access_tokens,以便 3scale 尊重它们:https ://github.com/3scale/nginx-oauth-templates/tree/master/oauth2

curl -X POST "http://su1.3scale.net/services/<SERVICE_ID>/oauth_access_tokens.xml?provider_key=<PROVIDER_KEY>&app_id=<CLIENT_ID>&token=<TOKEN>&ttl=<TTL>"

3scale 提供了许多 API 调用来管理访问令牌,这包括存储和删除访问令牌。您可以在此处的自述文件中找到这些 API 调用的列表以管理访问令牌:https ://github.com/3scale/nginx-oauth-templates/tree/master/oauth2

因此,您应该能够将在 3scale 之外发布的访问令牌与应用程序(可能是您的单页 Web 应用程序)相关联,并将该访问令牌用于授权目的。事实上,3scale 不会生成访问令牌,API 网关会。

这一切都是为了检查 3scale 中使用给定访问令牌的应用程序是否被授权调用给定 API 端点,即仅授权而不是身份验证和/或身份验证。用户登录时,用户身份验证应该都在 3scale 之外完成。

3scale 为 API Gateway 提供了许多配置模板,具体取决于您要实现的流程以及您希望令牌由 API Gateway(令牌生成文件夹)还是由外部 OAuth 提供程序(no-token-生成文件夹。)您可以在此处找到这些模板,并解释它们如何在每个不同的流文件夹中工作:https ://github.com/3scale/nginx-oauth-templates/tree/master/oauth2 。由于您有自己的 OAuth 提供程序来生成访问令牌,因此您将需要使用这些模板而不是在 3scale 的集成页面中生成的文件。

要回答您的具体问题:

  • OAuth 登录 url 应该是一个页面(受 ssologin 页面保护),允许您的用户授权/拒绝访问通过 API 访问其资源的应用程序。您的 SSO 提供商似乎不需要这样做,因此它似乎遵循资源所有者密码流程。

  • 在此流程(资源所有者密码)中,访问令牌在 API 网关上调用 /oauth/token 端点时返回。然后,网关将调用外部 OAuth 提供者的访问令牌端点(带有相关参数),一旦收到返回的访​​问令牌,它将存储在 3scale 中并将其返回给调用应用程序。对于其他流,它改为由 API 网关发送到重定向 url。但是,如果您的 SSO 提供商已经将访问令牌返回到您的应用程序的重定向 url,您可以做 2 件事:

    1. 直接从您的应用程序调用 3scale 端点来存储返回的访问令牌
    2. 使 SSO 提供者的 redirect_url 成为 API Gateway 而不是您的应用程序,以便它将访问令牌存储在 3scale 中,并将 access_token 也发送回您的应用程序。这将需要自定义 API Gateway 配置模板。
  • 访问令牌的发送位置完全取决于您。但是,您必须在 Nginx 配置模板中配置此位置,以便正确提取访问令牌。例如https://github.com/3scale/nginx-oauth-templates/blob/master/oauth2/resource-owner-password-flow/no-token-generation/nginx.lua#L198-L207https://github .com/3scale/nginx-oauth-templates/blob/master/oauth2/resource-owner-password-flow/no-token-generation/nginx.lua#L312

最终,网关可以位于您的应用程序和访问令牌发行者之间,以 3scale 捕获和存储这些,调解整个交换。3scale 的唯一限制是访问令牌格式,它必须是最长 256 个字符的字母数字字符串。

于 2015-06-02T10:12:43.563 回答