Django REST框架 - 来自外部提供商的OAuth2 Consumer API

时间:2014-06-26 12:24:41

标签: python django api oauth-2.0 django-rest-framework

我试图授权用户使用Oauth2从我的Django REST框架API访问一些资源。

关于Oauth2和API的大多数答案都涉及使API成为提供者。

但我计划与许多REST API共享一个Oauth2提供程序,我无法弄清楚如何消费它(而不是如何提供Oauth2)。

我不知道用户如何登录提供商SSO,然后将其令牌传递给我的消费API,消费API必须针对我的提供商对用户进行身份验证(获取其信息,主要是授权)。

有没有人知道如何从Django REST框架中使用Oauth2?

图:

[用户] - > [我的API] < - > [Oauth2提供者(与django-oauth-provider)]< - > [活动目录/任何内容]

3 个答案:

答案 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提供程序实现,例如:

  • Amazon Cognito
  • Okta
  • Auth0
  • Google Cloud Identity

并且可以轻松地与您的Django Rest Framework API资源集成。

在Django的用例中,开源库Django OAuth Toolkit也可以完美地完成这项工作。请注意,使用开放源代码库会带来维护和支持的隐性成本,有时很少。

令牌检查可以通过以下简单步骤完成:

  1. 设置身份验证服务器,并在创建OAuth2访问令牌时为资源服务器添加一个额外的范围introspection

    'SCOPES': {
        'read': 'Read scope',
        'write': 'Write scope',
        'introspection': 'Introspect token scope',
        ...
    }
    
  2. 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
    }
    
  3. 使用与Auth Server相同的所有其他设置来设置资源服务器,然后将以下配置添加到您的设置中:

    a。资源服务器互检URL,例如https://example.org/o/introspect/

    b。资源服务器身份验证令牌,例如tBvd837tbdHssyT6bhAr9H

    或资源服务器自检凭证(即客户端ID和客户端机密)

对于不同的身份验证提供程序,上述步骤的实现可能有所不同。但是它给出了如何按照rfc规范完成整个配置的基本思路。