Django-OAuth-ToolKit: 使用OAuth2.0的客户端凭据授权类型生成多个资源/服务的访问令牌。

7
我有几个后端API,都是Django项目。它们有一个UI(单页应用程序),需要用户名密码登录。
我的客户通常是开发人员,他们不需要UI,他们只需要访问后端API,并可以构建自己的仪表板等。他们希望将API与其后端系统集成。
问题:
问题1:我计划使用django-oauth-toolkit,看起来客户端凭据授权类型适合这种情况。我是对的吗?
为了进行实验,我在本地启动了一个独立的oauth服务器,运行在8000端口上,我在8001上启动了资源服务器(r1),在8002上启动了资源服务器(r2)。
步骤1:
我进入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都已经注册为资源服务器,而开发人员应用程序没有与任何用户关联,它是想要访问这些资源的客户端。

enter image description here

步骤5:模拟开发者生成访问令牌的过程,我生成了这样的访问令牌: enter image description here

注意:我使用了资源R1的客户端ID和客户端密钥生成访问令牌,但我能够成功地将同一访问令牌用于资源R2,并且它可以正常工作。

问题3:为什么我使用R1的客户端ID和客户端密钥生成的访问令牌即使用于R2,也能正常工作?我做错了什么吗? 基本上,我想要能够专门为资源生成开发人员的访问令牌。我知道有范围和权限,但我能否仅为特定资源生成访问令牌?我需要做什么才能实现此目标?我需要扩展或添加一些逻辑吗?

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

感谢任何帮助


@SajiXavier 你能帮忙吗? - Syed Ammar Mustafa
2个回答

5

问题1:我打算使用django-oauth-toolkit,我认为客户端凭据授权类型适合这种情况。我是对的吗?

是的,你是对的。

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

是的,你正在正确执行。

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

您的意思是在同一资源服务器上运行不同的微服务而使用不同的端口吗?如果是,那么您必须像为R1和R2所做的那样配置您的资源服务器。

问题4:我是否正确地使用了客户端凭据授权类型,并且我已经注册了资源服务器和将要使用资源服务器的客户端应用程序的步骤是否正确?

  1. 是的,使用client_credentials是解决您的问题陈述的正确方法。
  2. 是的,您正在正确设置它。但是,请考虑使用JWT作为可选和高级方法。使用JWT可以避免向OAuth服务器进行内省调用,从而节省网络调用。

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

访问令牌是机密的。如果与任何人共享,任何一个资源都将能够访问它。例如:如果我拥有您的FB身份验证令牌,则您和我都可以使用它执行相同的操作,无论此令牌属于哪个应用程序。


1
我了解访问令牌是机密的。我的问题是,如果我正在使用在Oauth服务器注册的resource1的客户端ID和客户端密码,并生成访问令牌,则为什么我能够使用相同的访问令牌访问resource2? resource2不应该只能由使用resource2的客户端ID和客户端密码生成的访问令牌才能访问吗? - Syed Ammar Mustafa

0

要简单地保护后端,您可以使用内置的令牌身份验证

这是一个非常安全的开始。它限制每个用户/账户只能使用一个令牌,这可能会影响到在轮换/撤销令牌时的“用户体验”。当需要支持大量交易时,也存在一些缺点。除此之外,一切都很好。

一旦您更好地了解自己的需求,可以考虑向JWT、OAuth或其他更高级/复杂的基于令牌的身份验证方法迈进。


很高兴听到你取得了进展。通常最好提出一个新问题,因为这与你最初询问的问题已经有了显著的不同。 - Dwight Gunning
我以为更新问题就足够了。如果我把它作为一个不同的问题问,你想回答吗? - Syed Ammar Mustafa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接