Python-social-auth使用Django服务器主机名和监听端口作为redirect_uri

2024-02-09

我正在将 python-social-auth 与 Django 一起使用,以使用 Oauth2 (google-oauth2) 向 Google 进行身份验证。在我的模板中我使用了一些东西like https://github.com/omab/python-social-auth/blob/master/examples/django_example/example/templates/home.html:

<a href="{% url "begin:social" "google-oauth2" %}">Login</a>

它正确地创建了一个A指向正确登录 URL 的元素。问题是,django 正在运行runserverApache 后面的选项ProxyPass and ProxyPassReverse(也尝试过 nginxproxy_pass选项,不是 fcgi)。

在这种情况下我有两个问题;首先,在创建身份验证请求时,python-social-auth 发送参数redirect_uri as localhost:8000所以我在settings.py上做了这个:

AUTH_EXTRA_ARGUMENTS = {'redirect_uri': 'http://myapp.com'}

它绕过了如果我发送则返回的“错误请求”Google 响应localhost:8000作为redirect_uri。

然后,在 python-social-auth 中oauth.py, here https://github.com/omab/python-social-auth/blob/master/social/backends/oauth.py#L319, 我理解了

self.auth_complete_params(self.validate_state())

发送同样错误吗redirect_uri去谷歌。所以我做了一些丑陋的事情,比如:

data = self.auth_complete_params(self.validate_state())
data['redirect_uri'] = 'http://myapp.com'
response = self.request_access_token(
    self.ACCESS_TOKEN_URL,
    data=data, # ugh!
    headers=self.auth_headers(),
    method=self.ACCESS_TOKEN_METHOD
) 

所以,这就是我当前的解决方案。我只是不明白如何以更优雅的方式或“正确”的方式做到这一点。

有什么帮助吗?

Best


如果我没猜错的话,问题就在于 python-social-auth 创建了错误的redirect_uri 来发送给身份验证提供者。它总是发送http://localhost:8000/my-login-page但你希望它发送http://myapp.com/my-login-page .

指定重定向 URI 的正确位置是在 settings.py 中:

SOCIAL_AUTH_LOGIN_REDIRECT_URL = 'http://myapp.com/my-login-url'

以及特殊情况的类似设置(例如 SOCIAL_AUTH_NEW_USER_REDIRECT_URL)。然后,你需要告诉 python-social-auth 让你更改域名,否则它会强制将域名恢复为localhost:8000。做这个:

SOCIAL_AUTH_SANITIZE_REDIRECTS = False

