【发布时间】:2021-05-17 17:50:41
【问题描述】:
我想通过HttpOnly cookie 发送SimpleJWT access 和refresh 令牌。我已经定制了索赔。我在 MyObtainTokenPairView(TokenObtainPairView) 中定义了一个 post() 方法,我在其中设置了 cookie。这是我的代码:
from .models import CustomUser
class MyObtainTokenPairView(TokenObtainPairView):
permission_classes = (permissions.AllowAny,)
serializer_class = MyTokenObtainPairSerializer
def post(self, request, *args, **kwargs):
serializer = self.serializer_class()
response = Response()
tokens = serializer.get_token(CustomUser)
access = tokens.access
response.set_cookie('token', access, httponly=True)
return response
返回此错误:
AttributeError: 'RefreshToken' object has no attribute 'access'
序列化器:
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
print(type(user))
token = super().get_token(user)
token['email'] = user.email
return token
但它只是不工作。我想我不应该像这样在这里定义post() 方法。我想如果我只能在序列化程序中返回get_token()函数的值,我可以将它设置为HttpOnly cookie。但是,我不知道该怎么做。
如何在HttpOnly cookie 中设置access 和refresh 标记?
编辑: 我在 anowlinorbit 的回答之后进行了这些更改:
我将我的序列化程序更改为:
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
attrs = super().validate(attrs)
token = self.get_token(self.user)
token["email"] = self.user.email
return token
由于此令牌默认包含刷新令牌,因此我决定仅返回此 token 将同时提供 access 和 refresh 令牌。
如果我添加像token["access"] = str(token.access_token) 这样的东西,它只会在它已经包含的刷新令牌字符串中添加访问令牌字符串。
但再次在视图中,我找不到如何获取刷新令牌。我无法使用serializer.validated_data.get('refresh', None) 获取它,因为现在我从包含所有内容的序列化程序返回token。
我改变了看法:
class MyObtainTokenPairView(TokenObtainPairView):
permission_classes = (permissions.AllowAny,)
serializer_class = MyTokenObtainPairSerializer
def post(self, request, *args, **kwargs):
response = super().post(request, *args, **kwargs)
response.set_cookie('token', token, httponly=True)
return response
现在它说:
NameError: name 'token' is not defined
这里有什么问题?在视图中,我想获取从序列化程序返回的token,然后使用token.access_token 获取访问令牌并将refresh 和access 设置为cookie。
【问题讨论】:
标签: django cookies django-rest-framework django-rest-framework-simplejwt cookie-httponly