全文1546字,可能需要您5分钟.

共三部分:

一.JWT的概念

二.django restfulframework_jwt源码分析

三.基于django中间件实现跳转页面的鉴权工作

因为采用前后端分离的技术,所以考虑使用JWT来进行页面授权,这个问题想了好久,有点难懂,主要是跳转页面的鉴权问题.

一.JWT的概念

json web token是用来代替cookie-session鉴权方案,用在前后端分离的项目中,来进行鉴权的一套解决方案.

二.django restfulframework_jwt源码分析

一些概念上的东西网上都有,下面我们看一下djangorestfulframework-jwt的相关源码.

JWT由三部分组成,分别是payload,header,signature.payload为用户的一些非私密信息(一般是user_id,username,email,expire_time)进过base64url编码之后的结果.header为加密算法,signature是前两者加入秘钥之后加密而成.

def jwt_get_secret_key(payload=None):"""For enhanced security you may want to use a secret key based on user.
​This way you have an option to logout only this user if:- token is compromised- password is changed- etc."""if api_settings.JWT_GET_USER_SECRET_KEY:User = get_user_model()  # noqa: N806user = User.objects.get(pk=payload.get('user_id'))key = str(api_settings.JWT_GET_USER_SECRET_KEY(user))return keyreturn api_settings.JWT_SECRET_KEY

jwt_get_secret_key方法用来得到秘钥,可以看见

 'JWT_SECRET_KEY': settings.SECRET_KEY,

默认的秘钥是django自动生成的SECRET_KEY,可以通过自定义,在设置中添加

'JWT_GET_USER_SECRET_KEY': 'chat_app.fresh_jwt.get_jwt_secret_key', # 基于用户信息发送签名

在/chat_app/fresh_jwt.py中通过实现get_jwt_secret_key函数来动态更新秘钥,基于用户个人信息的秘钥,更加安全.