(也可以解决这个问题遍及整个 Django通过给予暗示build_absolute_uri()关于使用什么域的方法。这涉及到更多的堆栈部分,但请检查一下这个答案 https://stackoverflow.com/a/13788571/8735).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python-social-auth使用Django服务器主机名和监听端口作为redirect_uri 的相关文章

随机推荐

  • 如何获取 Android 设备内部下载文件夹路径? [复制]

    这个问题在这里已经有答案了 是否可以获取Android设备内部下载文件夹路径 如果设备有 SD 卡 您可以使用 Environment getExternalStorageState 如果您没有 SD 卡 您可以使用 Environment
  • PInvoke 返回带有二维数组的结构

    我有定义在的结构c questions tagged c 2b 2bWin32 DLL 如下所示 typedef struct matrix double data int m int n Matrix 并且有一个函数 Matrix get
  • 尝试运行 TensorFlow 时 CUDNN_STATUS_NOT_INITIALIZED

    我已经在带有 Cuda 9 0 和 CuDNN 7 0 5 以及普通 Python 2 7 的 Ubuntu 16 04 上安装了 TensorFlow 1 7 尽管它们的 CUDA 和 CuDNN 示例都运行良好 并且 TensorFlo
  • 如何在C++中输出欧元符号

    我试图为一个计算出租车费用的程序输出一个 Eurosign 然后将其转换为美元或欧元 规范的一部分是我必须输出 Eurosign 我已经尝试过 Unicode 但我没有任何运气 任何帮助将不胜感激 谢谢 这是我的代码 void produc
  • Visual Studio 2012“扩展和更新”“无法连接到远程服务器”

    不幸的是 过去几个月的情况就是如此 我无法安装新的或更新的软件包工具 gt 扩展和更新我尝试了一切 但无法找到原因 我试过了 访问 NuGet 并从 下载包 包管理器控制台 安装包 SUCCESS 使用 Web 浏览器访问存储库 Visua
  • Boost asio,单个 TCP 服务器,多个客户端

    我正在创建一个 TCP 服务器 它将使用 boost asio 它将接受来自许多客户端的连接 接收数据并发送确认 问题是我希望能够接受所有客户 但我一次只想与一个客户合作 我希望所有其他事务都保留在队列中 Example 客户端1连接 客户
  • 使用 spring-data-jpa 自定义 ItemReader

    我正在使用现有实体和存储库创建一个 Spring 批处理项目 我需要使用自定义ItemReader用于使用现有 jpa 存储库读取数据的作业 定制阅读器 public class InMemoryReader implements Item
  • 在 INSERT 之后使用 OUTPUT 将标识列的值获取到(非表值)变量中

    给出以下简单的测试表 CREATE TABLE dbo Test Id bigint IDENTITY 1 1 NOT NULL Name varchar 50 NULL 我想在之后将标识列的值放入标量变量中INSERT使用OUTPUT条款
  • 使用 $dialog 多次打开同一个对话框

    我创建这个 plnkr http plnkr co edit fdAdDNU9adtYrY9smQvU p preview在回答这个问题时 AngularJS 在对话框中打开控制器 动态加载模板 https stackoverflow co
  • Android 中已弃用 URLEncodedUtils

    URLEncodedUtils在 Android API 22 中已弃用 我可以在这段代码中使用什么来代替 我需要改变URLEncode Utils Format line public String construct return if
  • Winapi :: 获取可用句柄数

    我想创建长时间运行我的程序的测试 并不时输出可用句柄的计数 我怎样才能用一些 WINAPI 函数来做到这一点 这是一篇关于如何调试句柄泄漏的好文章http blogs technet com b yongrhee archive 2011
  • 将 Base64 jpeg 图像传递给 og:image

    我的网站上有在运行时生成的图像 我使用 html 将其显示 img src 现在 我希望 Facebook 获取此图像 但如果我对 og image 元标记执行相同操作 Facebook 调试器会给我一个错误 有什么解决办法吗 当然 我想避
  • 将一系列值映射到另一个值

    我正在尝试找到一种有效的方法将一系列值映射到另一个值 例如 1 9 gt 49 10 24 gt 54 25 49 gt 59 50 74 gt 50 75 99 gt 49 100 150 gt 40 这里的值不遵循任何常规模式 一种解决
  • 由于其保护级别,文本框无法访问[重复]

    这个问题在这里已经有答案了 课堂作业要求我们创建一份简单的能源账单 第一天生成一个 ID 号 我想将其复制到第二个表格 但我不断收到以下信息 错误 CS0122 Form1 idgen 由于其保护级别而无法访问由于我将引用第一种形式中的许多
  • build.gradle 错误:无法创建tastk ':generateLockfiles'。 Flutter项目中但App运行正常

    我的 Flutter 项目中的 build gradle 文件 android build gradle 有错误 该应用程序运行完全正常 但这个错误对我来说仍然不太好 有人遇到过这个问题 错误吗 这是我完整的 build gradle 文件
  • 如何实现对无缓冲通道的非阻塞写入?

    From 有效的行动 https golang org doc effective go html channels 接收器总是阻塞 直到有数据要接收 如果通道未缓冲 则发送方会阻塞 直到接收方收到该值 But 信号 通知 https go
  • NodeJs - esc 不是函数

    我在尝试渲染时遇到了一个奇怪的问题 ejs文件在此特定行 TypeError home me nodeapp app views default page connection ejs 66 64 div class col s12 l8
  • 如何限制pyTelegramBotAPI中少数用户的访问?

    我正在使用远程机器人 https github com eternnoir pyTelegramBotAPI https github com eternnoir pyTelegramBotAPI 创建一个机器人来向其用户发送照片 关键是我
  • 请求对象传递给 Django-Tables2 Tables 类

    假设我们有两个模型 ModelS 和 Model B 我将使用 Django Tables2 从这些模型中创建一个表 在tables py 中 您可以有两个单独的表类 如下 from models import ModelA ModelB
  • Python-social-auth使用Django服务器主机名和监听端口作为redirect_uri

    我正在将 python social auth 与 Django 一起使用 以使用 Oauth2 google oauth2 向 Google 进行身份验证 在我的模板中我使用了一些东西like https github com omab