我试图授权用户使用Oauth2从我的Django REST框架API访问一些资源。
关于Oauth2和API的大多数答案都涉及使API成为提供者。
但我计划与许多REST API共享一个Oauth2提供程序,我无法弄清楚如何消费它(而不是如何提供Oauth2)。
我不知道用户如何登录提供商SSO,然后将其令牌传递给我的消费API,消费API必须针对我的提供商对用户进行身份验证(获取其信息,主要是授权)。
有没有人知道如何从Django REST框架中使用Oauth2?
图:
[用户] - > [我的API] < - > [Oauth2提供者(与django-oauth-provider)]< - > [活动目录/任何内容]
答案 0 :(得分:4)
查看https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/authentication.py#L290处的代码似乎是不可能的。 django-rest-framework在内部访问提供者的数据库表以检查令牌并使用这些数据验证请求。
对我而言,根本没有击败OAuth的目的,但我们走了。
答案 1 :(得分:1)
我发现了这些相关的问题,这证实了我认为是我身边的解释错误:
基本上,标准没有定义这样的功能......这太棒了,前提是很多人会很快达到这一点。
最奇怪的是我找不到任何django插件来执行此操作...我们是否需要使用相同的Auth服务器对多个API进行身份验证?
答案 2 :(得分:0)
最近,OAuth 2.0 Authorization Framework提出了一个名为OAuth 2.0 Token Introspection (RFC 7662)的规范,该规范定义了一个协议,该协议允许授权的受保护资源查询授权服务器,以确定给定令牌的元数据集。它们是由OAuth 2.0客户端提供的。
这可以解决您的问题。
它由大多数著名的OAuth 2.0提供程序实现,例如:
并且可以轻松地与您的Django Rest Framework API资源集成。
在Django的用例中,开源库Django OAuth Toolkit也可以完美地完成这项工作。请注意,使用开放源代码库会带来维护和支持的隐性成本,有时很少。
令牌检查可以通过以下简单步骤完成:
设置身份验证服务器,并在创建OAuth2访问令牌时为资源服务器添加一个额外的范围introspection
。
'SCOPES': {
'read': 'Read scope',
'write': 'Write scope',
'introspection': 'Introspect token scope',
...
}
OAuth提供程序必须具有一个带有路径/introspect/
的端点,在该端点上它将侦听任何自省请求。
例如网址:https://example.org/o/introspect/
例如请求:
POST /o/introspect/ HTTP/1.1
Host: www.example.org
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 5HtUoltwKYKHnfmxRcJu
token=pOt6V4KXoMbhAraTIyA4zgyxH
注意:token
是访问令牌,Bearer token
是Base64($CLIENT_ID:$CLIENT_SECRET)
对以上示例请求的响应如下:
HTTP/1.1 200 OK
Content-Type: application/json
{
"client_id": "o7dfkjhvHt74F9W20",
"scope": "read write xyz",
"username": "john",
"exp": 1519123438,
"active": true
}
使用与Auth Server相同的所有其他设置来设置资源服务器,然后将以下配置添加到您的设置中:
a。资源服务器互检URL,例如https://example.org/o/introspect/
b。资源服务器身份验证令牌,例如tBvd837tbdHssyT6bhAr9H
或资源服务器自检凭证(即客户端ID和客户端机密)
对于不同的身份验证提供程序,上述步骤的实现可能有所不同。但是它给出了如何按照rfc规范完成整个配置的基本思路。