api的通信采用token + ssl,简化和方便线上脚本的调用。Django版本1.8.16,djangorestframework版本3.5.3用了框架提供的rest_framework.authtoken.views.obtain_auth_token
和rest_framework.authentication.TokenAuthentication
后,发现了一个问题,前者认证通过创建token后,这个token就不会自动更新了,非常不安全,非常危险。后者验证时候是不带缓存的,需要查询数据库,由于每次请求都要验证token,请求相当频繁,感觉不是很爽。
1、实现生成的token带过期时间
首先在setting.py配置文件设置过期时间 REST_FRAMEWORK_TOKEN_EXPIRE_MINUTES,这里设置为60分钟
1 | REST_FRAMEWORK_TOKEN_EXPIRE_MINUTES = 60 |
setting.py同目录文件view.py编辑一个视图
1 | #coding=utf8 |
url.py新增url用于生成用户token
1 | #from rest_framework.authtoken.views import obtain_auth_token |
用curl测试接口 api/token/
1 | git:(master) ✗ curl -H "Content-Type: application/json" -X POST -d '{"username":"test","password":"test"}' http://127.0.0.1:9000/api/token/ |
然后,然后这个生成token的接口就好了。目前还有一个问题,用户就是生成一个token例如A,然后用户再也不来请求这个接口生成token,那么这个用户的token A也会一直生效且不会被更新,那么要需要结合token验证函数,来强制删除用户过期的token。
2、自定义token验证,强制删除过期的token,顺便缓存下没有过期的token
首先在setting.py文件新增全局认证类api.authentication.ExpiringTokenAuthentication替换默认的rest_framework.authentication.TokenAuthentication
1 | REST_FRAMEWORK = { |
新建authentication.py文件,改文件在api这个目录下面。
1 | #coding=utf8 |
然后然后,所有的功能都实现了,删除用户过期的token和缓存token减少数据库查询。