Man*_*anu 1 php authorization oauth-2.0 microservices kong
我正在尝试使用 Kong 的 oauth2 授权插件在顶部 kong 上添加一个 API。我按照他们的Kong 文档遵循的步骤:
我从上述步骤中获得了 client_id、client_secret、provision_key 等,但我想知道是否需要在我的一端创建 oauth2 服务器或 kong 本身在他们的一端配置它,我们只需要调用他们的端点。我正在 Laravel 中构建我的 API。
我认为我们对 Gitter 进行了简短的讨论,并且我已经说过这取决于您的用例。我将简要介绍典型用例,以及您需要哪种附加实现。
如果您需要两个系统从后端相互通信,并且这些系统相互信任,您可以使用 OAuth2“客户端凭据流”。在这种情况下,不涉及“最终用户”身份,仅涉及明确相互信任的两个系统。
对于这种情况,Kong 是您需要的一切——您只需使用您的客户端 ID 和 Secret向 Kong 的 API 令牌端点(<address of kong>:8443/your_api/oauth2/token对于基于 URI 的路由,或者fqdn.of.kong:8443/oauth2/token如果您使用基于主机的路由)请求访问令牌,您将获得一个背部。
例子:
curl --insecure -d 'grant_type=client_credentials&client_id=<...>&client_secret=<..>' https://<address of kong>:8443/your_api/oauth2_token
Run Code Online (Sandbox Code Playgroud)
您的后端服务将注入一些额外的标头,例如X-Consumer-Id和X-Custom-ConsumerId映射到您在 Kong 中创建的使用者。
如果您需要使用来自机密(=经典)Web 应用程序的 API,并且每次调用都需要最终用户上下文,您可能需要使用 OAuth2“授权代码授予”。在这种情况下,您还需要一个您需要自己实现的授权服务器。
授权服务器的任务是建立最终用户身份(请注意:这在 OAuth2 中未指定如何完成,由您决定;您可以与其他一些 IdP 联合,您可以要求提供用户名和密码, ...) 然后决定用户在访问 API 时获得哪些权限(=“范围”)。这完全取决于您,以及您的业务逻辑的一部分如何决定这一点。
流程是这样的:
AS 在两个不同层面与 Kong 对话
provision_key所需 API 的[/your_api]/oauth2/authorize端点,它用于在经过身份验证的用户及其范围(scope和authenticated_userid)的上下文中获取包含授权代码的重定向 URI ;要调用此端点,您将需要response_type=code, client_id, client_secret, provision_key, authenticated_userid(任何合适的)和可选scope(如果您想使用它,还需要在 API 上定义范围)如果成功,AS 使用 Kong 返回的重定向 URI 重定向回 Web 应用程序
[/your_api]/oauth2/token端点,使用client_idclient_secretcodegrant_type=code现在您将拥有一个访问令牌(和一个刷新令牌),它允许您的 Web 应用程序代表经过身份验证的用户访问 API 。
授权服务器必须由您实现;这并不是非常复杂,但您仍然需要确保您知道如何对用户进行身份验证,和/或如何将其委托给其他一些 IdP。
如果您需要从单页应用程序(例如从 Angular 应用程序或类似应用程序)访问 API,您应该查看 OAuth2“隐式流程”,这是一个比授权代码授权更简单的流程,但还有其他缺点,比如不能使用刷新令牌。
此流程按以下方式工作:
response_type=tokenhttps://your.app.com/#access_token=<...>&token_type=bearer&...)您的 SPA 现在将能够使用访问令牌来访问 API,就像授权代码授权一样,代表经过身份验证的用户。
这种方法的缺点是您不能(那样)轻松刷新令牌,并且它的安全性比授权代码授予要低。但是在处理 SPA 时,没有很多其他安全的方式来委派对它的访问。
我想在这里提到的最后一个场景是移动应用程序,例如 Android 或 iOS 应用程序。对于这些,可以使用最后一个 OAuth2 流程,即“资源所有者密码授予”。简而言之,通过此授权,您可以根据访问令牌和刷新令牌交换实际用户凭据(用户名和密码),这样您就不必在移动设备上临时存储用户名和密码。
此流程还需要一个授权服务器才能与 Kong 一起使用,尽管这次不那么复杂,即使您必须实现一个额外的token端点(除了 Kong 拥有的一个端点之外),这在 Kong 中没有理想地描述文档。
它会是这样的:
client_id(不是秘密,秘密不应与应用程序一起部署)、用户名和密码来调用授权服务器的令牌端点client_secret提供的 APIclient_id和provision_key所需的 APIAS 向 Kong 的令牌端点发出调用[/your_api]/oauth2/token,如下所示:
curl --insecure -d 'grant_type=password&provision_key=<...>&client_id=<...>&client_secret=<...>&authenticated_userid=<...>&scope=' https://:8443/your_api/oauth2 /令牌
注意,这个调用并没有包含用户名和密码; 那些不属于这里的,您必须根据自己的身份来源检查用户名和密码,Kong 不会帮助您。
此调用应返回访问令牌和刷新令牌,然后您将其(尽可能安全地)存储在您的设备上。这些替换用户名和密码,不得存储在设备上。访问令牌可以与其他最终用户上下文流(授权代码授权、隐式授权)一样用于代表经过身份验证的用户访问 API 。
将 Kong 与 OAuth2 结合使用是一件棘手且复杂的事情,但 Kong 确实可以帮助您做到这一点并分离您的顾虑。
| 归档时间: |
|
| 查看次数: |
3661 次 |
| 最近记录: |