Django中应用jwt进行身份校验token
jwt 即 json web token。用于身份校验,当用户登录的时候,服务器会给用户分配一个token,服务不会保存。当用户需要访问服务器的时候,需要带着token,服务通过token来判断用户现在的状态,比如token失效不正确等。在小破站学习了一会大致了解了一点,这里记录一下。
实现方法这里不赘述。
导入包
pip install pyjwt
安装慢的话可以参考这篇博文----->传送门
配置
utils.py
自定义的工具文件,里面用于调用jwt包里面的函数来返回生成token
import jwt
import datetime
from django.conf import settings
def get_token(payload, timeout):
salt = settings.SECRET_KEY
headers = {
"typ": "jwt_",
"alg": "HS256",
}
payload["exp"] = datetime.datetime.utcnow() + datetime.timedelta(minutes=timeout) # 设置到期时间
token = jwt.encode(payload=payload, key=salt, headers=headers).decode("utf-8")
return token
登录视图
class LoginViewSet(ModelViewSet):
parser_classes = [MultiPartParser, JSONParser, FormParser]
# authentication_classes = []
"""视图集"""
queryset = models.User.objects.all()
serializer_class = UserModelSerializer
# 搜索
search_fields = ('id')
@action(methods=['post'], detail=False)
@csrf_exempt
def register(self, request, *args, **kwargs):
print(request.body)
username = request.data.get("username")
pwd = request.data.get("password")
print(username)
print(pwd)
obj = models.User.objects.filter(nickname=username, pwd=pwd).first()
if not obj:
return Response({"code": 1000, 'error': '用户名或密码错误'})
payload = {
"id": obj.id,
"name": obj.nickname,
}
token = get_token(payload, 1) # 这里设置有效时间为1分钟
return Response({"code": 1001, 'data': token})
auth.py
用于验证的类,类似于一个中间件,在访问需要登录过状态才能访问的视图会首先进行身份验证。
import jwt
from jwt import exceptions
from rest_framework.authentication import BaseAuthentication
from django.conf import settings
from rest_framework.exceptions import AuthenticationFailed
class JwtQueryParamsAuthentication(BaseAuthentication):
def authenticate(self, request):
token = request.query_params.get("token")
salt = settings.SECRET_KEY
try:
result = jwt.decode(token, salt, True)
except exceptions.ExpiredSignatureError:
msg = "token失效"
raise AuthenticationFailed({"code": 1001, "msg": msg})
except exceptions.DecodeError:
msg = "token认证失败"
raise AuthenticationFailed({"code": 1002, "msg": msg})
except exceptions.InvalidTokenError:
msg = "非法token"
raise AuthenticationFailed({"code": 1003, "msg": msg})
return (result, token)
比如Article视图需要登录才能访问,我们只需要引入上面的验证类即可
class ArticleViewSet(ModelViewSet):
parser_classes = [MultiPartParser, JSONParser, FormParser]
authentication_classes = [JwtQueryParamsAuthentication]
"""视图集"""
queryset = models.Article.objects.all()
serializer_class = ArticleModelSerializer
# 搜索
search_fields = ('id')
postman来获取token
前端保存token请参考这篇文章------>传送门