Как использовать django-allauth для Google API?
Как django-allauth реализовано получение авторизации с использованием Oauth2 для Google API (в моем случае Gmail API)? Кроме того, я собираюсь реализовать это отдельно от использования django-allauth, чтобы пользователи могли входить в систему с помощью Google, поэтому мне нужно будет сохранить это отдельно, а также вызвать его в представлении.
Спасибо!
Я предполагаю, что вы уже ознакомились с этим документом и этим и выполнили все необходимые первичные настройки.
Затем вы можете использовать django-allauth для настройки аутентификации через Google с сохранением токенов. Укажите необходимые параметры для gmail scope. Затем используйте эти токены для работы с GmailAPI.
Сначала вам нужно установить некоторые настройки, это описано в этом документе (SOCIALACCOUNT_STORE_TOKENS константа). Примерно так:
# settings.py
SOCIALACCOUNT_STORE_TOKENS = True
SOCIALACCOUNT_EMAIL_AUTHENTICATION = True
SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT = True
Также настройте “access_type”: “offline” в настройках поставщика google, как описано здесь:
Вы должны установить для
AUTH_PARAMS['access_type']значениеoffline, чтобы получать токен обновления при первом входе в систему и при запросах повторной аутентификации (который необходим для обновления токенов аутентификации в фоновом режиме, без участия браузера пользователя). Если этот параметр не указан, Google по умолчанию используетonline.
Теперь, после того как пользователь войдет в вашу систему через учетную запись google, будет создана запись в базе данных с его учетными записями access_token и refresh_token (token_secret in db_table). Вы можете проверить это в интерфейсе администратора в этой таблице:
Чтобы использовать GmailAPI, вам нужен google идентификатор пользователя и его access_token, это можно найти следующим образом:
def get_user_google_tokens(request: HttpRequest, limit: int = 1) -> list[dict]:
from allauth.socialaccount.models import SocialToken
from django.db import models
user_google_tokens = list(
SocialToken.objects
.filter(account__provider='google', account__user_id=request.user.pk)
.annotate(google_user_id=models.F('account__uid'))
.order_by('-expires_at')
.values('token', 'token_secret', 'expires_at', 'google_user_id')[:limit]
)
print(user_google_tokens)
# [
# {'token': '...',
# 'token_secret': '...',
# 'expires_at': datetime.datetime(2025, 2, 7, 16, 38, 16, 611588, tzinfo=datetime.timezone.utc),
# 'google_user_id': '...'}
# ]
return user_google_tokens
Обратите внимание, что по умолчанию access_token действует недолго - один час. Подробнее об этом можно прочитать здесь. Когда срок действия вашего access_token истечет, вам нужно будет обновить его, используя refresh_token (token_secret), и записать новый access_token в базу данных, изменив существующую запись. Вот пример того, как выполнить обновление. Также обратите внимание, что иногда вы не сможете обновить токены с помощью refresh_token.
Вот пример запроса на обновление токена с использованием Postman. Но вы, вероятно, будете использовать какую-нибудь библиотеку для http запросов на python. Или какой-нибудь готовый клиент, если уж на то пошло. django-allauth похоже, он не может обновлять токены, но я точно не знаю, я этого не проверял.

