【问题标题】:Generate access token using user instance (not username, password and grant_type)使用用户实例(不是用户名、密码和授权类型)生成访问令牌
【发布时间】:2020-03-27 11:04:57
【问题描述】:

我正在使用 Django REST Framework 并使用此库为前端应用程序提供基于令牌的身份验证。

有使用django-allauth插件的Google实现登录。

我想在用户使用社交帐户登录时生成访问令牌。

为了处理社交登录和生成社交帐户,我创建了这个视图。

class GoogleLoginView(LoginView):
    """
    Enable login using google
    """
    adapter_class = GoogleOAuth2Adapter
    serializer_class = CustomSocialLoginSerializer

    def login(self):
        self.user = self.serializer.validated_data['user']
        self.token = TokenView().create_token_response(self.request)
        return self.token

    def post(self, request, *args, **kwargs):
        self.request = request
        self.serializer = self.get_serializer(
            data=self.request.data,
            context={'request': request}
        )
        self.serializer.is_valid(raise_exception=True)

        url, header, body, status_ = self.login()
        return Response(json.loads(body), status=status_)

请求数据有user实例以及应用程序的client_idclient_secret

但这会出错

'{"error": "unsupported_grant_type"}'

版本
django-oauth-toolkit==1.3.0

【问题讨论】:

    标签: django django-allauth django-rest-auth django-oauth


    【解决方案1】:

    通过传递 client_idclient_secret 以及社交网络访问令牌并在视图中附加其他字段来解决问题,例如

        def login(self):
            self.user = self.serializer.validated_data['user']
    
            # Store request
            request = self.request
    
            # Change request data to mutable
            request.data._mutable = True
    
            # Add required data to the request
            request.data['grant_type'] = 'password'           # Call Password-owned grant type
            request.data['username'] = self.user.username     # Fake request data to oauth-toolkit
            request.data['password'] = '-'                    # Fake request data to oauth-toolkit
            request.data['social_login'] = True               # Important, if not set will use username, password
            request.data['user'] = self.user                  # Important, assign user obj
    
            # Change request data to non-mutable
            request.data._mutable = False
    
            # Generate token
            self.token = TokenView().create_token_response(request)
    
            return self.token
    

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 2021-01-02
      • 2021-04-07
      • 2013-11-08
      相关资源
      最近更新 更多