python-social-auth not getting correct Google OAuth2 details

前端 未结 4 827

I want to login a user using the python-social-auth functionality for Google Plus signin in Django. When logging in from my website, everything works fine and the c

4条回答
  •  花落未央
    2021-02-08 19:24

    I have a project (not running actually) with google oauth2 authentication. I leave here my config file so it may be useful to you (I was only using oauth2 so some things may vary):

    AUTHENTICATION_BACKENDS = (
        'social.backends.google.GoogleOAuth2',  # /google-oauth2
        'django.contrib.auth.backends.ModelBackend',
    )
    SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'your google oauth 2 key'
    SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'your secret google oauth 2 key'
    
    SOCIAL_AUTH_PIPELINE = (
        'social.pipeline.social_auth.social_details',
        'social.pipeline.social_auth.social_uid',
        'social.pipeline.social_auth.auth_allowed',
        'social.pipeline.social_auth.associate_by_email',
        'social.pipeline.social_auth.social_user',
        'social.pipeline.user.get_username',
        'social.pipeline.user.create_user',
        'social.pipeline.social_auth.associate_user',
        'social.pipeline.social_auth.load_extra_data',
        'social.pipeline.user.user_details'
    )
    

    I attach the view also (note that I'm using django rest framework).

    class ObtainAuthToken(APIView):
        permission_classes = (permissions.AllowAny,)
        serializer_class = AuthTokenSerializer
        model = Token
    
        # Accept backend as a parameter and 'auth' for a login / pass
        def post(self, request, backend):
    
            if backend == 'auth':  # For admin purposes
                serializer = self.serializer_class(data=request.DATA)
                if serializer.is_valid():
                    token, created = Token.objects.get_or_create(user=serializer.object['user'])
                    return Response({'token': token.key})
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
            else:
                # Here we call PSA to authenticate like we would if we used PSA on server side.
                user = register_by_access_token(request, backend)
    
                # If user is active we get or create the REST token and send it back with user data
                if user and user.is_active:
                    token, created = Token.objects.get_or_create(user=user)
                    return Response({'id': user.id, 'name': user.username, 'token': token.key})
                else:
                    return Response("Bad Credentials, check the Access Token and/or the UID", status=403)
    
    
    @strategy('social:complete')
    def register_by_access_token(request, backend):
        # This view expects an access_token GET parameter
        token = request.GET.get('access_token')
        backend = request.strategy.backend
        user = backend.do_auth(access_token=token, backend=backend)
        if user:
            # login(request, user) #Only useful for web..
            return user
        else:
            return None
    

    and in the urls.py:

    urlpatterns = patterns(
        '',
        url(r'^login/(?P[\w-]+)$', ObtainAuthToken.as_view(), ),
    )
    

    Sorry for attaching all this code and not providing a specific answer but more data is needed because the error can come from many sources (bad api keys, bad settings configuration, pipeline..). I hope the code helps.

提交回复
热议问题