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)
所以,这就是我目前的解决方案。我只是不明白如何以更优雅的方式或“正确”的方式做到这一点。
有什么帮助吗?
最好的事物
如果我猜对了,问题是 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的问题。这涉及到更多的堆栈部分,但请在此答案中查看)。
| 归档时间: |
|
| 查看次数: |
3156 次 |
| 最近记录: |