JWT 认证机制,以及使用

版权声明:未经允许,私自转载,版权必究。 https://blog.csdn.net/Charles_TheGod/article/details/83017922

JWT就是一串字符串,里面由三部分组成

  • 头部(header)
    1 token类型,加密的算法,使用base64加密,加密之后的内容就是头部,base64
    加密的内容很容易被破解
  • 载荷(payload)
    1 保存有效的信息,用户的一些信息,用户名,用户id,手机号…
    2 exp: token数据的有效时间
    3 使用base64加密,加密之后的内容就是载荷
  • 签名(signature)
    1 防止JWT token被伪造
    2生成: 服务器在生成jwt token数据时,将headerpayload进行拼接,用.隔开,然后对拼接的字符串使用一个密钥进行加密,加密之后的内容就是签名。
    3 签名是服务器使用自己的秘钥进行加密的,保证了token的安全性,一样则通过,不一样则伪造

注意点

  • 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
  • 服务器,保护好secret私钥,该私钥非常重要,泄露则JWT token很容易被伪造。
  • 如果可以,请使用https协议

Django REST framework JWT

可以帮助我们生成和校验JWT token

# 首先进行一个安装
pip install djangorestframework-jwt

在配置文件中进行配置

"""settings.py"""
# DRF 配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
    	# 添加 JWT 认证机制
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

JWT_AUTH = {
	"""指明token的有效期"""
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}

使用

"""有服务器生成一个JWT token数据,包含用户登录信息"""
from rest_framework_jwt.settings import api_settings

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
# 生成载荷
payload = jwt_payload_handler(user)
# 生成JWT token
token = jwt_encode_handler(payload)
"""给user对象添加token属性,保存服务器签发的JWT token数据"""
user.token = token

增加字段

token = serializers.CharField(lable="JWT token", read_only = True)

客户端保存我们JWT 签发的token

我们可以将JWT保存在cookie中,也可以保存在浏览器的本地存储里
浏览器的本地存储提供了sessionStorage 和 localStorage 两种:

sessionStorage 浏览器关闭即失效
localStorage 长期有效

使用方法

sessionStorage.变量名 = 变量值   // 保存数据
sessionStorage.变量名  // 读取数据
sessionStorage.clear()  // 清除所有sessionStorage保存的数据

localStorage.变量名 = 变量值   // 保存数据
localStorage.变量名  // 读取数据
localStorage.clear()  // 清除所有localStorage保存的数据
	 sessionStorage.clear();
     localStorage.clear();
     localStorage.token = response.data.token;
     localStorage.username = response.data.username;
     localStorage.user_id = response.data.id;

Django REST framework JWT提供了登录签发JWT的视图,可以直接使用

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    url(r'^authorizations/$', obtain_jwt_token),
]

但是默认的返回值仅有token,我们还需在返回值中增加username和user_id。

通过修改该视图的返回值可以完成我们的需求。

在users/utils.py 中,创建

def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回数据
    """
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }

修改配置文件settings

# JWT
JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}

猜你喜欢

转载自blog.csdn.net/Charles_TheGod/article/details/83017922