Django rest framework JWT认证

为何使用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/

  

 

posted @ 2020-07-21 16:44  丿小贰灬  阅读(209)  评论(0编辑  收藏  举报