欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python-jwt用戶認(rèn)證食用教學(xué)的實(shí)現(xiàn)方法

 更新時(shí)間:2021年01月19日 15:59:55   作者:木古房  
這篇文章主要介紹了python-jwt用戶認(rèn)證食用教學(xué)的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

jwt

詳解Django之a(chǎn)uth模塊(用戶認(rèn)證)

jwt的作用

json web token,一般用于用戶認(rèn)證就是做用戶登錄的(前后端分離/微信小程序/app開(kāi)發(fā))

基于傳統(tǒng)的token認(rèn)證

用戶登錄,服務(wù)端返回token,并將token保存在服務(wù)端,
以后用戶再來(lái)訪問(wèn)時(shí),需要攜帶token,服務(wù)端獲取token后,再去數(shù)據(jù)庫(kù)中獲取token進(jìn)行校驗(yàn)

jwt

用戶登錄,服務(wù)端給用戶返回一個(gè)token(服務(wù)端不保存)
以后用戶再來(lái)訪問(wèn),需要攜帶token,服務(wù)端獲取token后,再做token的校驗(yàn)----進(jìn)行算法校驗(yàn)

優(yōu)勢(shì):相較于傳統(tǒng)的token相比,它無(wú)需在服務(wù)端保存token

jwt的實(shí)現(xiàn)原理

第一步,用戶提交用戶名和密碼給服務(wù)器,如果登錄成功,使用jwt創(chuàng)建一個(gè)token,并給用戶返回.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

注意:jwt生成的token是由三段字符串組成,并且用.連接起來(lái)的

第一段字符串,HEADER,內(nèi)部包含了算法/token類(lèi)型,

json轉(zhuǎn)換成字符串,然后做一個(gè)base64url加密(base64加密;+_),加密再加替換

{
 "alg": "HS256",
 "typ": "JWT"
}

第二段字符串,PAYLOAD,自定義的值

讓json轉(zhuǎn)換成字符串,然后做一個(gè)base64url加密(base64加密;+_),加密再加替換

{
 "sub": "1234567890",
 "name": "John Doe",
 "iat": 1516239022 # 前兩個(gè)隨便寫(xiě),最后一個(gè)是超時(shí)時(shí)間
}

第三段字符串:他會(huì)將第一段加密之后的值,和第二段加密之后的值通過(guò).拼接起來(lái)

第一步:第1,2部分的密文拼接起來(lái)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

第二步:對(duì)前兩部分密文進(jìn)行HS256加密 + 加鹽
第三步:對(duì)HS256加密后的密文再做base64url加密

以后用戶再來(lái)訪問(wèn)的時(shí)候,需要攜帶token,后端需要對(duì)token進(jìn)行校驗(yàn)

獲取token

第一步: 對(duì)token進(jìn)行切割,通過(guò)點(diǎn)切割成三部分

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

第二步: 對(duì)第二段進(jìn)行 base64url 解密,并獲取payload信息,檢測(cè)token是否超時(shí)了?

{
 "sub": "1234567890",
 "name": "John Doe",
 "iat": 1516239022 # 前兩個(gè)隨便寫(xiě),最后一個(gè)是超時(shí)時(shí)間
}

第三步 :把第1,2段拼接,再次執(zhí)行HS256加密

第一步:第1,2部分的密文拼接起來(lái)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

第二步:對(duì)前兩部分密文進(jìn)行HS256加密 + 加鹽

密文 = base64解密(SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c)
如果密文相等,表示token未被修改過(guò)(認(rèn)證通過(guò))

jwt的引用

pip install pyjwt
pyjwt.encode 生成token

pyjwt.decode token解密

原理性的東西

基于jwt和drf實(shí)現(xiàn)用戶認(rèn)證

1.路由

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django.conf.urls import url, include
from api import views

urlpatterns = [ url('^login/$', views.LoginView.as_view()), url('^order/$', views.OrderView.as_view()),]

views

from rest_framework.views import APIView
from rest_framework.response import Response

from utils.jwt_auth import create_token
from extensions.auth import JwtQueryParamAuthentication, JwtAuthorizationAuthentication


class LoginView(APIView):
 def post(self, request, *args, **kwargs):
 """ 用戶登錄 """
 user = request.POST.get('username')
 pwd = request.POST.get('password')

 # 檢測(cè)用戶和密碼是否正確,此處可以在數(shù)據(jù)進(jìn)行校驗(yàn)。
 if user == 'wupeiqi' and pwd == '123':
  # 用戶名和密碼正確,給用戶生成token并返回
  token = create_token({'username': 'wupeiqi'})
  return Response({'status': True, 'token': token})
 return Response({'status': False, 'error': '用戶名或密碼錯(cuò)誤'})


