摘要:是目前最流行的跨域身份驗證解決方案。由于是對稱加密算法,所以可以輕松解密因此我們在負載部分不要將私密信息放置在里面,只需要把能驗證唯一的標識信息添加就可以了。加密算法,必須設置為一個,或。驗證標頭同時也驗證,一般不用本文參考
JWT(Json Web Token):是目前最流行的跨域身份驗證解決方案。
此前我們使用的身份驗證方式都是基于Session:
這種方式并沒有什么不妥,但其實這里有三個缺點:
Session一般存儲在redis中,而redis數據保存在內存中,隨著用戶的增多,內存消耗太大。
擴展性不好,用戶每次驗證都需要請求session服務器,增大了負載均衡能力,應用擴展受限。
因為是基于cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。
所以,我們需要一種既能實現相同要求并且還要比session存儲更有效的身份驗證方式。
JWT通過一種加密的方式,將加密后的數據保存返回給用戶本地進行保存,我們稱為token數據。其數據由三部分組成:
1、header聲明類型和加密的算法:
{ "typ": "JWT", #固定值 "alg": "HS256" #加密算法 }
2、payload負載
這是有效信息的存放地方,其分為三部分:標準中注冊的聲明、公共聲明、私有聲明(用戶信息)
標準中的注冊聲明(有需要在使用,不強制使用):
iss: jwt簽發者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時間,這個過期時間必須要大于簽發時間
nbf: 定義在什么時間之前,該jwt都是不可用的.
iat: jwt的簽發時間
jti: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。
公共聲明:公共的聲明可以添加任何的信息,一般添加用戶的相關信息或其他業務需要的必要信息.
私有聲明:
{ "name": "jim", "id": "111111", "admin": true }
3、signature簽名
需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過header中聲明的加密方式進行加鹽secret組合加密,然后就構成了jwt的第三部分。由于base64是對稱加密算法,所以可以輕松解密:因此我們在負載部分不要將私密信息放置在里面,只需要把能驗證唯一的標識信息添加就可以了。
有關base64,請參考:https://www.liaoxuefeng.com/w...
由于目前在學習DRF,所以我介紹一下怎樣在DRF項目中使用JWT進行身份驗證:
安裝djangorestframework-jwt:
pip install djangorestframework-jwt
添加jwt認證類:
REST_FRAMEWORK = { "DEFAULT_PERMISSION_CLASSES": ( "rest_framework.permissions.IsAuthenticated", ), "DEFAULT_AUTHENTICATION_CLASSES": ( "rest_framework_jwt.authentication.JSONWebTokenAuthentication", "rest_framework.authentication.SessionAuthentication", "rest_framework.authentication.BasicAuthentication", ), }
添加jwt路由用于生成token:
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ url(r"^自己的路由/", obtain_jwt_token), ]
然后我們就可以通過自己添加的路由并通過post添加username和password來獲取到token了,在進行訪問頁面的時候我們只需要在請求頭中添加一個:Authorization: JWT
當然我們可能不止只需要token數據,還需要用戶的ID,昵稱等信息,那么我們就需要手動生成token數據。
from rest_framework_jwt.settings import api_settings jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) #這里的用戶對象就是在登錄視圖中獲取到的user token = jwt_encode_handler(payload)
當然我們前面已經說明payload中最好不要存儲私密信息,所以我們在處理user前需要將不需要的字段刪除:
del user.set_password("") #當然這樣做肯定不科學,但是我們由于這里沒有場景,所以我先這樣做,有需要的同學可以私聊我。
然后我們可以將返回到前端的數據進行保存,方便下次訪問攜帶:
前端響應中使用的代碼格式
關于session和local存儲:https://www.cnblogs.com/st-le...
sessionStorage.變量名 = 變量值 // 保存數據 sessionStorage.變量名 // 讀取數據 sessionStorage.clear() // 清除所有sessionStorage保存的數據 localStorage.變量名 = 變量值 // 保存數據 localStorage.變量名 // 讀取數據 localStorage.clear() // 清除所有localStorage保存的數據
最后利用localStorage與sessionStorage讀取數據的方式在需要后端驗證的地方添加token數據。
所有配置參考:
JWT_AUTH = { "JWT_ENCODE_HANDLER": "rest_framework_jwt.utils.jwt_encode_handler", #加密處理函數 "JWT_DECODE_HANDLER": "rest_framework_jwt.utils.jwt_decode_handler", #解密處理函數 "JWT_PAYLOAD_HANDLER": "rest_framework_jwt.utils.jwt_payload_handler", #指定自定義函數以生成令牌有效內容 "JWT_PAYLOAD_GET_USER_ID_HANDLER": "rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler", #如果您的存儲username方式與默認的有效負載處理程序不同,請實現此功能以username從有效負載中獲取 "JWT_RESPONSE_PAYLOAD_HANDLER": #負責控制登錄或刷新后返回的響應數據。覆蓋以返回自定義響應 "rest_framework_jwt.utils.jwt_response_payload_handler", "JWT_SECRET_KEY": settings.SECRET_KEY, #使用系統全局的SECRET_KEY "JWT_GET_USER_SECRET_KEY": None, #這是JWT_SECRET_KEY的更強大版本。它是根據用戶定義的,因此如果令牌被泄露,可以由所有者輕松更改。更改此值將使給定用戶的所有令牌都無法使用。值應該是一個函數,接受用戶作為唯一參數并返回它的密鑰。 "JWT_PUBLIC_KEY": None, "JWT_PRIVATE_KEY": None, "JWT_ALGORITHM": "HS256", #加密算法,必須設置為一個RS256,RS384或RS512。 "JWT_VERIFY": True, "JWT_VERIFY_EXPIRATION": True, "JWT_LEEWAY": 0, "JWT_EXPIRATION_DELTA": datetime.timedelta(seconds=300), #設置有效期 "JWT_AUDIENCE": None, "JWT_ISSUER": None, #這是一個字符串,將根據iss令牌字段進行檢查。默認是None(不要檢查issJWT) "JWT_ALLOW_REFRESH": False, "JWT_REFRESH_EXPIRATION_DELTA": datetime.timedelta(days=7), #設置令牌刷新時間,默認為datetime.timedelta(days=7)(7天) "JWT_AUTH_HEADER_PREFIX": "JWT", #您可以修改需要與令牌一起發送的Authorization標頭值前綴。默認值為JWT,用于令牌和授權標頭的另一個常見值是Bearer。 "JWT_AUTH_COOKIE": None, #驗證Authorization標頭同時也驗證cookie,一般不用 }
本文參考:https://lion1ou.win/2017/01/18/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45046.html
摘要:基于的身份驗證可以替代傳統的身份驗證方法。例如可自定義示例如下該的簽發者簽發時間過期時間該時間之前不接收處理該面向的用戶該唯一標識部分對應的簽名為最終得到的的為說明對和進行編碼后進行拼接。 JWT是什么 JWT是json web token縮寫。它將用戶信息加密到token里,服務器不保存任何用戶信息。服務器通過使用保存的密鑰驗證token的正確性,只要正確即通過驗證。基于token的...
摘要:在使用非對稱加密算法進行簽名的時候,還可以用于驗證的發件人是否與中申明的發件人是同一個人。如果沒有用非對稱加密算法的話,把復制之后直接可以去官網在線解析。 這篇博客主要是簡單介紹了一下什么是JWT,以及如何在Spring Boot項目中使用JWT(JSON Web Token)。 1.關于JWT 1.1 什么是JWT 老生常談的開頭,我們要用這樣一種工具,首先得知道以下幾個問題。 這...
閱讀 1993·2021-11-24 10:45
閱讀 1850·2021-10-09 09:43
閱讀 1291·2021-09-22 15:38
閱讀 1219·2021-08-18 10:19
閱讀 2837·2019-08-30 15:55
閱讀 3057·2019-08-30 12:45
閱讀 2962·2019-08-30 11:25
閱讀 356·2019-08-29 11:30