我正在将python-social-auth与Django一起使用Oauth2(google-oauth2)与Google进行身份验证.在我的模板中,我使用like:
<a href="{% url "begin:social" "google-oauth2" %}">Login</a>
并正确创建一个指向正确登录URL的A元素.事实是,django在带有ProxyPass和ProxyPassReverse的Apache后面以runserver选项运行(也尝试了带proxy_pass选项的nginx,而不是fcgi).
在这种情况下,我有两个问题;首先,在创建身份验证请求时,python-social-auth将参数redirect_uri发送为localhost:8000,因此我在settings.py上执行了此操作:
AUTH_EXTRA_ARGUMENTS = {'redirect_uri': 'http://myapp.com'}
如果我将localhost:8000作为redirect_uri发送,它将绕过Google返回的“错误请求”响应.
然后,在python-social-auth oauth.py,here中,我可以看到
self.auth_complete_params(self.validate_state())
正在将相同的错误redirect_uri发送给Google.所以我做了一些丑陋的事情:
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
)
所以,这就是我目前的解决方案.我只是不了解如何以更优雅的方式或“正确”的方式进行此操作.
有什么帮助吗?
最好
解决方法:
如果我做对了,那么问题是python-social-auth创建了错误的redirect_uri以发送给auth提供程序.它总是发送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
(也可以通过提示其build_absolute_uri()方法有关使用哪个域的方法来在整个Django中修复此问题.这涉及堆栈的更多部分,但请在this answer中进行检查).