gpt4 book ai didi

python - AccessToken匹配查询不存在

转载 作者:太空宇宙 更新时间:2023-11-03 16:10:47 26 4
gpt4 key购买 nike

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

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

我所做的是

基于 token 登录

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)

用于使用 token 创建用户

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}
}

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

我的做法正确吗?

最佳答案

尝试使用 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 请求,请求 token 。请求应包含用户名、密码、client_id 和 client_secret。

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

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

但是,我不确定这是否是您实际上在做的事情。

关于python - AccessToken匹配查询不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39326356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com