我已經實現Django的休息權威性與Allauth及其工作很好,如果我登錄通過谷歌access_token
但有一個情況下,當一些客戶端設備需要通過谷歌id_token
登錄。 如果我使用id_token
代替access_token
Django的休息權威性與Allauth
{
"non_field_errors": [
"Incorrect value"
]
}
請幫我
我已經實現Django的休息權威性與Allauth及其工作很好,如果我登錄通過谷歌access_token
但有一個情況下,當一些客戶端設備需要通過谷歌id_token
登錄。 如果我使用id_token
代替access_token
Django的休息權威性與Allauth
{
"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將只得到這些的Fileds(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的新手。只是得到事情的竅門。請讓我知道在哪裏做出這些改變?應該寫一個基於allauth的自定義提供程序嗎? – pravin
你需要自定義django-allauth庫本身。 –
你能給更多的背景嗎?請求載荷?網址是什麼?等等 – mariodev
你有沒有想過這個? – Brendan
我得到了同樣的錯誤。 –