Python Oauth2 - login with Google

前端 未结 1 1372
执念已碎
执念已碎 2020-12-12 16:35

I have been searching for 2 days for an answer, but nothing came up.

I am trying to make integrate Oauth2 for login with Google on Django. The code I have throws an

相关标签:
1条回答
  • 2020-12-12 17:11

    After a long time, and many hours spent gone to waste, I gave up with OAuth2 since it is difficult to configure, and all I need is to log a user in. The following code should help someone who needs to do something similar, and can be customized. All I did was follow the instructions on forming the urls and such here -> https://developers.google.com/accounts/docs/OAuth2Login

    I made two views (for anyone not using Django - pages) and made a link to the first one: This page I called login/google and made a link to it from the login page.

    def google_login(request):
        token_request_uri = "https://accounts.google.com/o/oauth2/auth"
        response_type = "code"
        client_id = XXXXXX-your_client_id
        redirect_uri = "http://mysite/login/google/auth"
        scope = "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email"
        url = "{token_request_uri}?response_type={response_type}&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}".format(
            token_request_uri = token_request_uri,
            response_type = response_type,
            client_id = client_id,
            redirect_uri = redirect_uri,
            scope = scope)
        return HttpResponseRedirect(url)
    

    The above code redirected to the second page (this page must be defined as a redirect uri in the google app definitions). I called this page login/google/auth:

    def google_authenticate(request):
        parser = Http()
        login_failed_url = '/'
        if 'error' in request.GET or 'code' not in request.GET:
            return HttpResponseRedirect('{loginfailed}'.format(loginfailed = login_failed_url))
    
        access_token_uri = 'https://accounts.google.com/o/oauth2/token'
        redirect_uri = "http://mysite/login/google/auth"
        params = urllib.urlencode({
            'code':request.GET['code'],
            'redirect_uri':redirect_uri,
            'client_id':XXXXX_your_google_key,
            'client_secret':XXXXX_your_google_secret,
            'grant_type':'authorization_code'
        })
        headers={'content-type':'application/x-www-form-urlencoded'}
        resp, content = parser.request(access_token_uri, method = 'POST', body = params, headers = headers)
        token_data = jsonDecode(content)
        resp, content = parser.request("https://www.googleapis.com/oauth2/v1/userinfo?access_token={accessToken}".format(accessToken=token_data['access_token']))
        #this gets the google profile!!
        google_profile = jsonDecode(content)
        #log the user in-->
        #HERE YOU LOG THE USER IN, OR ANYTHING ELSE YOU WANT
        #THEN REDIRECT TO PROTECTED PAGE
        return HttpResponseRedirect('/dashboard')
    

    I really hope this helps people out there, and saves them the hours I wasted. Comments on the code are more than welcome!

    0 讨论(0)
提交回复
热议问题