问题标签 [django-oauth]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2424 浏览

django - Django-OAuth-ToolKit:使用 OAuth2.0 的客户端凭据授予类型为多个资源/服务生成访问令牌

我有几个后端 API,它们是 Django 项目。他们有一个 UI(单页应用程序)和一个基于用户名密码的登录。

我的客户通常是开发人员,他们不想要 UI,他们想要的只是访问后端 API,他们可以构建自己的仪表板等。他们希望将 API 与他们的后端系统集成。

问题

问题 1. 我打算使用 django-oauth-tool 工具包,在我看来,客户端凭据授予类型将适合此用例。我对吗 ?

为了进行实验,我在 8000 端口本地启动了一个单独的 oauth 服务器,我在 8001 上启动了资源服务器 (r1),在 8002 上启动了资源服务器 (r2)。

第1步 :

我去了 oauth 服务器的管理面板,为资源 r1 创建了一个用户 u1,为资源 r2 创建了一个用户 u2。我去了管理面板中的应用程序模块,在授予类型资源所有者密码的应用程序中注册了 r1 和 r2。为了生成访问令牌,我调用了令牌端点

我得到了访问令牌

第2步:

说上面我为资源服务器 R1 生成的访问令牌,所以我去了 R1 的设置文件并添加了这个令牌以进行自省

第 3 步:我也对资源服务器 R2 执行了相同的过程。

问题2:这个注册多个资源服务器的过程是否正确?我是否正确设置了自省?

问题3:如何注册在同一资源服务器上运行的不同微服务?

第 4 步:假设现在我有一个身份验证服务器准备好为 r1 和 r2 资源生成令牌。

现在要模拟一个场景,即想要将我的 API 与他的应用程序集成的开发人员想要生成访问令牌必须首先将他的应用程序注册到身份验证服务器,我在授权服务器上注册了一个应用程序(开发人员的应用程序)与 Grant 类型客户端证书。

这就是我的管理面板现在的外观,其中 R1 和用户 U1 和 R2 和 U2 注册为资源服务器和开发者应用程序,与任何想要访问这些资源的客户端的用户无关。

在此处输入图像描述

第 5 步:模拟开发人员如何生成访问令牌,我生成了这样的访问令牌 在此处输入图像描述

注意:我使用了资源 R1 的客户端 ID 和客户端密码并生成了访问令牌,但即使对于资源 R2 及其工作,我也能够成功使用相同的访问令牌。

问题 3:为什么我使用 R1 的客户端 ID 和客户端密码生成的访问令牌即使对 R2 也有效。我在这里做错了吗?基本上,我希望能够为开发人员专门为资源生成访问令牌。我知道有范围和权限,但我可以只为特定资源生成访问令牌吗?我需要做什么来实现这一点,我需要扩展或添加一些逻辑吗?

问题 4:我对使用客户端凭据授权类型的想法是否正确,我为注册资源服务器和将使用资源服务器的客户端应用程序所做的步骤是否正确?

谢谢你的帮助

0 投票
1 回答
421 浏览

python - 如何允许用户在 Django Rest Framework 中只修改他的数据

我正在使用Django 2.1.8构建简单的 API,并使用Django OAuth Toolkit提供安全性。我已经达到了用户只能在授权后使用 api 的地步,但我想将他的操作限制在他的数据上。

我已经使用 oauth2 建立了授权,它返回了access token

模型.py

视图.py

是否有可能将返回的令牌与用户模型连接起来,所以每次有人使用 API 时,它都会过滤用户是否匹配所需的数据?或者 oauth 工具包是否自动以及如何访问它?

0 投票
0 回答
60 浏览

reactjs - 如何在 REST API 中实现代码授权流程?

我正在用 React 和 Django(Rest Framework)开发 Web 应用程序。,我希望用户可以使用google account.,

我遵循的方法是implicit grant flow.,我access token在前端得到了。,并将访问令牌发送到后端。然后后端应该使用google. 验证访问令牌,并返回新jwt token的以供将来的请求。一旦用户注销。,同样的循环继续。,

我的客户不想implicit grant flow对其他设备(例如移动设备)重复相同的操作。他们希望authentication完全由后端处理。所以我打算用code exchange flow.

