jwt認證規則

複習

"""
一、APIView
as_view:禁用csrf
dispatch:請求、響應、解析、渲染、異常、三大認證
一系列類屬性:全局局部配置
做用:drf最底層視圖,全部視圖類之間或間接繼承該類,理論上能夠完成一切接口需求

二、GenericAPIView
三個方法:get_queryset、get_serializer、get_object
三個屬性:queryset、serializer_class、lookup_url_kwarg
做用:將與Model、Serializer以及肯定惟一對象的key這些變化量交於用戶本身配置,查詢這些配置的邏輯封裝成方法,得以複用;這樣處理,使GenericAPIView類及其子類處理與Model相關的接口需求更方便

三、mixins
五個工具類:CreateModelMixin、Destroy、Update、Retrieve、List
六個工具方法:create、destroy、update、partial_update、retrieve、list
做用:將GenericAPIView的封裝方法進行整合形參增刪改查的業務邏輯

四、ListAPIView...
就是不一樣種類不一樣個數的mixins中的類與GenericAPIView類的組合,造成的子類
做用:用戶繼承相應的工具視圖類,進行queryset、serializer_class、lookup_url_kwarg配置,就能夠完成對應功能的接口

五、視圖集
ViewSetMixin類重寫了as_view:
	1) 局部禁用csrf,同APIView類的as_view
	2) 在此基礎上,還接收外界的{}參數,存在actions中,{}參數就是讓用戶自定義請求的映射關係
		{'get': 'my_get'} => get請求會交給視圖類的my_get函數進行處理
ViewSet:能自定義映射的APIView子類
GenericViewSet:能自定義映射的GenericAPIView子類

六、路由組件
from django.conf.urls import url, include
from . import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('books', views.BookGenericViewSet, basename='book')
urlpatterns = [
	url(r'', include(router.urls))
]
"""

jwt認證規則

"""
jwt: json web token
優勢:
1)數據庫不須要存儲token,因此服務器的 IO 操做會減小(沒有IO寫操做)
2)客戶端存Token,服務器只存儲簽發與校驗算法,執行效率高
3)簽發與校驗算法在多個服務器上能夠直接統一,因此jwt認證規則下,服務器作集羣很是便捷

突破點:
1)token必需要有多個部分組成,有能反解的部分,也要有不能反解的部分 - jwt採用的都是三段式
2)token中必須包含過時時間,保證token的安全性與時效性

jwt原理:
1)jwt由 頭.載荷.簽名 三部分組成
2)每一部分數據都是一個json字典,頭和載荷採用 base64 可逆加密算法加密,簽名採用 HS256 不可逆加密

內容:
1)頭(基本信息):可逆不可逆採用的加密算法、公司名稱、項目組信息、開發者信息...
{
	"company": "小女孩",
	...
}
2)載荷(核心信息):用戶主鍵、用戶帳號、客戶端設備信息、過時時間...
{
	'pk': 1,
	...
}
3)簽名(安全信息):頭的加密結果、載荷的加密結果、服務器的安全碼(鹽)...
{
	"header": "..."
	...
}

簽發算法:
1)頭內容寫死(能夠爲空{}):公司、項目組信息都是固定不變的
	=> 將數據字典轉化成json字符串,再將json字符串加密成base64字符串
	
2)載荷的內容:用戶帳號、客戶端設備信息是由客戶端提供,用戶主鍵是客戶端提供帳號密碼校驗User表經過後才能肯定,過時時間根據當前時間與配置的過時時間相結合產生
	=> 將數據字典轉化成json字符串,再將json字符串加密成base64字符串
	
3)簽名的內容,先將頭的加密結果,載荷的加密結果做爲成員,再從服務器上拿安全碼(不能讓任何客戶端知道),也能夠額外包含載荷的部分(用戶信息,設備信息)
	=> 將數據字典轉化成json字符串,再將json字符串不可逆加密成HS256字符串
	
4)將三個字符串用 . 鏈接產生三段式token

校驗算法:
1)從客戶端提交的請求中拿到token,用 . 分割成三段(若是不是三段,非法)
2)頭(第一段)能夠不用解密
3)載荷(第二段)必定須要解密,先base64解密成json字符串,再轉換成json字典數據
	i)用戶主鍵與用戶帳號查詢User表肯定用戶是否存在
	ii)設備信息用本次請求提交的設備信息比對,肯定先後是不是同一設備,決定是否對用戶作安全提示(eg:短信郵箱提示異地登陸)(一樣的安全保障還能夠爲IP、登陸地點等)
	iii)過時時間與當前時間比對,該token是否在有效時間內
4)簽名(第三段)採用加密碰撞校驗
	i)將頭、載荷加密字符串和數據庫安全碼造成json字典,轉換成json字符串
	ii)採用不可逆HS256加密造成加密字符串
	iii)新的加密字符串與第三段簽名碰撞比對,一致才能確保token是合法的
	
5)前方算法都經過後,載荷校驗獲得的User對象,就是該token表明的登陸用戶(Django項目通常都會把登陸用戶存放在request.user中)


刷新算法:
1)要在簽發token的載荷中,額外添加兩個時間信息:第一次簽發token的時間,最多日後刷新的有效時間
2)每一請求攜帶token,不只走校驗算法驗證token是否合法,還要額外請求刷新token的接口,完成token的刷新:校驗規則與校驗算法差很少,可是要將過時時間後移(沒有超過有效時間,產生新token給客戶端,若是超過了,刷新失敗)
3)因此服務器不只要配置過時時間,還須要配置最長刷新時間
"""
相關文章
相關標籤/搜索