Django REST Framework - 来自外部提供商的 OAuth2 Consumer API
Posted
技术标签:
【中文标题】Django REST Framework - 来自外部提供商的 OAuth2 Consumer API【英文标题】:Django REST Framework - OAuth2 Consumer API from external provider 【发布时间】:2014-08-17 07:17:56 【问题描述】:我正在尝试授权用户使用 Oauth2 从我的 Django REST 框架 API 访问一些资源。
关于 Oauth2 和 API 的大多数答案都涉及使 API 成为提供者。
但我计划与许多 REST API 共享一个 Oauth2 提供程序,但我不知道如何使用它(而不是如何提供 Oauth2)。
我不知道用户如何登录提供者 SSO,然后将其令牌传递给我的消费 API,后者必须根据我的提供者对用户进行身份验证(取回其信息,主要是授权)。
有人知道如何从 Django REST 框架中使用 Oauth2 吗?
图:
[User] -> [My API] [Oauth2 provider (with django-oauth-provider)] [Active Directory / 任何东西]
【问题讨论】:
我遇到了同样的问题,正要问完全相同的问题。似乎我必须实现某种自定义身份验证,但我无法找到资源服务(在本例中为 API)如何针对创建它的服务验证令牌。我的意思是,我的 API 获取了令牌,那么我应该如何询问创建它的服务是否有效?使用 django_oauth_toolkit,它没有提供任何似乎对验证令牌有用的端点。 @gepatino 根据 OAuth2 规范,提供者必须提供一个内省端点来验证令牌。 tools.ietf.org/html/rfc7662#section-2 但是,它仍然是一个提议的标准。 Okta 是一个企业 IdP,有一个自省端点。 developer.okta.com/docs/api/resources/oidc/#introspect。您的 IdP 应该有类似的机制 【参考方案1】:查看https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/authentication.py#L290 的代码似乎是不可能的。 django-rest-framework 在内部访问提供者的数据库表以检查令牌并使用这些数据验证请求。
这对我来说有点违背 OAuth 的目的,但我们开始吧。
【讨论】:
我很想知道这是否有任何更新。总是强制 OAuth 提供者与客户端在同一台机器上似乎是一个非常可悲的想法,并且真的有点违背 OAuth 的一半目的。 没有任何改变。使用远程提供程序的唯一方法是编写自己的身份验证子类。【参考方案2】:我发现了这些相关的问题,这证实了我认为的解释错误:
How to validate an OAuth 2.0 access token for a resource server? https://softwareengineering.stackexchange.com/questions/159119/oauth2-flow-does-the-server-validate-with-the-auth-server基本上,标准并没有定义这样的功能......这太棒了,前提是很多人迟早会达到这一点。
最奇怪的是我找不到任何 django 插件来执行此操作...我们是前两个需要使用同一个身份验证服务器验证多个 API 的吗?
【讨论】:
【参考方案3】:最近,OAuth 2.0 Authorization Framework 提出了一个名为 OAuth 2.0 Token Introspection (RFC 7662) 的规范,该规范定义了一个协议,该协议允许授权的受保护资源查询授权服务器以确定 OAuth 提供给它们的给定令牌的元数据集2.0客户端。
这可以解决你的问题。
它由大多数知名的 OAuth 2.0 提供商实现,例如:
亚马逊认知 奥克塔 Auth0 谷歌云身份并且可以轻松地与您的 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
设置资源服务器,所有其他设置与身份验证服务器相同,然后将以下配置添加到您的设置中:
一个。资源服务器互检 URL 例如https://example.org/o/introspect/
b.资源服务器身份验证令牌,例如tBvd837tbdHssyT6bhAr9H
或资源服务器自省凭据(即客户端 ID 和客户端密码)
上述步骤的实现可能因不同的身份验证提供者而异。但它给出了如何按照 rfc-compliance 完成整个配置的基本概念。
【讨论】:
以上是关于Django REST Framework - 来自外部提供商的 OAuth2 Consumer API的主要内容,如果未能解决你的问题,请参考以下文章
Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers