Проверка токена Google ID в Django - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть приложение React Native Android, которое использует Google Sign-In для получения профиля пользователя и информации электронной почты, а также создает идентификационный токен (используя https://github.com/react-native-community/google-signin). Вход в систему работает, и я показываю имя пользователя, адрес электронной почты, фотографию и т. Д. c в приложении.

Затем я пытаюсь отправить токен идентификатора на сервер Django + DRF, чтобы он мог быть подтвержден и соответствующая учетная запись пользователя создана и / или вошли в систему. Я следую инструкциям здесь: https://developers.google.com/identity/sign-in/web/backend-auth

Вот мой код для конечной точки. На данный момент я только что скопировал токен идентификатора, созданный приложением, и отправил его бэкэнду через Почтальон.

class GoogleView(APIView):
    def post(self, request):
        token = {'idToken': request.data.get('idToken')}
        print(token)

        try:
            idinfo = id_token.verify_oauth2_token(token, requests.Request(), MY_APP_CLIENT_ID)
            print(idinfo)

            if idinfo['iss'] not in ['accounts.google.com', 'https://accounts.google.com']:
                raise ValueError('Wrong issuer.')

            return Response(idinfo)
        except ValueError:
            # Invalid token
            content = {'message': 'Invalid token'}
            return Response(content)

Когда я отправляю запрос POST, выполняется первый оператор печати, подтверждающий, что токен получен правильно. Однако второй оператор print никогда не выполняется, и я всегда получаю ответ «Неверный токен». Итак, я считаю, что verify_oauth2_token как-то не работает, но он больше не дает мне информации.

Я никогда раньше не пользовался Google Sign In, поэтому вполне возможно, что я пропустил что-то очевидное. Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 13 апреля 2020

Решил это сам с помощью друга. Просто пришлось изменить обработку исключений, чтобы отобразить соответствующую ошибку, а затем передать токен ['id_token'] вместо полного указания токена. Новый код:

class GoogleView(APIView):
    def post(self, request):
        token = {'id_token': request.data.get('id_token')}
        print(token)

        try:
            # Specify the CLIENT_ID of the app that accesses the backend:
            idinfo = id_token.verify_oauth2_token(token['id_token'], requests.Request(), MY_APP_CLIENT_ID)
            print(idinfo)

            if idinfo['iss'] not in ['accounts.google.com', 'https://accounts.google.com']:
                raise ValueError('Wrong issuer.')

            return Response(idinfo)
        except ValueError as err:
            # Invalid token
            print(err)
            content = {'message': 'Invalid token'}
            return Response(content)
...