社会认证,谷歌+,没有电子邮件回复

时间:2014-11-13 20:55:35

标签: django authentication python-social-auth

在我的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 生成为:

  • 重定向URIS:http://localhost:8000/complete/google-plus/
  • Javascript Origins http://localhost:8000

公共API访问。我不确定是否需要,但以防万一有两把钥匙:

  • 服务器应用程序密钥,IP为127.0.0.1
  • 浏览器应用程序的密钥与参与者http://localhost:8000/

但我想它并没有在任何地方使用......

想法?可以在google网站上我在开发者控制台中错误配置了什么吗?

1 个答案:

答案 0 :(得分:0)

我想,我想出来了。

默认范围必须使用https://www.googleapis.com/auth/userinfo.email

进行扩展

这将迫使谷歌也回复电子邮件。

谢谢。