Django rest framework jwt的使用方法詳解
一簡(jiǎn)介
JWT 是一個(gè)開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種用于簡(jiǎn)潔,自包含的用于通信雙方之間以 JSON 對(duì)象的形式安全傳遞信息的方法。該信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。JWTS可以使用秘密(使用HMAC算法)或公鑰/私鑰對(duì)使用RSA或ECDSA來(lái)簽名。
JWT的組成部分:
header
Header是由下面這個(gè)格式的Json通過Base64編碼(編碼不是加密,是可以通過反編碼的方式獲取到這個(gè)原來(lái)的Json,所以JWT中存放的一般是不敏感的信息)生成的字符串,Header中存放的內(nèi)容是說明編碼對(duì)象是一個(gè)JWT以及使用“SHA-256”的算法進(jìn)行加密(加密用于生成Signature)
playload
Payload是通過Claim進(jìn)行Base64轉(zhuǎn)碼之后生成的一串字符串,Claim是一個(gè)Json,Claim中存放的內(nèi)容是JWT自身的標(biāo)準(zhǔn)屬性,所有的標(biāo)準(zhǔn)屬性都是可選的,可以自行添加,比如:JWT的簽發(fā)者、JWT的接收者、JWT的持續(xù)時(shí)間等;同時(shí)Claim中也可以存放一些自定義的屬性,這個(gè)自定義的屬性就是在用戶認(rèn)證中用于標(biāo)明用戶身份的一個(gè)屬性,比如用戶存放在數(shù)據(jù)庫(kù)中的id,為了安全起見,一般不會(huì)將用戶名及密碼這類敏感的信息存放在Claim中。將Claim通過Base64轉(zhuǎn)碼之后生成的一串字符串稱作Payload。
signatrue
Signature是由Header和Payload組合而成,將Header和Claim這兩個(gè)Json分別使用Base64方式進(jìn)行編碼,生成字符串Header和Payload,然后將Header和Payload以Header.Payload的格式組合在一起形成一個(gè)字符串,然后使用上面定義好的加密算法和一個(gè)密匙(這個(gè)密匙存放在服務(wù)器上,用于進(jìn)行驗(yàn)證)對(duì)這個(gè)字符串進(jìn)行加密,形成一個(gè)新的字符串,這個(gè)字符串就是Signature。
簽名的目的:最后一步簽名的過程,實(shí)際上是對(duì)頭部以及負(fù)載內(nèi)容進(jìn)行簽名,防止內(nèi)容被竄改。如果有人對(duì)頭部以及負(fù)載的內(nèi)容解碼之后進(jìn)行修改,再進(jìn)行編碼,最后加上之前的簽名組合形成新的JWT的話,那么服務(wù)器端會(huì)判斷出新的頭部和負(fù)載形成的簽名和JWT附帶上的簽名是不一樣的。如果要對(duì)新的頭部和負(fù)載進(jìn)行簽名,在不知道服務(wù)器加密時(shí)用的密鑰的話,得出來(lái)的簽名也是不一樣的。
rest_framework_jwt
rest_framework_jwt是一個(gè)封裝了jwt符合restful規(guī)范的接口
網(wǎng)站地址:http://getblimp.github.io/django-rest-framework-jwt/
安裝:pip install djangorestframework-jwt
二、配合drf的認(rèn)證組件的使用方法
配置文件
#添加rest-framework INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', "rest_framework", ] REST_FRAMEWORK = { # 配置默認(rèn)的認(rèn)證方式 base:賬號(hào)密碼驗(yàn)證 #session:session_id認(rèn)證 'DEFAULT_AUTHENTICATION_CLASSES': ( # drf的這一階段主要是做驗(yàn)證,middleware的auth主要是設(shè)置session和user到request對(duì)象 # 默認(rèn)的驗(yàn)證是按照驗(yàn)證列表從上到下的驗(yàn)證 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', "rest_framework_jwt.authentication.JSONWebTokenAuthentication", )} import datetime # 超時(shí)時(shí)間 JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # token前綴 'JWT_AUTH_HEADER_PREFIX': 'JWT', } # 引用Django自帶的User表,繼承使用時(shí)需要設(shè)置 AUTH_USER_MODEL = "app01.User"
模型表
#使用django自帶的auth組件模型表 from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class User(AbstractUser): phone=models.CharField(max_length=11,null=True)
url路由層
from django.conf.urls import url from django.contrib import admin from rest_framework_jwt.views import obtain_jwt_token from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'^home/', views.Home.as_view()), # 登入驗(yàn)證,使用JWT的模塊,只要用戶密碼正確會(huì)自動(dòng)生成一個(gè)token返回 url(r'^login/', obtain_jwt_token), # 訪問需要認(rèn)證的接口 url(r'^index/', views.Index.as_view()), ]
view視圖層
from django.shortcuts import render from django.http import JsonResponse # Create your views here. from rest_framework.views import APIView from app01.jwtMiddleware import TokenAuth class Index(APIView): #局部認(rèn)證的配置 authentication_classes = [TokenAuth,] def get(self,request): return JsonResponse({"index":"ok"}) class Home(APIView): def get(self,request): return render(request,"login.html")
rest-framework認(rèn)證類
from rest_framework.exceptions import AuthenticationFailed from rest_framework_jwt.serializers import VerifyJSONWebTokenSerializer class TokenAuth(): def authenticate(self, request): token={"token":None} # print(request.META.get("HTTP_TOKEN")) token["token"] = request.META.get('HTTP_TOKEN') valid_data = VerifyJSONWebTokenSerializer().validate(token) print(valid_data) user = valid_data['user'] print(user) if user: return else: raise AuthenticationFailed('認(rèn)證失敗')
模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> <input type="text" name="username"> <input type="text" name="password"> <input type="submit" value="登錄"> </form> </body> </html>
postman
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch構(gòu)建網(wǎng)絡(luò)模型的4種方法
這篇文章主要為大家詳細(xì)介紹了pytorch構(gòu)建網(wǎng)絡(luò)模型的4種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04使用Python實(shí)現(xiàn)文本英文統(tǒng)計(jì)功能
這篇文章主要為大家詳細(xì)介紹了如何使用Python來(lái)實(shí)現(xiàn)文本英文統(tǒng)計(jì),包括單詞頻率統(tǒng)計(jì)、詞匯量統(tǒng)計(jì)以及文本情感分析等,感興趣的小伙伴可以參考下2024-05-05python實(shí)現(xiàn)自動(dòng)網(wǎng)頁(yè)截圖并裁剪圖片
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)網(wǎng)頁(yè)截圖并裁剪圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Python中的多線程實(shí)例(簡(jiǎn)單易懂)
這篇文章主要介紹了Python中的多線程實(shí)例,一個(gè)CPU,將時(shí)間切成一片一片的,CPU輪轉(zhuǎn)著去處理一件一件的事情,到了規(guī)定的時(shí)間片就處理下一件事情,更多的相關(guān)內(nèi)容需要的小伙伴可以參考下面文章詳細(xì)2022-06-06Python3.2模擬實(shí)現(xiàn)webqq登錄
這篇文章主要介紹了Python模擬實(shí)現(xiàn)webqq登錄的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02Python中淺拷貝copy與深拷貝deepcopy的簡(jiǎn)單理解
今天小編就為大家分享一篇關(guān)于Python中淺拷貝copy與深拷貝deepcopy的簡(jiǎn)單理解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10Tensorflow進(jìn)行多維矩陣的拆分與拼接實(shí)例
今天小編就為大家分享一篇Tensorflow進(jìn)行多維矩陣的拆分與拼接實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-02-02