通过自我管理的用户数据库

时间:2016-11-21 08:45:32

标签: api authentication oauth kong

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

现在我有:

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

我需要:

  • 网络应用和其他一些将使用API​​与OAuth2.0;
  • API仅由Kong提供。

根据关于孔的文件,我设计了一个资源所有者密码凭证一个。,它是这样的:

(这些API仅用于获取accessToken,无需验证方法)

  1. 用户结束帖子用户名和密码到孔
  2. Kong将其路由到User-Database。
  3. 用户数据库验证用户名和密码,并向Kong发送请求。该请求将包括用户名,密码,provision_key,autherticated_userid。 (*)
  4. Kong会将access_token响应给User-Database,并且还会记住authenticated_userid,access_token和scope。在访问令牌到期之前,Kong会记住它们。
  5. 在用户数据库收到Kong的回复后,它也将对第1步和第1步做出响应。 2,最后User-End将获得访问令牌以供将来使用。
  6. (获得访问令牌)

    1. User-End将向需要身份验证的API发送请求。
    2. enter image description here

      在第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

1 个答案:

答案 0 :(得分:1)

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

此流程仍需要您实现授权服务器,其任务是:

  • 使用提供的用户名和密码
  • 对用户进行身份验证
  • 授权用户,即决定是否应颁发访问令牌,并决定范围

请注意,这些都完全取决于您。

您的授权服务器最终实现了自己的/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服务器的Admin API)。

然后,您可以使用来自授权服务器的数据(即经过身份验证的用户ID和经过身份验证的范围),/oauth2/tokenprovision_key组合实际调用Kong POST https://kong:8443/yourapi/oauth2/token grant_type=password& client_id=(...)& client_secret=(...)& authenticated_userid=(...)& authenticated_scope=(...)& provision_key=(...) 端点。来自客户端应用程序的客户端凭据:

async.series([
    function(callback) { ... },
    function(callback) { ... }
]);

另请注意,如果您在其中存储客户端ID 机密,即使用仅客户机密钥服务器端,则对Web应用程序保密至关重要。对于不受信任的应用程序(移动设备,SPA),可以让授权服务器检索客户端密钥以便与Kong一起使用,通过客户端ID进行秘密查找(也使用Kong Admin API)。

希望有所帮助,马丁