使用django allAuth

时间:2017-01-28 18:41:14

标签: django gmail django-allauth

我是Auth的新手,所以我遇到了问题。我已将allAuth连接到我的django应用程序,使用“socialaccount.providers.google”,我创建了谷歌应用程序,通过它授权,现在我想请求来自Gmail的传入电子邮件列表,我真的无法理解到哪里去把所有这些秘密密钥和令牌放在请求中。

P.S。对不起这个愚蠢的问题。

1 个答案:

答案 0 :(得分:1)

这是一个古老的问题,没有视图和活动,但是由于某种原因,我在谷歌搜索时很快找到了它。我认为这对某人可能会有帮助。

首先:您需要使用服务器端流程,并且需要类型为“ Web应用程序”的OAuth 2 Clien ID(但要视情况而定)。 通过服务器端流程,您必须与服务器上的访问/刷新令牌交换Google的身份验证代码。

这是执行所需操作的基本django-allauth conf:

SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'SCOPE': [
            'profile',
            'email',
            'https://www.googleapis.com/auth/gmail.readonly',
        ],
        'AUTH_PARAMS': {
            'access_type': 'offline',  # to request refresh_token from Google 
        }
    }
}

然后获取API服务(又称为API客户端)的基本逻辑:

from allauth.socialaccount.models import SocialToken, SocialApp
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build

def get_gmail_service(token: SocialToken):
    # SocialToken.token_secret is a refresh token in case of Google
    assert token.token_secret, 'Can not use SocialToken without refresh token!'

    google_app = SocialApp.objects.filter(provider='google').first()
    assert google_app, 'Must create SocialApp for google provider first!'

    # this is simple example, but you need to use some credentials storage 
    # instead of SocialToken or manage how to sync creads data to SocialToken
    credentials = Credentials(
         token=token.token,
         refresh_token=token.token_secret,
         token_uri='https://oauth2.googleapis.com/token',
         client_id=google_app.client_id,
         client_secret=google_app.secret)

    return build('gmail', 'v1', credentials=credentials)

要测试您的服务,

service = get_gmail_service(SocialToken.objects.first())
try:
    res = service.users().messages().list(userId='me', maxResults=1).execute()
except HttpError as err:
    print('GMAIL ACCESS CHECK ERROR:', err)
else:
    print('GMAIL SUCCESS!')