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

我正在将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中进行检查).

上一篇:mongodb学习(二)分级查询数组中的值


下一篇:java-JBoss Picketlink-使用自定义用户模型验证失败