jwt token

jwt使用配置:redis

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 認證機制:django

1,用戶登陸,傳遞用戶名和密碼給客戶端
2,服務器進行用戶名和密碼的校驗,若是校驗成功,將用戶保存到session
3,將sessionid經過cookie返回給客服端,客服端會保存sessionID
4,客服端再次訪問服務器,會攜帶cookie:sessionID ,服務端就能夠獲取對應的session信息,而後對用戶的身份進行校驗

  session認證存在的問題:安全

  1,session 信息存放在服務器端,若是用戶過多,就佔用過多的服務器的存儲空間服務器

  2,session 依賴於cookie,若是cookie被截獲,可能產生csrf跨站請求僞造cookie

  3,在分佈式網站應用中,若是session存儲到服務器的內存,session共享會用問題網絡

 

2 ,jwt 認證機制session

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

相關文章
相關標籤/搜索