首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不存在AccessToken匹配查询

不存在AccessToken匹配查询
EN

Stack Overflow用户
提问于 2016-09-05 08:14:22
回答 1查看 2.6K关注 0票数 2

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

我已经使用django-oauth工具包来处理这个和DRF。

我所做的就是

基于令牌登录

代码语言:javascript
复制
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)

用于使用令牌创建用户

代码语言:javascript
复制
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}
                            }

我已经排除了用于缩短代码的字段部分和验证部分。

我做得对吗?

EN

回答 1

Stack Overflow用户

发布于 2016-09-05 08:55:52

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

代码语言:javascript
复制
access_token = AccessToken.objects.get(token=request.data.get('access_token'), expires__gt=timezone.now())

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

============UPDATE========================================您应该实现自己的登录过程或修改现有的登录过程;因为当用户登录时,access_token实际上不会发送到服务器。

登录过程应该如下所示:

  1. 当用户输入登录名和密码时,应用程序应该将post请求发送到127.0.0.1:8000/o/令牌,请求令牌。请求应该包含用户名、密码、client_id和client_secret。
  2. 然后,服务器接收凭据,如果它们有效,则返回access_token。
  3. 其余的时间,您应该使用该令牌查询服务器。

但是,我不确定你到底在做什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39326356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档