在我的Django应用中使用python-social-auth
。
我正在努力让Google+身份验证正常运行,但Google+并未向我发送电子邮件。
我从Google获得的是:
dict: {'username': '',
'fullname': u'Alex Laban',
'last_name': u'Laban',
'email': '',
'first_name': u'Alex'}`
我的授权是围绕电子邮件构建的,因此,如果没有电子邮件,此Google+服务就毫无用处。
如何让Google收回电子邮件?
UPD:配置:
查看:
class MyView(TemplateView):
def get(self, request, *args, **kwargs):
plus_scope = ' '.join(GooglePlusAuth.DEFAULT_SCOPE)
plus_id = getattr(settings, 'SOCIAL_AUTH_GOOGLE_PLUS_KEY', None)
return render(request, 'login.html', {'form':form, 'plus_scope' : plus_scope, 'plus_id' : plus_id})
默认范围是'https://www.googleapis.com/auth/plus.login'
模板:
<div>
<form id="google-plus" method="post" action="{% url "social:complete" backend="google-plus" %}">{% csrf_token %}
<input id="at" type="hidden" name="access_token" value="" />
<input id="code" type="hidden" name="code" value="" />
<div id="signinButton">
<span class="g-signin" data-scope="{{ plus_scope }}"
data-clientid="{{ plus_id }}"
data-redirecturi="postmessage"
data-accesstype="offline"
data-cookiepolicy="single_host_origin"
data-callback="signInCallback">
</span>
</div>
</form>
<script src="https://plus.google.com/js/client:plusone.js?onload=start" type="text/javascript"></script>
<script type="text/javascript">
var signInCallback = function (result) {
if (result['error']) {
console.log(result);
} else {
$('#code').attr('value', result['code']);
$('#at').attr('value', result['access_token']);
$('#google-plus').submit();
}
};
</script>
</div>
设定:
SOCIAL_AUTH_ADMIN_USER_SEARCH_FIELDS = ['email', 'name']
SOCIAL_AUTH_STRATEGY = 'social.strategies.django_strategy.DjangoStrategy'
SOCIAL_AUTH_STORAGE = 'social.apps.django_app.default.models.DjangoStorage'
USERNAME_IS_FULL_EMAIL = True
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',
# 'social.pipeline.debug.debug'
)
SOCIAL_AUTH_GOOGLE_PLUS_KEY = 'top-secret.apps.googleusercontent.com'
SOCIAL_AUTH_GOOGLE_PLUS_SECRET = 'try-guess'
# Application definition
INSTALLED_APPS = (
'social.apps.django_app.default',
)
AUTHENTICATION_BACKENDS = (
'social.backends.google.GooglePlusAuth',
'social.backends.google.GoogleOAuth2',
'django.contrib.auth.backends.ModelBackend',
)
TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.contrib.auth.context_processors.auth',
'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect',
)
MIDDLEWARE_CLASSES = (
...
'social.apps.django_app.middleware.SocialAuthExceptionMiddleware',
)
Google Developers Console
启用Google+ API
Web应用程序的客户端ID 生成为:
http://localhost:8000/complete/google-plus/
http://localhost:8000
公共API访问。我不确定是否需要,但以防万一有两把钥匙:
http://localhost:8000/
但我想它并没有在任何地方使用......
想法?可以在google网站上我在开发者控制台中错误配置了什么吗?
答案 0 :(得分:0)
我想,我想出来了。
默认范围必须使用https://www.googleapis.com/auth/userinfo.email
这将迫使谷歌也回复电子邮件。
谢谢。