【问题标题】:Verifying a Google ID Token in Django在 Django 中验证 Google ID 令牌
【发布时间】:2020-07-25 23:27:43
【问题描述】:

我有一个 React Native Android 应用程序,它使用 Google 登录来获取用户个人资料和电子邮件信息并生成一个 ID 令牌(使用 https://github.com/react-native-community/google-signin)。登录成功,我在应用程序上显示用户名、电子邮件、照片等。

然后我尝试将 ID 令牌发送到 Django + DRF 后端,以便对其进行验证并创建和/或登录相关的用户帐户。我按照此处的说明进行操作:https://developers.google.com/identity/sign-in/web/backend-auth

这是我的端点代码。目前我只是在复制应用程序生成的 ID 令牌并通过 Postman 将其发送到后端。

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 请求时,第一个打印语句会运行以确认令牌已正确接收。然而,第二个打印语句永远不会运行,我总是得到“无效令牌”响应。所以,我相信 verify_oauth2_token 以某种方式失败,但它不再给我任何信息。

我以前从未使用过 Google 登录,所以我完全有可能错过了一些明显的东西。非常感谢任何帮助!

【问题讨论】:

    标签: python django react-native django-rest-framework google-signin


    【解决方案1】:

    在朋友的帮助下自己解决了这个问题。只需更改异常处理以显示相关错误,然后传递 token['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)
    

    【讨论】:

    • 如何路由到这个 http 处理程序? (又名你在 urls.py 中做什么?)
    • 嗨,对不起,我刚刚看到你的问题,这可能为时已晚,无法提供帮助,但这就是我在 urls.py 中路由到视图的方式:urlpatterns = [ path('api/token/google/', views.GoogleView.as_view(), name='token_obtain_pair_google'), ]
    • 您在 view.py 文件中导入的包是什么?我的意思是例如from rest_framework.views import APIView?对于上面的类视图
    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2016-08-11
    • 2015-06-27
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多