• 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

  • 相关阅读:
    游标后面select 带有in时
    Bootstrap 表单控件一(单行输入框input,下拉选择框select ,文本域textarea)
    Bootstrap内联表单
    七、struts2后缀
    六、默认action
    五、指定多个配置文件
    四、动态方法调用
    三、Action搜索顺序
    二、访问Servlet Api
    一、struts入门案例
  • 原文地址:https://www.cnblogs.com/wjun0/p/11781229.html
Copyright © 2020-2023  润新知