def jwt_payload_handler(user):username_field = get_username_field()username = get_username(user)
​warnings.warn('The following fields will be removed in the future: ''`email` and `user_id`. ',DeprecationWarning)
​payload = {'user_id': user.pk,'username': username,'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA}if hasattr(user, 'email'):payload['email'] = user.emailif isinstance(user.pk, uuid.UUID):payload['user_id'] = str(user.pk)
​payload[username_field] = username
​# Include original issued at time for a brand new token,# to allow token refreshif api_settings.JWT_ALLOW_REFRESH:payload['orig_iat'] = timegm(datetime.utcnow().utctimetuple())
​if api_settings.JWT_AUDIENCE is not None:payload['aud'] = api_settings.JWT_AUDIENCE
​if api_settings.JWT_ISSUER is not None:payload['iss'] = api_settings.JWT_ISSUER
​return payload

jwt_payload_handler函数用来生成payload.

 def jwt_encode_handler(payload):key = api_settings.JWT_PRIVATE_KEY or jwt_get_secret_key(payload)return jwt.encode(payload,key,api_settings.JWT_ALGORITHM).decode('utf-8')
​

jwt_encode_handler函数用来对payload,秘钥,加密算法信息进行加密.

def jwt_decode_handler(token)函数用来对token进行decode,返回payload中的内容.

三.基于django中间件实现跳转页面的鉴权工作

主要的思路如下:

用户分为两种:未鉴权用户和已鉴权用户,未鉴权用户只能进入注册和登录页面.

在这两个页面中的任何request不需要添加authorization请求头,进入其他页面必须使用authorization进行鉴权.

在注册页面中用户提交个人信息成功后,调用/token/,post username和password,请求得到authorization.在进入其他页面之前,调用**valid_token/**判断该authorization是否有效,有效则允许跳转.

在登录页面中,直接,调用/token/,post username和password,请求得到authorization.在进入其他页面之前,调用**valid_token/**判断该authorization是否有效,有效则允许跳转.

由于可以使用同一username和password获得多个有效token,则有可能同时使用同一身份同时操作,为此利用中间件进行拦截:

编写django中间件

class ValidJwt(MiddlewareMixin):def process_request(self, request):# 保证设备登录的唯一性jwt_token = request.META.get('HTTP_AUTHORIZATION', None)if jwt_token is not None and jwt_token != "":data = {'token': jwt_token}try:valid_data = VerifyJSONWebTokenSerializer().validate(data)user = valid_data['user']except (InvalidSignatureError, ValidationError):# 找不到用户res = {"msg": "token invalid","code": "-1"}return HttpResponse(json.dumps(res), content_type='application/json', status=400)if user.jwt_token != data['token']:
​res = {"msg": "token error","code": "-2"}user.jwt_key = uuid.uuid4()user.save()return HttpResponse(json.dumps(res), content_type='application/json', status=400)else:print("pass")

对于所有带有authorization请求头的request,均需要判断它的有效性,token失效返回-1,如果token与该用户的model中存储的token不一致,返回-2,同时更新在model中存储的key秘钥,使用uuid.uuid4制造随机数,保存,直接结束请求.

class Jwt_Response(MiddlewareMixin):
​def process_response(self, request, response):if request.method != 'POST':return responseelse:if request.META['PATH_INFO'] == '/token/':  # 当请求获得token时
​rep_data = response.dataif  "token" in rep_data: #账号与密码有效valid_data = VerifyJSONWebTokenSerializer().validate(rep_data)user = valid_data['user']user.jwt_token = rep_data['token']user.save()return responseelse:print("没有响应token")return response

在响应返回时对/token/的请求响应进行判断:

如果token正在返回一个新的token给用户,此时需要更新数据库中的user.jwt_token,以保证始终只有一个用户能够登录成功.

更多优质内容,请关注微信公众号:生物信息与python

django登录跳转到另一个页面_[JWT]djangojson web token实现单用户登录相关推荐

  1. button active 跳转到另一个页面_一步一步实现一个古诗词网站(四)——首页

    汪小黑:一步一步实现一个古诗词网站(三)--首页​zhuanlan.zhihu.com 在上篇文章中,我们一步一步的实现了我们的静态首页,从中学习到了页面布局方面的知识. 在这篇文章中,我们将使用 J ...

  2. java中登陆界面怎么连接到下一个界面啊_JavaWeb登陆成功后跳转到上一个页面

    JavaWeb登陆成功后跳转到上一个页面,这个标题注定要词不达意,你可能会遇到这样的情形,当点击页面的某个请求时,由于用户未登录,需要跳转到登录页,用户登录成功后,再跳转到上一个页面:还有一种情况,多 ...

  3. JavaWeb登陆成功后跳转到上一个页面

    JavaWeb登陆成功后跳转到上一个页面,这个标题注定要词不达意,你可能会遇到这样的情形,当点击页面的某个请求时,由于用户未登录,需要跳转到登录页,用户登录成功后,再跳转到上一个页面:还有一种情况,多 ...

  4. php跳转到另外一个方法,PHP 页面跳转到另一个页面的多种方法方法总结

    PHP 页面跳转到另一个页面的多种方法方法总结 一用 HTTP 头信息 也就是用 PHP 的 HEADER 函数 PHP 里的 HEADER 函数的作用就是向浏览器发出由 HTTP 协议规定的本来应该 ...

  5. js实现5秒之后跳转到另一个页面

    最近在做网上书城项目时,总结了两种方式实现5秒之后跳转到另一个页面. 第一种方式:直接在jsp页面中写入js代码: msg.jsp代码如下: <%@ page language="ja ...

  6. 点击跳转到另一个页面

    当点击时跳转到另一个页面 Train这个文件创建的是page,不是创建的component 当我点击这个文本时跳转到下边这个页面 文件名:Navs.wxml 文件名:Train.wxml 在Navs. ...

  7. JavaScript倒计时跳转到另一个页面

    需求 页面上显示一个倒计时5秒的数字,到了5秒以后跳转到另一个页面 案例分析 页面上创建一个span用于显示变化的数字,点返回链接直接跳转. 定义一个变量为5,每过1秒调用1次刷新refresh()函 ...

  8. php 跳转回上一个页面,php跳转回上一个页面

    [摘要] PHP即"超文本预处理器",是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 ...

  9. ASP.NET MVC实现一个用户只能登录一次 单用户登录

    现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录.这里实现的是前一种功能. 网上有许 ...

最新文章

  1. 【转】自然语言系列学习之表示学习与知识获取(八)利用远程监督多实例的关系抽取
  2. JS template string 神奇术
  3. Error dialog box generic entry point
  4. python随机数比大小_1到范围内的随机数系统最大大小总是1模2^10
  5. 知乎万赞回答!如何在一周内快速摸清一个行业?
  6. DataX离线数据同步工具/平台
  7. Sql Server 指定列的乘积
  8. html页面常见布局
  9. 以太坊区块链浏览器搭建
  10. 因果效应,典型模型及wasserstein距离, BNN,CFR,SITE,NetDeconf
  11. asp二进制mysql_asP 读取二进制数据库
  12. mysql32位的能装在64位的电脑上吗_32位电脑能装64位系统吗|怎么看32位电脑可不可以装64位系统-系统城...
  13. 拍照时的正确姿势你掌握了吗?(下)
  14. E. MinimizOR
  15. 交互式设计--如何让你的界面简约
  16. 魔王语言解释 C++
  17. 【Docker闪退】【解决方法】It looks like there is an error with Docker Desktop, restart it to fix it
  18. (PHPExcel)读取表格中数据
  19. 刷穿剑指offer-Day21-队列II 使用队列实现广度优先搜索!
  20. 国内十大资质正规黄金交易平台排名(2023名单汇总)

热门文章

  1. ubuntu 9.10安装jdk1.5
  2. 信息学奥赛一本通(1228:书架)
  3. 信息学奥赛一本通(1205:汉诺塔问题)
  4. 基础算法 —— 递归算法
  5. 阿里达摩院python_阿里达摩院出品的735集的python教程
  6. Java破碎重组_Java代码重组
  7. centos mysql rpm re_CentOS 7 RPM 安装 MySQL5.7
  8. Gated Convolution
  9. jQuery Mobile基础 学习笔记
  10. [Unity] ACT 战斗系统学习 4:重构前的第三人称控制器