python-social-auth not getting correct Google OAuth2 details

前端 未结 4 821

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:15

    Just wanted to share an alternative way of doing this. This example is quite primitive and doesn't cover all cases (e.g. failed authentication). However, it should give enough insight into how OAuth2 authentication can be done.

    Obtain CLIENT ID

    Obtain a CLIENT ID from OAuth2 service provider (e.g. Google) and configure redirect URLs.

    I assume you have already done this.

    Create a login / registration link

    You need to generate a login / registration link in your view. It should be something like this:

    https://accounts.google.com/o/oauth2/auth?response_type=code&client_id={{CLIENT_ID}}&redirect_uri={{REDIRECT_URL}}&scope=email
    

    Replace {{CLIENT_ID}} and {{REDIRECT_URL}} with the details you obtained in the previous step.

    Create a new view

    In urls.py add something like:

    url(r'^oauth2/google/$', views.oauth2_google),
    

    In your views.py create a method:

    def oauth2_google(request):
    
        # Get the code after a successful signing
        # Note: this does not cover the case when authentication fails
        CODE = request.GET['code']
    
        CLIENT_ID = 'xxxxx.apps.googleusercontent.com' # Edit this
        CLIENT_SECRET = 'xxxxx' # Edit this
        REDIRECT_URL = 'http://localhost:8000/oauth2/google' # Edit this
    
        if CODE is not None:
            payload = {
                'grant_type': 'authorization_code', 
                'code': CODE, 
                'redirect_uri': REDIRECT_URL, 
                'client_id': CLIENT_ID, 
                'client_secret': CLIENT_SECRET
                }
    
            token_details_request = requests.post('https://accounts.google.com/o/oauth2/token', data=payload)
            token_details = token_details_request.json()
            id_token = token_details['id_token']
            access_token = token_details['access_token']
    
            # Retrieve the unique identifier for the social media account
            decoded = jwt.decode(id_token, verify=False)
            oauth_identifier = decoded['sub']
    
            # Retrieve other account details
            account_details_request = requests.get('https://www.googleapis.com/plus/v1/people/me?access_token=' + access_token)
            account_details = account_details_request.json()
            avatar = account_details['image']['url']
    
            # Check if the user already has an account with us
            try:
                profile = Profile.objects.get(oauth_identifier=oauth_identifier)
                profile.avatar = avatar
                profile.save()
                user = profile.user
            except Profile.DoesNotExist:
                user = User.objects.create_user()           
                user.save()
                profile = Profile(user=user, oauth_identifier=oauth_identifier, avatar=avatar)
                profile.save()
    
            user.backend = 'django.contrib.auth.backends.ModelBackend'
            login(request, user)
    
            return redirect('/')
    

    You might need the following imports:

    from django.shortcuts import redirect
    import jwt # PyJWT==0.4.1
    import requests # requests==2.5.0
    import json
    

提交回复
热议问题