将 3scale 与共享 OAuth 授权服务器一起使用

Using 3scale with shared OAuth authorisation server

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

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

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

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

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

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

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

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 端点,即仅授权而不是身份验证 and/or 身份验证.当用户登录时,用户身份验证应该全部在 3scale 之外完成。

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

回答您的具体问题:

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

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

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

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