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), }
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', }
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 被僞造
payload載荷不要存過於敏感數據
服務器須要保存好籤名加密密鑰
能夠使用安全網絡協議:https
jwt擴展使用:
功能:生成jwt token和校驗jwt token