4

我已经实现Django的休息权威性与Allauth及其工作很好,如果我登录通过谷歌access_token但有一个情况下,当一些客户端设备需要通过谷歌id_token登录。 如果我使用id_token代替access_tokenDjango的休息权威性与Allauth

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

请帮我

+0

你能给更多的背景吗?请求载荷?网址是什么?等等 – mariodev

+0

你有没有想过这个? – Brendan

+0

我得到了同样的错误。 –

回答

0

更新您的文件,如

../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。后来我强迫用户更新其详细信息(用户名,姓名,电话等)。

+0

嘿..我是django的新手。只是得到事情的窍门。请让我知道在哪里做出这些改变?应该写一个基于allauth的自定义提供程序吗? – pravin

+0

你需要自定义django-allauth库本身。 –