Интеграция google oauth для системы входа/регистрации на gmail

Я разрабатываю приложение, которое будет доступно как в приложении, так и в вебе. Я хочу, чтобы мои клиенты могли входить/регистрироваться и через gmail. Для этого мне нужно интегрировать систему google auth для социальных логинов. Моя конечная цель - установить соединение с google и извлечь из него данные пользователя, такие как имя, profile_pic, dob, sub.

Я следовал приведенному ниже подходу для своего приложения, и оно сработало.

from google.oauth2 import id_token
from google.auth.transport import requests
id_info = id_token.verify_oauth2_token(token, requests.Request(), google_client_id)
print(id_info['sub'], id_info['email'])

это отлично работает для приложения и предоставляет мне все пользовательские данные.

Теперь, когда я пытаюсь сделать это для веб, из всех способов, которые я смог найти, я попробовал использовать вызовы API google, как показано ниже

В веб-версии мы получаем код в запросе callback API от google в качестве параметра запроса. В обмен на этот код мы должны получить от google auth-токен и затем использовать этот токен для получения данных пользователя. (Вот как это работает, насколько я понимаю)

 data = {
            'code': code,
            'client_id': my_client_id,
            'client_secret': my_client_secret_key,
            'redirect_uri': redirect_uri,
            'grant_type': 'authorization_code'
        }
    response = requests.post('https://oauth2.googleapis.com/token', data=data)
    if not response.ok:
        logger.info('Could not get access token from Google.')
        return

    access_token = response.json()['access_token']
    response2 = requests.get(
                'https://www.googleapis.com/oauth2/v2/userinfo',
                params={'access_token': access_token}
            )
    return response2.json()

Теперь в этом чанке я могу получить данные пользователя, если я передаю любой access_token. Но проблема заключается в том, что при получении access_token из кода с помощью этого кода. Я получаю ответ в виде

{'error': 'invalid_grant', 'error_description': 'Bad Request'}

или

{'error': 'unauthorized_client', 'error_description': 'Unauthorized'}

Где я совершаю ошибку. P.S. Мои учетные данные верны.

Для интеграции социальных аутентификаторов следует использовать встроенные приложения Django. Это намного проще для одновременной реализации всех третьих сторон.

    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google',
Вернуться на верх