当前位置: 首页 > 知识库问答 >
问题:

Django REST框架-来自外部提供者的OAuth2消费者API

陆琦
2023-03-14

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

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

但是我打算和很多REST APIs共用一个Oauth2提供者,想不通怎么消费(不是怎么提供Oauth2)。

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

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

数字:

[用户]

共有3个答案

璩珂
2023-03-14

最近,OAuth 2.0授权框架提出了一种称为OAuth 2.0令牌自省(RFC 7662)的规范,它定义了一种协议,允许授权的受保护资源查询授权服务器,以确定由OAuth 2.0客户端呈现给它们的给定令牌的元数据集合。

这样可以解决你的问题。

它由大多数知名的OAuth 2.0提供商实现,如:

    < li>Amazon Cognito 秋田犬 < li>Auth0 < li>Google云身份

并且可以很容易地与您的Django Rest框架API资源集成。

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

令牌检查可以通过以下简单步骤实现:

> < li>

设置认证服务器,并在创建OAuth2访问令牌时为资源服务器添加一个额外的作用域< code >自省。

'SCOPES': {
    'read': 'Read scope',
    'write': 'Write scope',
    'introspection': 'Introspect token scope',
    ...
}

OAuth提供程序必须有一个路径为< code>/introspect/的endpoint,它将在该endpoint监听任何自检请求。例如URL:< code > 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

注意:令牌是访问令牌,承载令牌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
}

使用与身份验证服务器相同的所有其他设置设置资源服务器,然后将以下配置添加到设置中:

a、 资源服务器问诊URL,例如https://example.org/o/introspect/

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

或资源服务器自检凭据(即客户端id

对于不同的身份验证提供者,上述步骤的实现可能会有所不同。但是它给出了如何按照rfc标准完成整个配置的基本概念。

郜昊苍
2023-03-14

我发现了这些相关的问题,这证实了我认为是我这边的一个解释错误:

  • 如何验证资源服务器的OAuth 2.0访问令牌
  • https://softwareengineering.stackexchange.com/questions/159119/oauth2-flow-does-the-server-validate-with-the-auth-server

基本上,标准没有定义这样的功能…这太神奇了,前提是很多人迟早会达到这一点。

最奇怪的是,我找不到任何django插件来执行此操作……我们是前两个需要使用同一个身份验证服务器对多个API进行身份验证的人吗?

归和惬
2023-03-14

查看代码https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/authentication.py#L290这似乎是不可能的。django-rest框架内部访问提供者的数据库表以检查令牌,并使用这些数据验证请求。

对我来说,这完全违背了OAuth的目的,但我们开始了。

 类似资料:
  • 是否有一种方法以编程方式访问和打印使用者滞后偏移,或者说使用者读取的最后一条记录的偏移与某个生产者写入该使用者分区的最后一条记录的偏移之间的位置差。 要知道我的最终目标是将这个值发送到prometheus进行监视,我应该在上面添加哪些语句来得到滞后偏移值?

  • D: \软件\Kafka\Kafka2.10-0.10.0.1\bin\windows 我使用上面的命令来消费消息,有什么我错过的吗?帮助我: 这个 那些是生产者和消费者......

  • 问题内容: 我指的是“ 有效Java ”的第2章中讨论的“服务提供者框架” ,这似乎是解决我遇到的问题的正确方法,其中我需要在运行时实例化几个类之一,并根据选择一个服务和一个对象(基本上是XML代码段): 但是,如何让各个服务提供者(例如,一堆默认提供者+一些自定义提供者)进行注册? 例如,如果我编写了自定义类MyFooAlgorithm和MyFooAlgorithmProvider来实现FooA

  • 这是我的消费者: 所以当运行我的制作人时,它最终会出错。任何人都知道这意味着什么,如果这可能是错的。

  • 生产者发送消息到一个有四个分区的主题。我们有一个消费者在消费来自这个主题的消息。应用程序在工作日一直运行周末例外:它不会在周末期间调用poll方法。 使用者配置:自动提交,自动提交时间为5s(默认)。 应用程序一直运行良好,直到一个星期天,当它重新开始调用poll方法。我们看到有数百万条消息从这个话题中被轮询出来。消费者基本上是轮询来自主题的所有消息。将新的偏移量与它在周末停止之前的偏移量进行比较