日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:9日期:2022-06-29 14:53:02

jwt

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

jwt的作用

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

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

基于傳統(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類型,

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è)隨便寫,最后一個(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è)隨便寫,最后一個(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 pyjwtpyjwt.encode 生成tokenpyjwt.decode token解密

原理性的東西

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

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

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

1.路由

#!/usr/bin/env python# -*- coding:utf-8 -*-from django.conf.urls import url, includefrom api import viewsurlpatterns = [ url(’^login/$’, views.LoginView.as_view()), url(’^order/$’, views.OrderView.as_view()),]

views

from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom utils.jwt_auth import create_tokenfrom extensions.auth import JwtQueryParamAuthentication, JwtAuthorizationAuthenticationclass 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 BaseAuthenticationfrom rest_framework import exceptionsfrom utils.jwt_auth import parse_payloadclass 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 jwtimport datetimefrom jwt import exceptionsJWT_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 resultdef 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 和上面的類似不建議使用,就是加了一些配置文件,只能在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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
青青久久av| 精品午夜久久| 国内精品99| 91精品亚洲| 黄色亚洲免费| 蜜芽一区二区三区| 久久国产人妖系列| 成人午夜在线| 亚洲成av人片一区二区密柚 | 亚洲一区二区免费在线观看| 亚洲91视频| 蜜桃一区二区三区在线| 日韩精品视频在线看| 欧美在线不卡| 欧美韩日一区| 激情91久久| 国产日韩一区| 日韩中文视频| 亚洲欧洲日韩精品在线| 久久免费精品| 午夜在线视频观看日韩17c| 欧美欧美黄在线二区| 久久婷婷av| 婷婷久久免费视频| 久久久久观看| 香蕉久久精品| 久久狠狠亚洲综合| 特黄特色欧美大片| 日本不卡的三区四区五区| 日韩av免费大片| 免费成人在线视频观看| 麻豆精品在线视频| 午夜影院欧美| 国产精品宾馆| 欧美在线亚洲| 国产精品三级| 91久久视频| 国产一区一一区高清不卡| 蜜桃伊人久久| 色在线视频观看| 亚洲色图国产| 日韩在线看片| 国产日韩欧美在线播放不卡| 国产精品av久久久久久麻豆网| 青青伊人久久| 亚洲性图久久| 免费一级欧美片在线观看网站| 欧美午夜不卡| 丁香婷婷久久| 亚洲精品美女91| 日韩在线精品| 国产精品久久免费视频| 香蕉精品999视频一区二区| 精品一区二区男人吃奶| 亚洲精品一区二区在线播放∴| 国产一区二区三区四区| 亚洲另类视频| 人人精品亚洲| 精品国产aⅴ| 69堂免费精品视频在线播放| 伊人久久大香线蕉av超碰演员| 久久91视频| 日韩一区二区三区四区五区| 欧美日韩在线播放视频| 国产一区二区三区四区大秀| 涩涩涩久久久成人精品| 欧美另类专区| 日韩免费高清| 免费在线亚洲欧美| 日韩av不卡在线观看| 亚洲精品a级片| 日韩高清中文字幕一区二区| 九九九精品视频| 国产精品成人**免费视频 | 激情六月综合| 免费在线小视频| 九九九精品视频| 欧美激情 亚洲a∨综合| 国产区精品区| 国产精品一区三区在线观看| 亚洲免费福利一区| 久热re这里精品视频在线6| 蜜臀av免费一区二区三区| 天堂√中文最新版在线| 欧美激情视频一区二区三区免费 | 久久久久国产| 91精品韩国| 婷婷综合六月| 欧美色图国产精品| 久久香蕉国产| 免费久久精品| sm久久捆绑调教精品一区| 九九久久国产| 国产一区二区三区视频在线| 丁香婷婷久久| а√天堂8资源中文在线| 日韩精品中文字幕第1页| av资源新版天堂在线| а√在线中文在线新版| 久久婷婷激情| 日韩视频一区| 亚洲午夜黄色| 天堂va蜜桃一区二区三区| 香蕉视频成人在线观看| 亚洲三级av| 国产精品黄网站| 美女视频黄免费的久久| 色综合五月天| 1024精品一区二区三区| 国产视频一区免费看| 亚洲综合小说| 国产精品毛片视频| 日韩欧美一区免费| 伊人影院久久| 综合国产视频| 免费亚洲一区| 欧美日韩免费看片| 视频在线观看一区| 欧美亚洲tv| 国产 日韩 欧美 综合 一区| 久久精品99久久无色码中文字幕| 欧美色图一区| 免费看黄色91| 国产精品久久久亚洲一区| 98精品久久久久久久| 欧美va天堂在线| 午夜性色一区二区三区免费视频| 国产日韩三级| 久久九九精品| 亚洲精品极品| 成人午夜网址| 国产婷婷精品| 麻豆一区在线| 精品在线99| 欧美日韩亚洲一区二区三区在线| 国产精品精品| 亚洲欧美日韩专区| 国产精品115| 亚洲精品97| 国产精品99久久久久久董美香| 久久一区二区三区电影| 亚洲网址在线观看| 国产一区精品福利| 日本 国产 欧美色综合| 欧美激情 亚洲a∨综合| 午夜欧美在线| 欧美aa在线视频| 亚洲欧美日韩专区| 精品国产黄a∨片高清在线| aⅴ色国产欧美| 精品三级久久久| 视频一区二区国产| 粉嫩av一区二区三区四区五区| 亚洲在线电影| 日韩大片在线| 国产免费播放一区二区| 亚洲欧美日本视频在线观看| 国产精品精品| 欧美日韩夜夜| 久久高清国产| 日韩黄色大片| 国产精品久久久久久模特 | 国产剧情一区二区在线观看| 久久天堂成人| 国产在线一区不卡| 日韩在线成人| 亚洲精品123区| 日韩在线高清| 精品久久电影| 日韩不卡手机在线v区| 午夜久久黄色| 日韩天堂在线| 国产在线不卡一区二区三区| 欧美视频一区| 日韩区欧美区| 视频一区二区中文字幕| 亚洲午夜黄色| 九九久久国产| 欧美一级二级三级视频| 首页欧美精品中文字幕| 欧美日韩国产一区二区三区不卡| 免费在线观看一区| 久久精品av麻豆的观看方式| 天堂av在线一区| 婷婷色综合网| 亚洲国产影院| 99久久婷婷| 欧美亚洲激情| 国产精品巨作av| 日韩动漫一区| 99riav国产精品| 99国产精品免费视频观看| 国产精品17p| 国产精品亚洲成在人线| 国产色噜噜噜91在线精品| 日韩精彩视频在线观看| 巨乳诱惑日韩免费av| 视频一区二区中文字幕| 亚洲尤物在线| 免费久久99精品国产|