首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-OAuth工具包:使用客户端凭据授予类型OAuth2.0为多个资源/服务生成访问令牌

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

Stack Overflow用户
提问于 2019-03-26 06:49:21
回答 2查看 2.8K关注 0票数 7

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

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

问题

问题1.我计划使用django-oauth工具包,在我看来,客户机凭据授予类型将适用于这个用例。我说得对吗?

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

step1:

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

代码语言:javascript
复制
POST -d "grant_type=password&username=u1&password=u1password" -u "clientid of R1:clientsecre of fR1" http://localhost:8000/o/token/

我拿到了访问令牌

代码语言:javascript
复制
{
   "access_token":"KdAOMZBiMomVxpvjAWErwVGog6NRRH",
   "expires_in":86400,
   "token_type":"Bearer",
   "scope":"read write introspection",
   "refresh_token":"ffgkZZ5NtVFh4REs0TbFAALNkJqXVQ"
}

步骤2:

假设上面是我为资源服务器R1生成的访问令牌,所以我转到R1的设置文件,并添加了这个令牌进行内省

代码语言:javascript
复制
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:假设现在我有一个auth服务器,可以为r1和r2资源生成令牌。

现在,为了模拟这样一个场景,一个想要将我的API与他的应用程序集成起来的开发人员想要生成一个访问令牌,必须首先将他的应用程序注册到auth服务器,我在auth服务器上注册了一个app ( developer's app),该应用程序具有Grant类型的客户凭证。

这就是我的管理面板现在对R1的看法,用户U1和U2注册为资源服务器和开发应用程序的R2,而不是任何想要访问这些资源的客户端。

步骤5:模拟开发人员如何生成访问令牌,我生成的访问令牌如下

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

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

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

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-01 10:14:15

问题1.我计划使用django-oauth工具包,在我看来,客户机凭据授予类型将适用于这个用例。我说得对吗?

是的,你是对的。

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

是的,你这样做是对的。

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

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

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

访问令牌是机密。如果与任何人共享,任何资源都将能够访问它。如果我有你的FB标记,你和我可以用它做同样的事情,不管这个标记属于谁。

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

  1. 是的,使用client_credentials是处理问题陈述的正确方法。
  2. 是的,你的做法是正确的。但是,请查看JWT,以获得另一种高级方法。使用JWT避免了对OAuth服务器的内省调用,从而节省了网络调用。
票数 5
EN

Stack Overflow用户

发布于 2019-03-26 07:19:40

为了简单地保护后端,您可以使用内置的令牌认证

这是完全安全的开始。它将每个用户/帐户限制为单个令牌,当涉及到旋转/撤销令牌时,这可能会影响“用户体验”。在扩展以支持大量事务量方面,也有一些缺点。否则就很好了。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55351275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档