gpt4 book ai didi

django-rest-framework - Django 使用 Allauth 进行休息验证

转载 作者:行者123 更新时间:2023-12-04 15:52:56 28 4
gpt4 key购买 nike

我已经使用 Allauth 实现了 django rest auth 并且如果我通过谷歌登录它工作正常 access_token但是有一种情况,某些客户端设备需要通过谷歌登录id_token .
如果我使用 id_token 会出错而不是 access_token

{
"non_field_errors": [
"Incorrect value"
]
}

请帮帮我

最佳答案

更新您的文件,例如
../allauth/socialaccount/providers/google/provider.py :

class GoogleProvider(OAuth2Provider):
....

def extract_uid(self, data):
try:
return str(data['id'])
except KeyError:
return str(data['user_id'])
../allauth/socialaccount/providers/google/views.py :
class GoogleOAuth2Adapter(OAuth2Adapter):
provider_id = GoogleProvider.id
access_token_url = 'https://accounts.google.com/o/oauth2/token'
authorize_url = 'https://accounts.google.com/o/oauth2/auth'
profile_url = 'https://www.googleapis.com/oauth2/v1/userinfo'
token_url = 'https://www.googleapis.com/oauth2/v1/tokeninfo'

def complete_login(self, request, app, token, **kwargs):
if 'rest-auth/google' in request.path:
print('rest-auth api')
# /api/rest-auth/google
# but not for website login with google
resp = requests.get(self.token_url,
params={'id_token': token.token,
'alt': 'json'})
else:
print('else else rest-auth api')
resp = requests.get(self.profile_url,
params={'access_token': token.token,
'alt': 'json'})
resp.raise_for_status()
extra_data = resp.json()
login = self.get_provider() \
.sociallogin_from_response(request,
extra_data)
return login


oauth2_login = OAuth2LoginView.adapter_view(GoogleOAuth2Adapter)
oauth2_callback = OAuth2CallbackView.adapter_view(GoogleOAuth2Adapter)

对于使用 id_token,您将只获得这些文件(access_type、受众、电子邮件、email_verified、expires_in、issued_at、issued_to、issuer、nonce、scope、user_id、verified_email)。因此,如果您的用户表需要 电话 姓名 您可以将其设置为空 name=''等等。为此,您可以使用以下代码。

将用户模型必填字段设置为空以覆盖 id_token 案件

这取决于您的用户模型,在我的情况下,我们需要电话和姓名,因此我将它们设置为空。如果你不这样做,你会得到失败的约束错误。
../allauth/socialaccount/providers/base.py
class Provider(object):
def sociallogin_from_response(self, request, response):
....
common_fields = self.extract_common_fields(response)
common_fields['name'] = common_fields.get('name', '')
common_fields['phone'] = common_fields.get('phone', '')
common_fields['username'] = uid
....

我已将用户名设置为从社交平台 api 获取的用户 ID。后来我强制用户更新其详细信息(用户名、姓名、电话等)。

关于django-rest-framework - Django 使用 Allauth 进行休息验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42454082/

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