class OrderView(APIView):
 # 通過(guò)url傳遞token
 authentication_classes = [JwtQueryParamAuthentication, ]

 # 通過(guò)Authorization請(qǐng)求頭傳遞token
 # authentication_classes = [JwtAuthorizationAuthentication, ]

 def get(self, request, *args, **kwargs):
 print(request.user, request.auth)
 return Response({'data': '訂單列表'})

 def post(self, request, *args, **kwargs):
 print(request.user, request.auth)
 return Response({'data': '添加訂單'})

 def put(self, request, *args, **kwargs):
 print(request.user, request.auth)
 return Response({'data': '修改訂單'})

 def delete(self, request, *args, **kwargs):
 print(request.user, request.auth)
 return Response({'data': '刪除訂單'})

settings

SECRET_KEY = '-(e4!74gqo8q@v-y#0cz9e7aeux4qx-pl1xw#05co4avr8r+r0'

REST_FRAMEWORK = {
 "DEFAULT_VERSIONING_CLASS": 'rest_framework.versioning.URLPathVersioning',
 "ALLOWED_VERSIONS": ['v1', "v2"] #兩個(gè)認(rèn)證版本
}

extensions.auth

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
from utils.jwt_auth import parse_payload


class JwtQueryParamAuthentication(BaseAuthentication):
 """
 用戶需要在url中通過(guò)參數(shù)進(jìn)行傳輸token,例如:
 http://www.pythonav.com?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzM1NTU1NzksInVzZXJuYW1lIjoid3VwZWlxaSIsInVzZXJfaWQiOjF9.xj-7qSts6Yg5Ui55-aUOHJS4KSaeLq5weXMui2IIEJU
 """

 def authenticate(self, request):
 token = request.query_params.get('token')
 payload = parse_payload(token)
 if not payload['status']:
  raise exceptions.AuthenticationFailed(payload)

 # 如果想要request.user等于用戶對(duì)象,此處可以根據(jù)payload去數(shù)據(jù)庫(kù)中獲取用戶對(duì)象。
 return (payload, token)


class JwtAuthorizationAuthentication(BaseAuthentication):
 """
 用戶需要通過(guò)請(qǐng)求頭的方式來(lái)進(jìn)行傳輸token,例如:
 Authorization:jwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzM1NTU1NzksInVzZXJuYW1lIjoid3VwZWlxaSIsInVzZXJfaWQiOjF9.xj-7qSts6Yg5Ui55-aUOHJS4KSaeLq5weXMui2IIEJU
 """

 def authenticate(self, request):

 # 非登錄頁(yè)面需要校驗(yàn)token
 authorization = request.META.get('HTTP_AUTHORIZATION', '')
 auth = authorization.split()
 if not auth:
  raise exceptions.AuthenticationFailed({'error': '未獲取到Authorization請(qǐng)求頭', 'status': False})
 if auth[0].lower() != 'jwt':
  raise exceptions.AuthenticationFailed({'error': 'Authorization請(qǐng)求頭中認(rèn)證方式錯(cuò)誤', 'status': False})

 if len(auth) == 1:
  raise exceptions.AuthenticationFailed({'error': "非法Authorization請(qǐng)求頭", 'status': False})
 elif len(auth) > 2:
  raise exceptions.AuthenticationFailed({'error': "非法Authorization請(qǐng)求頭", 'status': False})

 token = auth[1]
 result = parse_payload(token)
 if not result['status']:
  raise exceptions.AuthenticationFailed(result)

 # 如果想要request.user等于用戶對(duì)象,此處可以根據(jù)payload去數(shù)據(jù)庫(kù)中獲取用戶對(duì)象。
 return (result, token)

utils.jwt_auth

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import jwt
import datetime
from jwt import exceptions

JWT_SALT = 'iv%x6xo7l7_u9bf_u!9#g#m*)*=ej@bek5)(@u3kh*72+unjv='

def create_token(payload, timeout=20):
 """
 :param payload: 例如:{'user_id':1,'username':'wupeiqi'}用戶信息
 :param timeout: token的過(guò)期時(shí)間,默認(rèn)20分鐘
 :return:
 """
 headers = {
 'typ': 'jwt',
 'alg': 'HS256'
 }
 payload['exp'] = datetime.datetime.utcnow() + datetime.timedelta(minutes=timeout)
 result = jwt.encode(payload=payload, key=JWT_SALT, algorithm="HS256", headers=headers).decode('utf-8')
 return result

