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 tokenBase64($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 和 django-rest-framework-jwt APIViews and validation Authorization headers

django rest framework接口怎么传参进行数据查询?

请教Django REST framework的一些问题

记录对 django-rest-framework 的请求

18-Django REST framework-使用Django开发REST 接口