目錄jwt的使用
從根本上來說,jwt是一種開放的標準(rfc 7519), 全稱為json web token ,其存在的意義在於,對於前後端分離的專案來說,後端不需要儲存token,主需要儲存簽發和校驗token的演算法,所以我們需要在前端儲存token,然後通過jwt加密之後傳送給後端,從而完成校驗.
jwt演算法認證的最大優點在於適合伺服器集群部署,這樣對於比較大的專案可以從根本上提公升併發量.
jwt的格式是三段式,即header(頭) . payload(負載) . signature(簽名)
,其中頭和載負載採用的是base64可逆的加密,簽名採用的則是md5不可逆的加密,具體如下:
我們的後台一定要保證伺服器秘鑰的安全,因為在jwt裡面伺服器秘鑰是唯一的安全保障
後台簽發token -> 前台儲存 -> 前台想後台傳送需要認證的請求且攜帶token -> 後台校驗token得到合法的使用者
# 在cmd或者terminal視窗中:
pip install djangorestframework-jwt
# 模組包名為rest_framework_jwt
jwt最常用的是三個介面,簽發token,校驗token以及重新整理token,我們可以分別在urls.py裡面匯入
# /urls.py
from django.conf.urls import url
from . import views
from rest_framework_jwt.views import obtainjsonwebtoken, obtain_jwt_token, verify_jwt_token, refresh_jwt_token
urlpatterns = [
# drf-jwt三個檢視介面
url(r'^login/$', obtain_jwt_token),
url(r'^verify/$', verify_jwt_token),
url(r'^refresh/$', refresh_jwt_token),
]# 匯入之後,我們還需要在settings.py裡面配置相關的jwt的配置項
# /settings.py
import datetime
jwt_auth =
下面我們就用**來實現jwt的整個邏輯,大概邏輯如下:
檢視類中,將請求資料交給序列化完成校驗,然後返回使用者資訊和對應token
序列化類,自定義反序列化的字段,利用全域性鉤子校驗資料得到user和token,並且儲存在序列化類物件中
token可以採用jwt外掛程式的rest_framework_jwt.serializers中jwt_payload_handler,jwt_encode_handler來完成簽發
下面我們做乙個例項,該小例子實現了使用者的多方式登入:
# urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^login/$', views.loginapiview.as_view())
]# serializers.py
from rest_framework.serializers import modelserializer, charfield, validationerror, serializermethodfield
from . import models
import re
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
class loginserializer(modelserializer):
# 定義使用者名稱和密碼兩個僅支援反序列化的字段
username = charfield(write_only=true)
password = charfield(write_only=true)
class meta:
model = models.user
fields = ('username', 'password')
# 在全域性鉤子中簽發token
def validate(self, attrs):
user = self._many_method_login(**attrs)
# 將資料存放到序列化物件中
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
self.user = user
self.token = token
return attrs
# 多方式登入
def _many_method_login(self, **attrs):
username = attrs.get('username')
password = attrs.get('password')
# 正則匹配,如果有@符號,則判定為郵箱登入
if re.match(r'.*@.*', username):
user = models.user.objects.filter(email=username).first()
# 如果是11位數字且開頭為1,判定為手機登入
elif re.match(r'^1[0-9]$', username):
user = models.user.objects.filter(mobile=username).first()
# 兩個都不匹配的話,就判定為使用者名稱登入
else:
user = models.user.objects.filter(username=username).first()
# 如果使用者不存在,就是資訊有誤
if not user:
raise validationerror()
# 如果使用者存在,但是檢測密碼有問題,報錯密碼有誤
if not user.check_password(password):
raise validationerror()
return user
# views.py
from rest_framework.views import apiview
from . import models, serializers
from utils.response import apiresponse
class loginapiview(apiview):
authentication_classes =
permission_classes =
# 以post的方式接受前台傳送的資料
def post(self, request, *args, **kwargs):
# 將前台傳來的資料傳送到序列化物件中,完成校驗
serializer = serializers.loginserializer(data=request.data)
serializer.is_valid(raise_exception=true)
return apiresponse(msg='login success', data=)
drf元件之jwt認證
全稱 json web token 解釋 加密字串的原始資料是json,後台產生,通過web傳輸給前台儲存 格式 三段式 頭.載荷.簽名 頭和載荷用的是base64可逆加密,簽名用md5不可逆加密 內容 頭 基礎資訊,也可以為空 加密方式 公司資訊 專案組資訊 載荷 核心資訊 使用者資訊 過期時間 ...
常用的使用者認證方式 詳解JWT
和session的區別和優缺點 總結authentication 使用者認證,指的是驗證使用者的身份,例如你希望以小a的身份登入,那麼應用程式需要通過使用者名稱和密碼確認你真的是小a。由於http協議是無狀態的,每一次請求都無狀態。當乙個使用者通過使用者名稱和密碼登入了之後,他的下乙個請求不會攜帶任...
使用者認證 基於jwt和session的區別和優缺點
背景知識 authentication和authorization的區別 authentication 使用者認證,指的是驗證使用者的身份,例如你希望以小a的身份登入,那麼應用程式需要通過使用者名稱和密碼確認你真的是小a。由於http協議是無狀態的,每一次請求都無狀態。當乙個使用者通過使用者名稱和密...