Django-OAuth-ToolKit:使用 OAuth2.0 的客户端凭据授权类型为多个 resources/services 生成访问令牌

Django-OAuth-ToolKit : Generating access token's for multiple resources/services using client credentials grant type of OAuth2.0

我有几个后端 API,它们是 Django 项目。他们有一个 UI(单页应用程序)和一个基于用户名密码的登录。

我的客户通常是开发人员,他们不想要 UI,他们想要的只是访问后端 API,他们可以构建自己的仪表板等。他们会想要将 API 与其后端系统集成。

问题

问题 1. 我打算使用 django-oauth-tool kit,在我看来,客户端凭据授权类型适合这个用例。我说得对吗?

为了实验,我在本地 运行 端口 8000 上启动了一个单独的 oauth 服务器,我在 8001 上启动了资源服务器 ( r1 ),在 8002 上启动了资源服务器 ( r2 )。

第一步:

我去了 oauth 服务器的管理面板,为资源 r1 创建了用户 u1,为资源 r2 创建了用户 u2。我去了管理面板中的应用程序模块,在应用程序中注册了 r1 和 r2,并授予类型资源所有者密码。为了生成访问令牌,我调用了令牌端点

POST -d "grant_type=password&username=u1&password=u1password" -u "clientid of R1:clientsecre of fR1" http://localhost:8000/o/token/

我得到了访问令牌

{
   "access_token":"KdAOMZBiMomVxpvjAWErwVGog6NRRH",
   "expires_in":86400,
   "token_type":"Bearer",
   "scope":"read write introspection",
   "refresh_token":"ffgkZZ5NtVFh4REs0TbFAALNkJqXVQ"
}

第 2 步:

说上面我为资源服务器 R1 生成的访问令牌,所以我转到 R1 的设置文件并添加了这个令牌用于自省

OAUTH2_PROVIDER = {
    'RESOURCE_SERVER_INTROSPECTION_URL': 'http://localhost:8000/o/introspect/',
    'RESOURCE_SERVER_AUTH_TOKEN': '9b2uVud7WXHEdyolznvvkM3KwWfkVe',  # OR this but not both:
    #'RESOURCE_SERVER_INTROSPECTION_CREDENTIALS': ('5sRVXLoTQj9vlkLWaziIMZrgra1keupWIQ2On2hX','5jwMxls1JiAiQiNVnRTtbjmzgRO20FEHD0BBdiSAwvSL1XswZKqglDRke2L8Ig77ol7OE3ZdsA9SE7sry0u3BXwd1OvfFfhDVJFSLWlPG6g1vB3w4ZFc1g8ZwgzXJooc'),
}

第 3 步: 我对资源服务器 R2 也做了同样的处理。

问题2:这个注册多个资源服务器的过程是否正确?我是否正确设置了内省?

问题 3:如何在同一个资源服务器上注册不同的微服务运行?

第 4 步: 假设现在我有一个授权服务器准备好为 r1 和 r2 资源生成令牌。

现在模拟一个场景,开发者想要将我的 API 与他的应用程序集成并想要生成访问令牌必须首先向身份验证服务器注册他的应用程序,我注册了一个应用程序(开发者的应用程序)在具有授权类型客户端凭据的身份验证服务器上。

我的管理面板现在是这样的,R1 用户 U1 和 R2 用户 U2 注册为资源服务器,开发者应用程序与任何用户无关,这些用户是想要访问这些资源的客户端。

第 5 步: 模拟开发人员如何生成访问令牌,我生成了这样的访问令牌

注意:我使用了资源 R1 的客户端 ID 和客户端密码并生成了访问令牌,但即使对于资源 R2 及其工作,我也能够成功使用相同的访问令牌。

问题 3:为什么我使用 R1 的客户端 ID 和客户端密码生成的访问令牌对 R2 也有效。我在这里做错了什么吗? 基本上,我希望能够为开发人员专门针对资源生成访问令牌。我知道有范围和权限,但我可以只为特定资源生成访问令牌吗?我需要做什么才能实现这一目标,是否需要扩展或添加一些逻辑?

问题 4:我对使用客户端凭据授权类型的想法是否正确?我注册资源服务器和将使用资源服务器的客户端应用程序的步骤是否正确?

感谢您的帮助

要简单地保护后端,您可以使用内置 Token Authentication

入门非常安全。它限制你每个 user/account 一个令牌,这可能会影响 "user experience" 当需要 rotate/revoke 令牌时。在扩展以支持大交易量方面也存在一些缺点。不然真的很好。

一旦您更好地了解您的需求,您就可以考虑转向 JWT、OAuth 或其他更多 advanced/complex 基于令牌的身份验证方法。

question 1. I am planning to use django-oauth-tool kit , it seems to me that the client credentials grant type would be suitable for this use case . Am I right ?

是的,你是对的。

Question 2 : Is this process of registering multiple resource server's correct ? Have I set up the introspection correctly ?

是的,你做对了。

Question 3 : How would I register different micro services running on the same resource server ?

你的意思是 运行 同一资源服务器上不同端口上的不同微服务?如果是,那么您必须按照与 R1 和 R2 相同的方式配置您的资源服务器。

Question 3 : Why is the access token I generated using R1's client id and client secret working even for R2. Am I doing something wrong here ? Basically , I want to be able to produce access tokens for developer's specifically for a resource. I know there are scope and permissions but can I generate access token for a specific resource only ? what do I need to do to achieve this , do I need extend or add some logic ?

访问令牌是机密。如果与任何人共享,任何一个资源都可以访问它。例如:- 如果我有你的 FB 授权令牌,你和我都可以用它做同样的事情,不管这个令牌属于谁。

Question 4 : Is my thought on using client credentials grant type correct and are the steps that I have done to register resources server's and the client app's which are going to use resource server's correct ?

  1. 是的,使用 client_credentials 是处理问题陈述的正确方法。
  2. 是的,您的设置方式正确。但是,一定要研究 JWT 以寻找替代的高级方法。使用 JWT 避免了对 OAuth 服务器的内省调用,从而节省了网络调用。