【问题标题】:AccessToken matching query does not existAccessToken 匹配查询不存在
【发布时间】:2017-01-12 13:47:03
【问题描述】:

我正在创建一个用于基于 oauth 令牌注册用户的 API。我的应用程序具有注册和登录、添加餐厅等功能。我创建了用户注册部分,但登录时出错。我想基于令牌登录。

我已经为此和 DRF 使用了 django-oauth-toolkit。

我所做的是

基于令牌登录

class UserCreateAPI(CreateAPIView):
    serializer_class = UserCreateSerializer
    queryset = User.objects.all()
    permission_classes = [AllowAny]

class UserLoginAPI(APIView):
    permission_classes = [AllowAny]
    serializer_class = UserLoginSerializer

    def post(self, request, *args, **kwargs):
        access_token = AccessToken.objects.get(token=request.POST.get('access_token'), expires__gt=timezone.now()) # error is shown here
        data = request.data
        serializer = UserLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            return Response(new_data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

用于使用令牌创建用户

class UserCreateSerializer(ModelSerializer):
    class Meta:
        model = User
        extra_kwargs = {"password": {"write_only": True}}

    def create(self, validated_data):
        username = validated_data['username']
        first_name = validated_data['first_name']
        last_name = validated_data['last_name']
        email = validated_data['email']
        password = validated_data['password']
        confirm_password = validated_data['password']
        user_obj = User(
                username = username,
                first_name = first_name,
                last_name = last_name,
                email = email
            )
        user_obj.set_password(password)
        user_obj.save()
        if user_obj:
            expire_seconds = oauth2_settings.user_settings['ACCESS_TOKEN_EXPIRE_SECONDS']
            scopes = oauth2_settings.user_settings['SCOPES']

            application = Application.objects.get(name="Foodie")
            expires = datetime.now() + timedelta(seconds=expire_seconds)
            access_token = AccessToken.objects.create(user=user_obj, 
                                                    application=application,
                                                    token = generate_token(),
                                                    expires=expires, 
                                                    scope=scopes)
        return validated_data


class UserLoginSerializer(ModelSerializer):
    # token = CharField(allow_blank=True, read_only=True)
    username = CharField()
    class Meta:
        model = User
        fields = [
            'username',
            'password',
            # 'token',

        ]
        extra_kwargs = {"password":
                            {"write_only": True}
                            }

我已排除字段部分和验证部分以缩短代码

我做对了吗?

【问题讨论】:

  • 确保访问令牌已在数据库中注册并且尚未过期(使用./manage.py shell)。
  • 已在数据库中注册。我会检查有效期。
  • 我的过期秒是'ACCESS_TOKEN_EXPIRE_SECONDS':36000000。所以我认为它不会过期。如何查看是否过期?
  • 在指令 AccessToken.objects.get(...) 之前打印 request.POST.get('access_token') 并检查其值
  • 我在终端中没有。

标签: python django python-3.x oauth django-rest-framework


【解决方案1】:

尝试使用 request.data 而不是 request.post 以获取 access_token(http://www.django-rest-framework.org/tutorial/2-requests-and-responses/):

access_token = AccessToken.objects.get(token=request.data.get('access_token'), expires__gt=timezone.now())

如果您使用的是 DRF 的第 2 版,请使用 request.DATA。 request.data 适用于版本 3

============更新================================== ====== 您应该实现自己的登录程序或修改现有的程序;因为当用户登录时,access_token 并没有真正发送到服务器。

登录过程应如下所示:

  1. 当用户输入他的登录名和密码时,您的应用应该向 127.0.0.1:8000/o/token 发送一个 post 请求,请求获取令牌。请求应包含用户名、密码、client_id 和 client_secret。

  2. 服务器然后接收凭据,如果它们有效,则返回 access_token。

  3. 其余时间您应该使用该令牌查询服务器。

但是,我不确定你实际上在做什么。

【讨论】:

  • 我仍然没有使用 request.data,因为我使用的是 DRF 版本 3。
  • 你的意思是打印(request.data)吗?
  • request.data 没有 access_token 密钥。
  • 我的意思是从客户端发出的请求。如何发送令牌?
  • $ curl -X POST -d "grant_type=password&username=admin&password=admin123" -u"clientsecretkey" 127.0.0.1:8000/o/token 这给了我 {"error": "invalid_client"}。在 clientsecretkey 我把 clientsecretkey 来自管理应用程序
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 2012-05-10
  • 2013-03-02
  • 2021-12-10
  • 2021-05-07
  • 2014-04-12
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多