drf jwt 认证

242 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

之前上一篇drf 组件认证浅析中介绍了这四种组件认证,想了解的可以看一下:

  1. drf 基础认证
  2. drf 自定义认证
  3. drf Token认证
  4. 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,那么请求该接口会返回这样子的错误。

26816B4C-A8F4-4eff-8F98-71422A57D6F1.png

如果请求接口认证了,配置了生成的token,那么对于请求就是成功的。 (访问的时候,必须把token放到请求头中,key: Authorization, value: 生成的token值)

71F570DB-4ACB-4fdb-B5CE-9106A0DCC9ED.png

自定义jwt response

这个和之前写的一篇Django Response 知多少?中的drf 自定义response格式大致。

  1. 自定义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
    }
  1. settings.py 文件中配置jwt handler
# settings.py
JWT_AUTH = {
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'utils.custom_jwt_response.jwt_response_payload_handler',
}
  1. 模拟请求登录接口就会看到返回的数据格式和自定义的格式一样了。

68C08691-AD1C-4616-A7B4-024249674E28.png

其实drf-jwt也可以自定义用户表签发token,自定义认证类,在这里我就不展开讲了, 感兴趣的童鞋可以自行百度。

结语

截止到这里,该讲的已经讲完了,也希望这些东西能给人一点点作用,当然,文章不是完美的,有缺漏有错的也可以提出来,我也能进一步学习。

最后,如果可以,点赞支持一波也行。