如何设置app google登录和登录gmail的凭据

时间:2016-09-09 11:19:28

标签: django login gmail-api google-api-python-client

我的(Django)应用要求用户使用Google帐户登录。该应用的一项功能还包括通过Gmail API发送电子邮件。

到目前为止,我已经设置了Web application类型的凭证,可用于登录(最后一行)。

enter image description here

发送电子邮件不适用于此(“Web应用程序”)凭据,因为步骤暂停

2016-09-09 05:30:53,535 :Starting new HTTPS connection (1): accounts.google.com
2016-09-09 05:30:53,779 :Starting new HTTPS connection (1): www.googleapis.com

以上消息让我怀疑我的凭据不正确。我的问题是:

我是否需要在Google控制台中设置两组凭据(因此有两个client_secret.json个文件),一个用于登录,另一个用于通过Gmail API发送电子邮件?或者,我是否通过一些神秘的神奇颂歌将登录和Gmail-API身份验证与一个凭据挂钩?任何信息非常感谢。

1 个答案:

答案 0 :(得分:1)

通过python-social-auth在Django中添加其他范围不是开箱即用的,但也不是很难(two ways described here)。我选择了第一个选项并覆盖了get_scope方法。

views.py中,我设置了

flow = client.flow_from_clientsecrets(
    CLIENT_SECRET_FILE,
    scope=SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPES,
    redirect_uri='https://yourdomain.com/callbacklinkforgmail')

并且redirect_uri应与Google控制台中的重定向网址匹配。

请求权限是根据存储在某处的凭据完成的。在我的例子中,一个模型。

# model with variable/column 'credentials'
storage = Storage(YourModel, 'id', request.user, 'credentials')
            credential = storage.get()
            if credential is None or credential.invalid is True:
                flow.params['state'] = xsrfutil.generate_token(SOCIAL_AUTH_GOOGLE_OAUTH2_KEY,
                                                               request.user)
                authorize_url = flow.step1_get_authorize_url()
                return HttpResponseRedirect(authorize_url)
            else:
                http = credential.authorize(httplib2.Http())
                service = discovery.build('gmail', 'v1', http=http)

完成此步骤后,将redirect_uri重定向到确认匹配的函数。就我而言,这是views.py

@login_required
def auth_return(request):
    if not xsrfutil.validate_token(SOCIAL_AUTH_GOOGLE_OAUTH2_KEY, request.GET['state'].encode('utf-8'), request.user):
        return HttpResponseBadRequest()

    credential = flow.step2_exchange(request.GET)
    storage = Storage(YourModel, 'id', request.user, 'credentials')
    storage.put(credential)
    return HttpResponseRedirect("/")

并且我的应用的urls.py中的条目是

url(r'^callbacklinkforgmail/$', views.auth_return, name='mailsend')