使用django的rest_framework_jwt实现权限认证

1、JWT简介

JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名。它具备两个特点:

简洁(Compact)

可以通过URL, POST 参数或者在 HTTP header 发送,因为数据量小,传输速度快

自包含(Self-contained)

负载中包含了所有用户所需要的信息,避免了多次查询数据库

2.JWT的组成

一个JWT由三个部分组成:header,payload,signature。

header

jwt的头部有两部分信息构成:

  1. 声明类型,这里是jwt
  2. 声明加密算法,通常直接使用HMAC SHA256

完整的头部如下:

{
    'typ':'JWT',
    'alg':'HS256'
    
}

payload

载荷就是用来存放有效信息的地方。包含三个部分:

  1. 标准中注册的声明
  2. 公共的声明
  3. 私有的声明

signature

JWT的第三部分是一个签证信息,包含三个部分:

  1. header(base64加密后的)
  2. payload(base64加密后的)
  3. secret 这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

django使用JTW验证

首先进行配置(在settings.py中配置)

配置

在INSTALLED_APPS 里注册

INSTALLED_APPS = [
    'rest_framework.authtoken',
]

添加配置

JWT_AUTH = {
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    'JWT_RESPONSE_PAYLOAD_HANDLER':
        'myapp.views.jwt_response_payload_handler',  # 重新login登录返回函数
}
REST_FRAMEWORK = {
    # 身份认证
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
    #全局配置JWT验证设置
    # 'DEFAULT_PERMISSION_CLASSES': (
    #         'rest_framework.permissions.IsAuthenticated',
    # ),
}

生成JWT

传入的user是一个序列化后的user对象

# jwt的生成方法
def login_jwt(user):
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    payload = jwt_payload_handler(user)
    token = jwt_encode_handler(payload)
    return token

验证是否通过

class Hello(APIView):
    permission_classes = [AllowAny] # 可以增加多个权限 

如果不通过就不会走接口里的代码

你可能感兴趣的:(python)