gpt4 book ai didi

django - python-social-auth 未获取正确的 Google OAuth2 详细信息

转载 作者:行者123 更新时间:2023-12-02 06:01:46 25 4
gpt4 key购买 nike

我想使用 Django 中的 Google Plus 登录的 python-social-auth 功能来登录用户。从我的网站登录时,一切正常,并且正确的详细信息已添加到数据库中。

但是,我也想从我的 Android 应用程序进行身份验证。用户登录应用程序,然后应用程序将访问 token 发送到 django API,该 API 在以下代码中处理登录过程,改编自 the documentation :

@csrf_exempt
@serengeti_api_request
@psa('social:complete')
def login_social_token(request, backend):
# Ensure the token has been specified.
token = request.META.get('HTTP_ACCESSTOKEN')
if token is None:
raise SerengetiApiRequestException('Access token is missing!')

# Login the user for this session
user = request.backend.do_auth(token)
if user is None:
raise SerengetiApiRequestException('Could not authenticate user!')

login(request, user)

# Store the email address if one has been specified (e.g. Twitter)
email = request.META.get('HTTP_EMAIL')
if email is not None:
user.email = email
user.save()

# Prepare the parameters to be returned
response = dict({
'id': user.id,
'first_name': user.first_name,
'last_name': user.last_name,
'api_key': request.session.session_key,
})

# Return a 200 status code to signal success.
return HttpResponse(json.dumps(response, indent=4), status=200)

从网站登录时,social_auth_usersocialauth 表包含:

id | provider      | uid       | extra_data
==========================================
10 | google-oauth2 | <myemail> | {"token_type": "Bearer", "access_token": "<token>", "expires": 3600}

但是,当使用上述函数从应用程序登录时,操作完成正常,但表中的条目如下所示:

id | provider      | uid     | extra_data
=========================================
10 | google-oauth2 | <empty> | {"access_token": "", "expires": null}

此外,auth_user 表包含一个用户名(如 eeed494412obfuscated48bc47dd9b),而不是 Google Plus 用户名和电子邮件字段为空。

我做错了什么以及如何获得与网站上相同的功能?

我想提一下,我已经从 Android 应用程序实现了 Facebook 和 Twitter 身份验证,它们调用上述函数并存储正确的详细信息,只有 Google Plus 导致了问题。

最佳答案

只是想分享一种替代方法。这个例子非常原始,并没有涵盖所有情况(例如身份验证失败)。但是,它应该足以深入了解如何完成 OAuth2 身份验证。

获取客户端ID

从 OAuth2 服务提供商(例如 Google)获取客户端 ID 并配置重定向 URL。

我假设您已经完成了此操作。

创建登录/注册链接

您需要在您的 View 中生成登录/注册链接。应该是这样的:

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

{{CLIENT_ID}}{{REDIRECT_URL}} 替换为您在上一步中获得的详细信息。

创建新 View

urls.py中添加如下内容:

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

在您的views.py中创建一个方法:

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('/')

您可能需要以下导入:

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

关于django - python-social-auth 未获取正确的 Google OAuth2 详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com