需要有关具有自我管理用户数据库的 Kong 和 OAuth 的帮助

Posted

技术标签:

【中文标题】需要有关具有自我管理用户数据库的 Kong 和 OAuth 的帮助【英文标题】:Need help about Kong and OAuth with self-managed user-database 【发布时间】:2017-04-04 14:22:02 【问题描述】:

我需要使用 Kong 和 OAuth 来构建 Web 应用和其他一些 API。


现在我有:

Kong 的服务器。 服务器存储用户信息,例如 id、用户名、密码。将其命名为 User-Database。

我需要:

Web 应用程序和其他一些应用程序将使用带有 OAuth2.0 的 API; API 仅由 Kong 提供。

根据Kong上的文档,我设计了一个Resource Owner Password Credential,是这样的:

(这些API只是为了获取accessToken,没有认证方法)

    用户端将用户名和密码发给Kong Kong 将其路由到用户数据库。 User-Database 验证用户名和密码,并向 Kong 发送请求。该请求将包括用户名、密码、provision_key、autherticated_userid。 (*) Kong 将向用户数据库响应 access_token,并且还会记住 autherticated_userid、access_token 和范围。 Kong 会在访问令牌过期之前记住它们。 User-Database收到Kong的响应后,也会响应step 1 & 2,最后User-End会拿到access-token以备后用。

(获得访问令牌)

    用户端将向需要身份验证的 API 发送请求。


我在第 3 步无法理解的内容。

根据关于Kong的文档:

$ curl https://your.api.com/oauth2/token \ --header "Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW" \ --data "client_id=XXX" \ --data "client_secret=XXX" \ --data "scope=XXX" \ --data "provision_key=XXX" \ --data "authenticated_userid=XXX" \ --data "username=XXX" \ --data "password=XXX"

The provision_key is the key the plugin has generated when it has been added to the API, while authenticated_userid is the ID of the end user whose username and password belong to.

我应该将所有用户的信息存储到我自己管理的用户数据库和 Kong 两者吗?

或者有什么我错过的或者我可以优化的吗?

链接:Kong resource-owner-password-credentials

【问题讨论】:

我也面临同样的问题。你解决了吗? kong 的 API 在 v1.0 中发生了变化,我还没有研究它,所以我现在不知道如何处理新版本。下面的答案可以解决老版本。 【参考方案1】:

Kong 的文档在资源所有者密码授权方面颇具误导性。

这个流程还是需要你实现一个Authorization Server,其任务是:

为了验证用户,在这种情况下使用提供的用户名和密码 授权用户,即决定是否应该颁发访问令牌,并决定范围

请注意,这两件事完全取决于您。

您的授权服务器最终实现了自己的/authorize 端点,它应该像这样工作:

您的客户端应用帖子:

client_id=<your client id>&
client_secret=<your client secret>&
username=<...>&
password=<...>&
grant_type=password&
(optional: scope=space delimited scopes)

您的授权服务器保留 provision_key 或通过 Kong Admin API 检索它(取决于您的架构外观以及您是否可以使用 Auth Server 中的 Admin API)。

然后,您可以使用来自授权服务器的数据(即经过身份验证的用户 ID 和经过身份验证的范围)、provision_key 和来自客户端应用程序的客户端凭据来组装对 Kong 的 /oauth2/token 端点的实际调用:

POST https://kong:8443/yourapi/oauth2/token

grant_type=password&
client_id=(...)&
client_secret=(...)&
authenticated_userid=(...)&
authenticated_scope=(...)&
provision_key=(...)

还请注意,如果您在其中存储客户端 ID 机密,即仅在服务器端使用客户端机密,则网络应用程序的机密性至关重要。对于不受信任的应用程序(移动、SPA),可以让授权服务器通过客户端 ID 检索客户端密钥以与 Kong 一起使用(也使用 Kong Admin API)。

【讨论】:

以上是关于需要有关具有自我管理用户数据库的 Kong 和 OAuth 的帮助的主要内容,如果未能解决你的问题,请参考以下文章

Kong 网关配置开源WAF组件

微服务Kong——添加插件

使用公共微服务对 API 网关 (Kong) 进行身份验证

java+jsp基于ssm学生自我个人管理

Kong日志向导

具有自定义授权的 JWT 和 KONG