JWT 认证
JWT 认证可以解决 HTTP 无状态认证及跨域登录的问题,常见于不同域名网页使用同一账户登录的解决方案当中,在 Django 中可以使用 JWT 代替 Session 进行认证。Session 一般保存于服务器的数据库中,而 JWT 通过 Token 的形式,将认证结果保存在 cookie 中,二者在保存上存在区别
实现
- pyjwt 2.4.0
实现代码如下:
class JWTAuth(View):
"""create token and decode token"""
def post(self, request, *args, **kwargs):
username = request.POST.get('username')
password = request.POST.get('password')
# check username and password
user = authenticate(request, username=username, password=password)
if user is not None and user.is_active:
# use get_jwt_token to create a token
jwt_token = self.get_jwt_token(username)
return JsonResponse({
"jwt_toke":jwt_token})
return JsonResponse({
"message":"check name and password"})
def get(self, request):
headers = request.headers
# check jwttoken in headers or not
if 'jwttoken' in headers:
# decode token
if self.decode_jwt_token(headers['jwttoken']):
return JsonResponse({
"message":"This is Auth page!"})
else:
return JsonResponse({
"error":"You get a wrong token"})
else:
return JsonResponse({
"error":"You dont have token"})
return JsonResponse({
"message":"this is token page!"})
@staticmethod
def get_jwt_token(username):
"""crete jwt token"""
payload={
# Set the expiration time for example 3600 seconds
'exp':datetime.datetime.utcnow() + datetime.timedelta(3600),
'iat':datetime.datetime.utcnow(),
'data':{
'username':username},
}
# payload:payload
# string:salt
# algorthm:encryption method
encode_jwt = jwt.encode(payload, "jfjufcb37%jfjoeo", algorithm='HS256')
return encode_jwt
@staticmethod
def decode_jwt_token(encode_jwt):
"""decode jwt """
result = jwt.decode(encode_jwt,"jfjufcb37%jfjoeo", algorithms=['HS256'])
return result
DRF中各类报错问题汇总
serializers.CurrentUserDefault 报错提示 request 错误
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qoNk2CQD-1666513909338)(https://img-blog.cksdnimg.cn/461480b42c234a3a9146f5fa1b97289b.png)]
通过查看报错信息,可以知道是
该类被调用时通过上下文 context 获取 request 对象的 user 值进行返回,打上断点之后发现访问时上下文为空字典,自然无法获取 request 这个 key 的值,查询官方的文档可以得知,需要在序列化器初始化时将 request 作为上下文字典进行传入
因此在视图层增加一个上下文字典即可
以上示例代码均来自@大江狗