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

Sye*_*afa 7 security django oauth-2.0 django-rest-framework django-oauth

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

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

问题

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

为了进行实验,我在本地运行在 8000 端口上启动了一个单独的 oauth 服务器,我在 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/
Run Code Online (Sandbox Code Playgroud)

我得到了访问令牌

{"access_token": "KdAOMZBiMomVxpvjAWErwVGog6NRRH", "expires_in": 86400, "token_type": "Bearer", "scope": "read write introspection", "refresh_token": "ffgkZZ5NtVFh4REs0TbFAALNkJqXVQ"}
Run Code Online (Sandbox Code Playgroud)

第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'),
Run Code Online (Sandbox Code Playgroud)

}

第 3 步:我也对资源服务器 R2 执行了相同的过程。

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

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

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

现在为了模拟一个场景,一个开发人员想要将我的 API 与他的应用程序集成,想要生成一个访问令牌必须首先向 auth 服务器注册他的应用程序,我在授权类型客户端的 auth 服务器上注册了一个应用程序(开发人员的应用程序)证书。

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

在此处输入图片说明

第 5 步:模拟开发人员如何生成访问令牌,我生成了这样的访问令牌 在此处输入图片说明

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

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

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

谢谢你的帮助

Pyt*_*ast 5

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

你是对的。

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

是的,你做对了。

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

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

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

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

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

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