需要有关具有自我管理用户数据库的 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 的帮助的主要内容,如果未能解决你的问题,请参考以下文章