持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
之前上一篇drf 组件认证浅析中介绍了这四种组件认证,想了解的可以看一下:
- drf 基础认证
- drf 自定义认证
- drf Token认证
- drf Session认证
其实,除了这几种基本的认证,还有一种认证也是比较多人使用的,就是jwt认证,常用于做登录认证。
jwt认证其实懂开发的人来说,是一个非常熟悉的名词,因为它真的常用,那什么是jwt呢?
JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,以JSON对象的形式在各方之间安全地传输信息。
JWT是一个数字签名,生成的信息是可以验证并被信任的。
使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对JWT进行签名。
JWT是目前最流行的跨域认证解决方案
关于jwt更多详细的内容可以去谷哥度娘去搜索,会有一大堆资料的。
那对于django来说,怎么去使用这个jwt认证呢?
使用第三方模块
pip3 install djangorestframework-jwt
配置引用
# 在路由中配置,创建一个超级用户即可
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/', obtain_jwt_token),
]
配置了路由后,那么就可以直接请求该URL进行登录,深入obtain_jwt_token,可以知道请求的方法是post,传递的参数是username, password, 如果认证成功后会返回该用户登录的token,后续其他接口请求就可以使用该token。
认证Token
既然登录成功了,对于开发一个系统来说,接口权限的认证也是很重要的,那么怎么使用上面生成的token进行接口的认证,然后获取 对应接口的数据呢? 其实使用很简单,和上一篇文件很相似,就是在自己定义的view里面去定义authentication_classes,permission_classes, 这样子就可以知道了。
class JwtLoginView(APIView):
authentication_classes = [JSONWebTokenAuthentication, ]
def post(self, request):
data = request.data
print(data)
return Response()
# 配置路由
path("vuets/jwt/test/", views.JwtLoginView.as_view())
如果请求接口没有进行认证,没有认证token,那么请求该接口会返回这样子的错误。
如果请求接口认证了,配置了生成的token,那么对于请求就是成功的。 (访问的时候,必须把token放到请求头中,key: Authorization, value: 生成的token值)
自定义jwt response
这个和之前写的一篇Django Response 知多少?中的drf 自定义response格式大致。
- 自定义custom_jwt_response.py文件,里面自定义写jwt_response_payload_handler,定义好返回的格式
# custom_jwt_response.py
def jwt_response_payload_handler(token, user=None, request=None):
return {
'code': 200,
'msg': '登录成功',
'token': token,
'username': user.username
}
- settings.py 文件中配置jwt handler
# settings.py
JWT_AUTH = {
'JWT_RESPONSE_PAYLOAD_HANDLER': 'utils.custom_jwt_response.jwt_response_payload_handler',
}
- 模拟请求登录接口就会看到返回的数据格式和自定义的格式一样了。
其实drf-jwt也可以自定义用户表签发token,自定义认证类,在这里我就不展开讲了, 感兴趣的童鞋可以自行百度。
结语
截止到这里,该讲的已经讲完了,也希望这些东西能给人一点点作用,当然,文章不是完美的,有缺漏有错的也可以提出来,我也能进一步学习。最后,如果可以,点赞支持一波也行。