0
点赞
收藏
分享

微信扫一扫

只需两步就能实现JWT认证

逸省 2022-04-04 阅读 51
djangopython

Django系列文章

Django结合七牛云实现对象云储存


文章目录


前言-思路分析

使用 djangorestframework-jwt 不需要定义视图函数吗?

一般情况下,DRF-JWT在登陆功能中应用最为广泛。而登陆视图的功能就是生成签证token ,然后将其返回给前端。

而生成签证token的事情,已有 djangorestframework-jwt 提供的 obtain_jwt_token 函数完成。

我们需要做的就是:补充一个函数用于处理返回值的格式,将 token 按照接口的格式返回给前端。做法就是通过 JWT_RESPONSE_PAYLOAD_HANDLER 配置项,指向自定义的函数。


操作方式

第一步,将获取token的路由 与 obtain_jwt_token 进行关联。

# urls.py

from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token  # 导入 obtain_jwt_token

urlpatterns = [
    path('api/login', obtain_jwt_token),  # 路由关联视图
]

第二步,设置token的返回格式。

(1) 根据接口文档,token 的前缀需要是 Bearer ,因此将 JWT_AUTH_HEADER_PREFIX 的值设置为 Bearer。这样在解析 token 时,会自动去掉前缀。

(2) 返回的 token 不可能是永久的,因此要给 token 设定过期时间。视图函数逻辑无法修改,我们可以通过 JWT_EXPIRATION_DELTA 配置项来完成设置。

# JWT认证的配置信息
JWT_AUTH = {
    'JWT_AUTH_HEADER_PREFIX': 'Bearer',  # JWT的前缀
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),  # JWT的过期时间
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'myserver.utils.jwt_response_payload_handler',  # 请求成功的处理函数路径
}

(3) 最终返回给前端的格式,有自定义的函数完成。在自定义函数中重新封装返回值。

def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功的返回数据格式
    :param token:
    :param user:
    :param request:
    :return:
    """
    return {
        'status': 0,
        'message': '登陆成功!',
        'token': f'Bearer {token}'
    }
举报

相关推荐

0 条评论