> 文档中心 > 只需两步就能实现JWT认证

只需两步就能实现JWT认证


Django系列文章

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


文章目录

  • Django系列文章
  • 前言-思路分析
  • 操作方式
    • 第一步,将获取token的路由 与 `obtain_jwt_token` 进行关联。
    • 第二步,设置token的返回格式。

前言-思路分析

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

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

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

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


操作方式

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

# urls.pyfrom django.urls import pathfrom rest_framework_jwt.views import obtain_jwt_token  # 导入 obtain_jwt_tokenurlpatterns = [    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',  # 请求成功的处理函数路径}

注意点:
JWT_RESPONSE_PAYLOAD_HANDLER 的值,是你定义jwt_response_payload_handler的路径。
比如:你的应用名字叫做 myserver,然后在此目录下的utils.py文件中,定义jwt_response_payload_handler函数来处理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}'    }