jwt token

jwt使用配置:

settings文件中添加:

REST_FRAMEWORK = {
    # 异常处理 自定义的异常处理类
    'EXCEPTION_HANDLER': 'drf_meiduo.utils.exceptions.exception_handler',

    'DEFAULT_AUTHENTICATION_CLASSES': (
        # 引入JWT认证机制
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

JWT_AUTH = {
    #设置jwt的有效时间
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}
View Code
import logging

from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from rest_framework import status

from django.db import DatabaseError
from redis.exceptions import RedisError

# 获取在配置文件中定义的logger,用来记录日志
logger = logging.getLogger('django')

def exception_handler(exc, context):
    """
    自定义异常处理
    :param exc: 异常
    :param context: 抛出异常的上下文
    :return: Response响应对象
    """
    # 调用drf框架原生的异常处理方法
    response = drf_exception_handler(exc, context)

    if response is None:
        # 获取异常视图对象
        view = context['view']
        if isinstance(exc, DatabaseError) or isinstance(exc, RedisError):
            # 数据库异常
            logger.error('[%s] %s' % (view, type(exc)))
            response = Response({'message': '服务器内部错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    return response
自定义异常处理类

示例代码:django-restframework已经封装好了。

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

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    url(r'^authorizations/$', obtain_jwt_token),
]
注:默认JWT扩展登录视图的返回值仅有token,我们还需在返回值中增加username和user_id。

3. 自定义JWT扩展登录视图响应数据函数
1)在users/utils.py 中,创建

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

# JWT扩展配置
JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}
View Code

1 ,session 认证机制:

1,用户登录,传递用户名和密码给客户端
2,服务器进行用户名和密码的校验,如果校验成功,将用户保存到session
3,将sessionid通过cookie返回给客服端,客服端会保存sessionID
4,客服端再次访问服务器,会携带cookie:sessionID ,服务端就可以获取对应的session信息,然后对用户的身份进行校验

  session认证存在的问题:

  1,session 信息存放在服务器端,如果用户过多,就占用过多的服务器的存储空间

  2,session 依赖于cookie,如果cookie被截获,可能产生csrf跨站请求伪造

  3,在分布式网站应用中,如果session存储到服务器的内存,session共享会用问题

2 ,jwt 认证机制

jwt token 组成:

  字符串,由头部(header),载荷(payload)和签名(signatrue)3部分组成,用.隔开(点号)

 1,头部(header):存储的是token类型和签名加密的算法

    {‘token类型’,‘签名加密算法’}  对头部内容使用base64进行加密,生成的就是header

 2,载荷(payload):存储有效的数据和token的有效时间

    {"user_id": "用户id",

      "username": "用户名"

      "mobile": "15211111111"

      ...

      "exp": "token有效时间"}

   对载荷内容进行base64加密,生成的内容就是payload

  3,签名(signature):作用:防止jwt token 被伪造

  

jwt 使用注意点:

  • payload载荷不要存过于敏感数据

  • 服务器需要保存好签名加密密钥

  • 可以使用安全网络协议:https

jwt扩展使用:

​ 功能:生成jwt token和校验jwt token

原文地址:https://www.cnblogs.com/wjun0/p/11781229.html