问题描述
我已经用Allauth实现了django rest auth,如果我通过Google access_token
登录,它也可以正常工作,但是有些情况下某些客户端设备需要通过Google <$登录c $ c> id_token 。
如果我使用 id_token
而不是 access_token
I have implemented django rest auth with Allauth and its working fine if I login through google access_token
but there is a case when some client device need to login by google id_token
.I am getting error if I use id_token
instead of 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,发行人,随机数,范围,user_id,verified_email)。因此,如果您的用户表需要电话和名称,则可以将其设置为空的 name =''
等。为此您可以使用以下代码。
For using id_token you will get only these fileds (access_type, audience, email, email_verified, expires_in, issued_at, issued_to, issuer, nonce, scope, user_id, verified_email). So if your user table required phone and name you can set the to empty name=''
etc. For this you can use the following code.
将用户模型必填字段设置为空以覆盖 id_token 用例
Set user model required fields to empty for covering id_token case
这取决于您的用户模型,在我的情况下,我们需要电话和姓名,因此将其设置为空。如果您不这样做,将会遇到约束失败错误。
It depends upon your user model, in my case we need both phone and name so I have set them empty. If you don't do this you will get failed constraints errors.
../ 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。稍后,我强迫用户更新其详细信息(用户名,名称,电话等)。
I have set the username to user id obtained from social platform api. Later I am forcing user to update its details (username, name, phone etc).
这篇关于使用Allauth的Django rest auth的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!