当前位置:   article > 正文

在Django中使用PyJWT实现登录及验证功能_django集成jwt实现登录

django集成jwt实现登录

目录

1、安装PyJWT

2、对信息加密及解密

3、配置登录视图和及url

4、登录装饰器

5、在验证有登录权限的的视图中登录


PyJWT的使用

1、安装PyJWT

pip isntall pyjwt

2、对信息加密及解密

  1. import jwt
  2. import datetime
  3. import platform
  4. from jwt import exceptions
  5. # 加密盐
  6. JWT_SALT = "ds()udsjo@jlsdosjf)wjd_#(#)$"
  7. def create_token(payload, timeout=20):
  8. # 声明类型,声明加密算法
  9. headers = {
  10. "type": "jwt",
  11. "alg": "HS256"
  12. }
  13. # 设置过期时间
  14. payload['exp'] = datetime.datetime.utcnow() + datetime.timedelta(minutes=36000)
  15. result = jwt.encode(payload=payload, key=JWT_SALT, algorithm="HS256", headers=headers)
  16. if platform.system() == "Windows":
  17. result = result.decode("utf-8")
  18. # 返回加密结果
  19. return result
  20. def parse_payload(token):
  21. """
  22. 用于解密
  23. :param token:
  24. :return:
  25. """
  26. result = {"status": False, "data": None, "error": None}
  27. try:
  28. # 进行解密
  29. verified_payload = jwt.decode(token, JWT_SALT, algorithms=["HS256"], verify=True)
  30. result["status"] = True
  31. result['data'] = verified_payload
  32. except exceptions.ExpiredSignatureError:
  33. result['error'] = 'token已失效'
  34. except jwt.DecodeError as e:
  35. result['error'] = 'token认证失败' + str(e)
  36. except jwt.InvalidTokenError:
  37. result['error'] = '非法的token'
  38. return result

3、配置登录视图和及url

  1. class LoginView(View):
  2. """登录"""
  3. def post(self, request):
  4. data_dict = json.loads(request.body.decode())
  5. username = data_dict.get('username', None)
  6. password = data_dict.get('password', None)
  7. user = authenticate(request, username=username, password=password) # 用户名密码认证
  8. if user is not None:
  9. token = create_token({"username": username}) # jwt加密生成token
  10. return JsonResponse({"status": 200, "token": token})
  11. else:
  12. return JsonResponse({"status": 400, "error": "用户名密码错误"})

在登录成功后会返回一个token

4、登录装饰器

用于验证用户是否登录成功

  1. def decorator_login_require(func):
  2. """登录装饰器"""
  3. def wrapper(request, *args, **kwargs):
  4. authorization = request.META.get('HTTP_AUTHORIZATION', '') # 获取Headers里的Authorization值
  5. if authorization:
  6. payload = parse_payload(authorization) # 解密token
  7. status = payload['status']
  8. if status:
  9. username = payload['data']['username']
  10. user = UserProfile.objects.filter(username=username).first() # 解密后查询
  11. if user:
  12. request.user = user
  13. return func(request, *args, **kwargs)
  14. else:
  15. return JsonResponse({"status": 401, "msg": payload['error']})
  16. return JsonResponse({"status": 401, "msg": "对不起,您还未登录"})
  17. return wrapper

5、在验证有登录权限的的视图中登录

将decorator_login_require装饰器装饰在类视图的post方法

  1. class OnlyLoginCanView(View)
  2. """只有登录的用户才能访问的视图"""
  3. @method_decorator(decorator_login_require)
  4. def post(self, request):
  5. # 具体的功能逻辑
  6. return JsonResponse({"status": 200, "msg": "成功"})

配置OnlyLoginCanView类视图的url后在请求时在Headers里需要添加参数名为Authorization值为登录时返回的token值登录,否则不能访问该视图

成功时

 当传入的Authorization值不是登录时返回的token值时不能成功登录

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/494087
推荐阅读
相关标签
  

闽ICP备14008679号