3

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

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

它正确地创建了一个A指向正确登录 url 的元素。问题是,djangorunserver在 Apache 后面使用ProxyPassand选项运行ProxyPassReverse(也尝试使用 nginxproxy_pass选项,而不是 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在这里,我可以看到

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
) 

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

有什么帮助吗?

最好的

4

2 回答 2

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'

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

SOCIAL_AUTH_SANITIZE_REDIRECTS = False

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

于 2014-01-22T22:26:02.463 回答
-1

我有 Django 1.9 和 python-socail-auth 0.2.13

设置.py:

INSTALLED_APPS = [
  ...
  'social.apps.django_app.default',
]

SOCIAL_AUTH_RAISE_EXCEPTIONS = True
RAISE_EXCEPTIONS = True

AUTHENTICATION_BACKENDS = (
  'social.backends.google.GoogleOAuth2',
  'django.contrib.auth.backends.ModelBackend',
)

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '***'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '***'

SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.social_details',
'social.pipeline.social_auth.social_uid',
'social.pipeline.social_auth.auth_allowed',
'social.pipeline.social_auth.social_user',
'social.pipeline.user.get_username',
'social.pipeline.social_auth.associate_by_email',  
'social.pipeline.user.create_user',
'social.pipeline.social_auth.associate_user',
'social.pipeline.social_auth.load_extra_data',
'social.pipeline.user.user_details',
)

网址.py:

urlpatterns = [
  ...
  url(r'', include('social.apps.django_app.urls', namespace='social')),
  url(r'', include('django.contrib.auth.urls', namespace='auth')),
]

在模板中:

 <a href="{% url 'social:begin' 'google-oauth2' %}?next={% url 'dashboard' %}">Google</a> |

Google Developers Console -> 应用程序 -> 凭据 -> OAuth 2.0 客户端 ID-> Web 应用程序的客户端 ID:

Authorized JavaScript origins: 
  http://127.0.0.1:8000

Authorized redirect URIs: 
  http://127.0.0.1:8000
  http://127.0.0.1:8000/complete/google-oauth2/
于 2015-12-24T04:45:34.477 回答