认证中间件
中间件不属于任何一个业务,可以将其放入common文件夹中
在common文件夹中新建一个middleware .py文件
然后在settings .py中增加这个中间件的配置
认证中间件,继承的是MiddlewareMixin,如果返回response,这时候请求就中断了,只有报错的时候才返回response,如果不报错,就什么都不返回(默认就算None),Django就会默认往下执行
自定义认证中间件
- 白名单(不需要认证的url)
- request.path 访问路径,如果访问路径在白名单中,就不需要认证
- 根据 request.session[‘uid’] 来判断登录状态
这是一个认证登陆的中间件
1. 通过session认证
middleware .py
进行测试
由于这两个url都是在白名单中,排除在外,所以中间件继续向下执行
将发送验证码的url移除白名单,进行测试(测试前要删除cookie),可以发现返回错误码,因为现在发送验证码邀请被中间件认证,没有uid(没有登陆状态),按照代码流程,返回了错误码2004
2. 通过token认证
pc端浏览器是根据cookie和session机制为依据,对用户进行身份认证的标识,与服务器建立数据传输的连接,pc端浏览器的session保存在cookie中
而app端没有这个机制,手机端是通过token为依据与服务器建立数据传输的连接,
当客户端拿到了从服务器传来的token后,客户端会将token保存在app中对应的数据库中,当客户端需要创建请求进行数据传输的时候,通过http请求头带上这个token与服务器进行数据传输(请求头的名字可由程序员自己定义),http请求头中设置的 token,是以字典key-value的形式
- 如何通过token认证呢?
其实很简单,只需把认证中间件中的session变成token就行了,
在models .py文件中,定义一个方法,为用户生成唯一的 token(可用uuid生成),同时设置缓存的过期时间(所有的认证都必须由过期这个时效性,否则这个安全性是有问题的)
然后在apis .py文件中的登陆接口,将session认证方式换为token认证方式
- 可以查看一下token的内容
查看token比较麻烦
在Ubuntu终端使用命令 python manage,py shell
导入request模块,发送一个get请求获取token
request.META中内容很多,可以在中间件文件中打印一下
查看打印的内容,LOGNAME是key,ikingqu是value
刚刚没有登陆,所以服务器是创建了一个token,然后发送给客户端当客户端需要想服务器发送请求的时候,需要带上token,假设这里的token是qwertyuio56789
查看打印的内容,这个就算请求头中带的token