为何使用JWT:
DRF自带的TokenAuthentication认证方式也非常简单,同时弊端也很大,真正项目中用的较少。
由于需要存储在数据库表中,它在分布式系统中用起来较为麻烦,并且每次都需要查询数据库,增加数据库压力;
同时它不支持Token的过期设置,这是一个很大的问题。
在实际前后端分离项目中使用JWT(Json Web Token)标准的认证方式较多,每个语言都有各自实现JWT的方式。
JWT有点:
JWT(Json Web Token)JWT解决了两个较大的问题:
第一,不需要把Token存储到数据库表中了,而是根据一定的算法来算出用户Token,然后每次用户来验证时再以同样的方式生成对应的Token进行校验。当然,实际JWT生成Token的方式还是较为复杂的,具体可以看JWT协议相关文章。
第二,JWT对于生成的Token可以设置过期时间,从而在一定程度提高了Token的安全性。
JWT的原理还是稍稍有点麻烦的,里面涉及了一些对称加密和非对称加密的算法。但是JWT使用起来确是非常简单,Python中有PyJWT库,而在DRF中也有对应的开源项目django-rest-framework-jwt。
JWT 安装
pip install djangorestframework-jwt
JWT 使用setting.py
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), }
JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300), # 过期时间 'JWT_AUTH_HEADER_PREFIX': 'ABC', # 请求头前缀 }
添加认证路由:
from rest_framework_jwt.views import obtain_jwt_token urlpatterns += [ url(r'^api-token-auth/', obtain_jwt_token) ]
认证请求:
现在访问需要认证的API时,就必须要包含Authorization: JWT <your_token>
头信息
curl -H "Authorization: JWT <your_token>" http://127.0.0.1:8000/auth/