我正在计划的方法。

  1. 用户单击使用 google 按钮登录
  2. 将请求发送到 django 后端,获取 clientId 和服务器回调 URL。
  3. 客户端使用客户端 ID 将请求重定向到 google 和callback url.
  4. 谷歌向用户询问权限并将访问令牌发送到后端。

在上述方法中,客户端和服务器之间的连接在步骤 3 中断开。我们如何知道后端获得了访问令牌。用户登录?

0 投票
0 回答
473 浏览

django - Django OAuth Toolkit 如何注销用户

我在我的项目中设置了 Django OAuth Toolkit,其中授权服务器与应用程序服务器(即 accounts.example.com 和 app.example.com)是分开的。应用服务器使用授权流重定向到账户服务器;用户输入凭据以登录身份验证服务器,然后身份验证服务器将用户重定向回应用程序;以便应用程序可以检索令牌。

上述流程目前按预期工作。如果我没有明确单击注销用户并且应用程序注销(例如会话过期或浏览器 cookie 被清除),则将再次执行上述流程并且不需要凭据,因为身份验证服务器仍然知道谁是签了。

但是,我无法明确地将用户从应用程序中注销。如果用户显式单击登录,首先必须撤销令牌,其次必须注销身份验证服务器。实现这一目标的正确方法是什么?就我而言,我将无法使用 Ajax 注销用户,因为会话必须在身份验证服务器中销毁。

所以,我一直在考虑将用户重定向到accounts.example.com/signout?token=${accessToken}&client_id=${clientID}. 但是,我不确定这是否是正确的方法。这就是这些注销请求与 OAuth 一起使用的方式吗?这是否意味着当我从系统注销时,我需要始终提供访问令牌和客户端 ID?

0 投票
1 回答
393 浏览

python - 自定义 Django REST 框架身份验证响应 {"detail": "Authentication credentials were not provided."}

我正在使用 django 2.1 和 python 3.6 和 django rest framework 3.8.2 ...我试图找到一种在身份验证失败时自定义 json 响应的方法。

我正在使用第三方包Django OAuth Toolkit

我能想到的唯一方法是编写一个自定义身份验证类

我尝试覆盖 BaseAuthorizationView

视图.py

网址.py

如果我能提供更多信息,请告诉我!先感谢您。

0 投票
1 回答
845 浏览

python - 请求对象在 DRF + DOT 中没有属性“oauth2_error”

我正在为我的 API 使用 djangorestframework 和 django-oauth-toolkit。

我有一个相当简单的用户注销视图,它支持带有令牌撤销的 DOT 注销和常规 Django 会话注销:

如果令牌撤销有问题,我希望得到一个错误的 401 响应,但相反我在服务器端收到一个错误(这是AuthenticationFailed作为回溯状态引发的结果):

我想 DRF + DOT 组合的异常处理有问题,但是如何解决呢?

UPD:settings.py与 DRF、身份验证或 DOT 相关的所有内容:

UPD 2:我尝试根据模块文档(写在之后)删除SessionAuthentication和设置我的应用程序顺序,一切都没有运气。DEFAULT_AUTHENTICATION_CLASSESrest_frameworkoauth2_provider

0 投票
1 回答
175 浏览

django - Django oauth 工具包是否可以仅使用客户端 ID 和机密 ID 登录?

我必须通过 REST 两个内部应用程序进行通信,我不需要使用用户凭据。是否可以仅使用 cliend_id 和 client_secret 密钥进行身份验证?

如果 OAuth 无法做到这一点

在此先感谢大家

0 投票
0 回答
341 浏览

django - 在无服务器应用程序中刷新 OAuth2 访问令牌

我正在通过 Django Rest Framework (v3.9.4) 在 Django (v2.2) 中创建一个带有 REST 后端的项目。此 REST API 供 SPA 和在外部服务器上运行的无头应用程序使用。所有视图都需要具有适当权限的用户身份验证。

前端 SPA 能够使用会话身份验证并将其传递给 REST API 没有问题。但是,会话身份验证不适用于无头服务器和我们也希望能够使用 API 的自治功能。

我已经决定使用 Django OAuth Toolkit (v1.2.0) 来提供使用 OAuth2 的身份验证。