def parse_payload(token):
 """
 對(duì)token進(jìn)行和發(fā)行校驗(yàn)并獲取payload
 :param token:
 :return:
 """
 result = {'status': False, 'data': None, 'error': None}
 try:
 verified_payload = jwt.decode(token, JWT_SALT, True)
 result['status'] = True
 result['data'] = verified_payload
 except exceptions.ExpiredSignatureError:
 result['error'] = 'token已失效'
 except jwt.DecodeError:
 result['error'] = 'token認(rèn)證失敗'
 except jwt.InvalidTokenError:
 result['error'] = '非法的token'
 return result

擴(kuò)展

pip3 install djangorestframework-jwt 和上面的類(lèi)似不建議使用,就是加了一些配置文件,只能在drf中用,太局限l

djangorestframework-jwt 本質(zhì)是調(diào)用pyjwt實(shí)現(xiàn)的

使用場(chǎng)景兩端開(kāi)發(fā),app,小程序開(kāi)發(fā)!

到此這篇關(guān)于python-jwt用戶認(rèn)證食用教學(xué)的文章就介紹到這了,更多相關(guān)python-jwt認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 實(shí)現(xiàn)圖像快速替換某種顏色

    python 實(shí)現(xiàn)圖像快速替換某種顏色

    這篇文章主要介紹了python 實(shí)現(xiàn)圖像快速替換某種顏色,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Pandas加速代碼之避免使用for循環(huán)

    Pandas加速代碼之避免使用for循環(huán)

    如果你使用Python和Pandas進(jìn)行數(shù)據(jù)分析,循環(huán)是不可避免要使用的。這篇文章主要給大家介紹了關(guān)于Pandas加速代碼之避免使用for循環(huán)的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • Python如何將字符串轉(zhuǎn)換為日期

    Python如何將字符串轉(zhuǎn)換為日期

    這篇文章主要介紹了Python如何將字符串轉(zhuǎn)換為日期,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • python利用openpyxl拆分多個(gè)工作表的工作簿的方法

    python利用openpyxl拆分多個(gè)工作表的工作簿的方法

    這篇文章主要介紹了python利用openpyxl拆分多個(gè)工作表的工作簿的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python3中_from...import...與import?...之間的區(qū)別詳解(包/模塊)

    python3中_from...import...與import?...之間的區(qū)別詳解(包/模塊)

    Python編碼第一步是導(dǎo)入模塊,有時(shí)候用import?***有時(shí)候用from...import,下面這篇文章主要給大家介紹了關(guān)于python3中_from...import...與import?...之間區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Python中TCP協(xié)議的探索與實(shí)例解析

    Python中TCP協(xié)議的探索與實(shí)例解析

    網(wǎng)絡(luò)編程在當(dāng)今數(shù)字化世界中扮演著至關(guān)重要的角色,本文將帶你深入了解 Python 中的 TCP 協(xié)議,介紹網(wǎng)絡(luò)編程的基礎(chǔ)知識(shí),并提供豐富的示例代碼,希望對(duì)大家有所幫助
    2023-12-12
  • 用python如何繪制表格不同顏色的excel

    用python如何繪制表格不同顏色的excel

    做數(shù)據(jù)分析的時(shí)候,用到了對(duì)Excel中的數(shù)據(jù)進(jìn)行顯示處理,能更直觀的了解數(shù)據(jù),所以下面這篇文章主要給大家介紹了關(guān)于利用python如何繪制表格不同顏色excel的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • python使用pyshp讀寫(xiě)shp文件的實(shí)現(xiàn)

    python使用pyshp讀寫(xiě)shp文件的實(shí)現(xiàn)

    本文主要介紹了python使用pyshp讀寫(xiě)shp文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Django開(kāi)發(fā)中使用Ueditor上傳圖片遇到的坑及解決

    Django開(kāi)發(fā)中使用Ueditor上傳圖片遇到的坑及解決

    在Django開(kāi)發(fā)中使用Ueditor上傳圖片時(shí),可能會(huì)遇到后端配置不正確的問(wèn)題,建議在實(shí)例化Ueditor后加上serverUrl,這可以在Chrome的F12工具中查看請(qǐng)求的后端配置項(xiàng),此外,如果需要修改上傳路徑,可以在配置文件中更改路徑,并調(diào)整view.py中的代碼來(lái)管理上傳文件
    2024-09-09
  • python?nonlocal的用法詳解

    python?nonlocal的用法詳解

    這篇文章主要給大家介紹了關(guān)于python?nonlocal用法的相關(guān)資料,最近在python學(xué)習(xí)中遇到了nonlocal關(guān)鍵字但是感到困惑,于是記錄nonlocal關(guān)鍵字用法,需要的朋友可以參考下
    2023-10-10

最新評(píng)論