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

lic*_*rna 3 python authentication django oauth

我正在使用 python-social-auth 和 Django 使用 Oauth2 (google-oauth2) 向 Google 进行身份验证。在我的模板中,我使用了类似的东西:

<a href="{% url "begin:social" "google-oauth2" %}">Login</a>
Run Code Online (Sandbox Code Playgroud)

它正确地创建了一个A指向正确登录 url的元素。问题是,djangorunserver在 Apache 后面使用ProxyPass和选项运行ProxyPassReverse(还尝试了带proxy_pass选项的nginx ,而不是 fcgi)。

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

AUTH_EXTRA_ARGUMENTS = {'redirect_uri': 'http://myapp.com'}
Run Code Online (Sandbox Code Playgroud)

如果我localhost:8000作为redirect_uri发送,它会绕过返回的“错误请求”谷歌响应。

然后,在 python-social-auth oauth.py在这里,我可以看到

self.auth_complete_params(self.validate_state())
Run Code Online (Sandbox Code Playgroud)

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
) 
Run Code Online (Sandbox Code Playgroud)

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

有什么帮助吗?

最好的事物

Tra*_*son 5

如果我猜对了,问题是 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'
Run Code Online (Sandbox Code Playgroud)

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

SOCIAL_AUTH_SANITIZE_REDIRECTS = False
Run Code Online (Sandbox Code Playgroud)

(也可以通过向Django提供build_absolute_uri()有关使用哪个域的方法的提示来解决整个 Django的问题。这涉及到更多的堆栈部分,但请在此答案中查看)。

  • 额外提示:将`USE_X_FORWARDED_HOST = True`添加到您的settings.py中,以允许Django检查X_FORWARDED_HOST值以获取真实主机。 (2认同)
  • 使用 FQDN 定义任何 URL 设置并禁用清理并不是正确的方法。使用 @MichaelButler 提到的“USE_X_FORWARDED_HOST”。 (2认同)