我的问题如下。希望从一些无头环境中使用 API 的开发人员可以使用基于密码或客户端凭据授予类型(或任何其他类型,实际上)生成访问令牌。这为他们提供了访问令牌、到期时间和刷新令牌。

对于有状态服务器的应用程序,他们可以将访问和刷新令牌存储在文件、环境变量等中。当令牌过期时,他们可以使用刷新令牌获取新的访问令牌,并覆盖文件或环境变量以便它在未来可用。

但是,我们的一些应用程序以 Google Cloud Functions 或 Jenkins 部署的 Docker 容器的形式存在。使用不会过期的访问令牌,我们可以像任何其他秘密凭证一样将令牌传递到这些令牌中,并且应用程序会很好运行。我的问题的症结在于,当访问令牌过期时,这些无服务器应用程序应该做什么?他们将需要使用刷新令牌,但新的访问令牌需要在未来调用 Cloud Function(需要重新部署以设置环境变量)或 Docker 容器(通过 Jenkins 的凭据管理器再次设置环境)时可用容器中的变量)。

默认情况下,令牌每小时到期一次,并且无法禁用到期。我想避免将到期时间设置为大量的解决方法。

任何关于直接解决方案或其他管理受信任客户端中过期访问令牌的最佳实践的建议都将不胜感激!


编辑澄清 在谷歌云函数中,我们可以将访问令牌设置为可用作该函数的所有调用的环境变量(特别是加密的环境变量,使用谷歌KMS解密)。该环境变量在云函数中读取,并通过Authorization: Bearer <token>标头传递给 API 请求。当访问令牌过期时,我们需要更新环境变量以供将来调用,这将涉及通过gcloud functions命令行工具重新部署云功能。

0 投票
2 回答
1173 浏览

python - DRF request.data 没有属性 _mutable

我正在使用 Django 2.x 和 Django REST 框架。

django-oauth-toolkit用于启用OAuth2身份验证、django-rest-auth登录和django-allauth用户注册。

当用户成功注册时,我想在响应中生成访问令牌。为此,我正在使用自定义注册视图。

为此,我创建了一个函数 utils

当端点被邮递员击中时,它工作正常并且request.data具有_mutable属性。

但是当它被 Angular 应用程序击中时,它会给出错误

并且错误指向mutable = request.data._mutable

为什么_mutable缺少某些请求?

编辑 2:请求标头

Postman发送的请求头是

来自 Angular 的请求标头是

编辑 3:请求类型

从端点调用的主视图是CreateAPIView. generate_token从此视图调用,TokenView用于生成访问令牌。使用TokenViewDjango 的通用View.

0 投票
0 回答
198 浏览

django - 内省端点没有被调用

我希望使用 Django REST 框架创建一个 API,该 API 将通过其自省端点使用单独的身份验证服务器进行身份验证。授权流程应如下所示。

  1. 客户端向我们的身份验证服务器上的令牌端点提供用户凭据或刷新令牌。
  2. 如果提供的凭据或刷新令牌有效,则身份验证服务器使用访问令牌和刷新令牌进行响应。
  3. 然后,客户端在请求资源时将访问令牌发送到 API。
  4. API 使用我们身份验证服务器上的自省端点验证提供的访问令牌。
  5. 身份验证服务器会做出响应,让 API 知道访问令牌是否有效。
  6. 如果访问令牌有效,API 会使用请求的资源响应客户端。

第 4 步是我要完成的部分,Django OAuth Toolkit 看起来正好为此提供了一个选项。在关于设置单独的资源服务器的部分中,它声明它允许应用程序通过使用自省端点来验证访问令牌。

因此,我按照 Django OAuth Toolkit 的设置,将其RESOURCE_SERVER_INTROSPECTION_URL指向我们身份验证服务器上的自省端点。然后我从我们的身份验证服务器获取了一个访问令牌并将其作为授权标头提供给 API,但我得到了以下响应。

如果我不提供令牌,我会得到相同的响应正文,但没有WWW-Authenticate标头。奇怪的是,自省端点永远不会收到 POST 请求,它应该发送该请求以验证访问令牌。

那么我是否误读了文档,或者我做错了什么?为什么这不像我预期的那样工作?