最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django rest framework jwt的使用方法詳解

 更新時(shí)間:2019年08月08日 09:35:08   作者:Maple_feng  
這篇文章主要介紹了Django rest framework jwt的使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一簡介

JWT 是一個(gè)開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種用于簡潔,自包含的用于通信雙方之間以 JSON 對(duì)象的形式安全傳遞信息的方法。該信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。JWTS可以使用秘密(使用HMAC算法)或公鑰/私鑰對(duì)使用RSA或ECDSA來簽名。

JWT的組成部分:

header

Header是由下面這個(gè)格式的Json通過Base64編碼(編碼不是加密,是可以通過反編碼的方式獲取到這個(gè)原來的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ù)庫中的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í)用的密鑰的話,得出來的簽名也是不一樣的。

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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)基本線性數(shù)據(jù)結(jié)構(gòu)

    Python實(shí)現(xiàn)基本線性數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要實(shí)現(xiàn)四種數(shù)據(jù)結(jié)構(gòu),分別是數(shù)組、堆棧、隊(duì)列、鏈表。大家都知道可以用C語言實(shí)現(xiàn)這幾種數(shù)據(jù)結(jié)構(gòu),其實(shí)Python也可以實(shí)現(xiàn),下面跟著小編一起來學(xué)習(xí)。
    2016-08-08
  • python斐波那契數(shù)列的計(jì)算方法

    python斐波那契數(shù)列的計(jì)算方法

    這篇文章主要為大家詳細(xì)介紹了python斐波那契數(shù)列的計(jì)算方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Windows中使用wxPython和py2exe開發(fā)Python的GUI程序的實(shí)例教程

    Windows中使用wxPython和py2exe開發(fā)Python的GUI程序的實(shí)例教程

    wxPython是一款集成了Python的圖形化類庫的工具,而py2exe是一款將Python程序轉(zhuǎn)換為exe可執(zhí)行文件的程序,二者搭配可以輕松地在Windows中創(chuàng)建圖形化程序,這里我們就來學(xué)習(xí)Windows中使用wxPython和py2exe開發(fā)Python的GUI程序的實(shí)例教程:
    2016-07-07
  • Python擴(kuò)展內(nèi)置類型詳解

    Python擴(kuò)展內(nèi)置類型詳解

    這篇文章主要為大家詳細(xì)介紹了Python擴(kuò)展內(nèi)置類型的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python 插入Null值數(shù)據(jù)到Postgresql的操作

    python 插入Null值數(shù)據(jù)到Postgresql的操作

    這篇文章主要介紹了python 插入Null值數(shù)據(jù)到Postgresql的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python ellipsis 的用法詳解

    Python ellipsis 的用法詳解

    這篇文章主要介紹了Python ellipsis 的用法詳解,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • Python+PyQt手搓一個(gè)簡單的記事本

    Python+PyQt手搓一個(gè)簡單的記事本

    這篇文章主要為大家詳細(xì)介紹了Python如何結(jié)合PyQt手搓一個(gè)簡單的記事本,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • python  ceiling divide 除法向上取整(或小數(shù)向上取整)的實(shí)例

    python ceiling divide 除法向上取整(或小數(shù)向上取整)的實(shí)例

    今天小編就為大家分享一篇python ceiling divide 除法向上取整 (或小數(shù)向上取整)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Scrapy之迭代爬取網(wǎng)頁中失效問題及解決

    Scrapy之迭代爬取網(wǎng)頁中失效問題及解決

    這篇文章主要介紹了Scrapy之迭代爬取網(wǎng)頁中失效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 推薦10款最受Python開發(fā)者歡迎的Python IDE

    推薦10款最受Python開發(fā)者歡迎的Python IDE

    這篇文章收集了一些對(duì)開發(fā)者非常有幫助的,最好的10款Python IDE,包括Vim,Eclipse with PyDev,Sublime Text,PyCharm等知明Python開發(fā)工具
    2018-09-09

最新評(píng)論

黔西| 新野县| 喀什市| 平邑县| 凤凰县| 德令哈市| 元朗区| 仁化县| 成安县| 醴陵市| 宁蒗| 信丰县| 吉木乃县| 自贡市| 道真| 饶阳县| 通许县| 当雄县| 芜湖县| 武冈市| 巫溪县| 乡宁县| 漠河县| 萍乡市| 泸州市| 新竹市| 洪洞县| 呼和浩特市| 钟山县| 垫江县| 红原县| 龙山县| 岳阳县| 永福县| 白玉县| 小金县| 邻水| 紫阳县| 墨玉县| 宾川县| 横山县|