亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

python-jwt用戶認證食用教學的實現方法

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

jwt

詳解Django之auth模塊(用戶認證)

jwt的作用

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

python-jwt用戶認證食用教學的實現方法

基于傳統的token認證

用戶登錄,服務端返回token,并將token保存在服務端,以后用戶再來訪問時,需要攜帶token,服務端獲取token后,再去數據庫中獲取token進行校驗

jwt

用戶登錄,服務端給用戶返回一個token(服務端不保存)以后用戶再來訪問,需要攜帶token,服務端獲取token后,再做token的校驗----進行算法校驗

優勢:相較于傳統的token相比,它無需在服務端保存token

jwt的實現原理

第一步,用戶提交用戶名和密碼給服務器,如果登錄成功,使用jwt創建一個token,并給用戶返回.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

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

第一段字符串,HEADER,內部包含了算法/token類型,

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

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

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

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

{ 'sub': '1234567890', 'name': 'John Doe', 'iat': 1516239022 # 前兩個隨便寫,最后一個是超時時間}

第三段字符串:他會將第一段加密之后的值,和第二段加密之后的值通過.拼接起來

第一步:第1,2部分的密文拼接起來

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

第二步:對前兩部分密文進行HS256加密 + 加鹽第三步:對HS256加密后的密文再做base64url加密

以后用戶再來訪問的時候,需要攜帶token,后端需要對token進行校驗

獲取token

第一步: 對token進行切割,通過點切割成三部分

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

第二步: 對第二段進行 base64url 解密,并獲取payload信息,檢測token是否超時了?

{ 'sub': '1234567890', 'name': 'John Doe', 'iat': 1516239022 # 前兩個隨便寫,最后一個是超時時間}

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

第一步:第1,2部分的密文拼接起來

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

第二步:對前兩部分密文進行HS256加密 + 加鹽

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

jwt的引用

pip install pyjwtpyjwt.encode 生成tokenpyjwt.decode token解密

原理性的東西

python-jwt用戶認證食用教學的實現方法

python-jwt用戶認證食用教學的實現方法

基于jwt和drf實現用戶認證

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’) # 檢測用戶和密碼是否正確,此處可以在數據進行校驗。 if user == ’wupeiqi’ and pwd == ’123’: # 用戶名和密碼正確,給用戶生成token并返回 token = create_token({’username’: ’wupeiqi’}) return Response({’status’: True, ’token’: token}) return Response({’status’: False, ’error’: ’用戶名或密碼錯誤’})class OrderView(APIView): # 通過url傳遞token authentication_classes = [JwtQueryParamAuthentication, ] # 通過Authorization請求頭傳遞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'] #兩個認證版本}

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中通過參數進行傳輸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等于用戶對象,此處可以根據payload去數據庫中獲取用戶對象。 return (payload, token)class JwtAuthorizationAuthentication(BaseAuthentication): ''' 用戶需要通過請求頭的方式來進行傳輸token,例如: Authorization:jwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzM1NTU1NzksInVzZXJuYW1lIjoid3VwZWlxaSIsInVzZXJfaWQiOjF9.xj-7qSts6Yg5Ui55-aUOHJS4KSaeLq5weXMui2IIEJU ''' def authenticate(self, request): # 非登錄頁面需要校驗token authorization = request.META.get(’HTTP_AUTHORIZATION’, ’’) auth = authorization.split() if not auth: raise exceptions.AuthenticationFailed({’error’: ’未獲取到Authorization請求頭’, ’status’: False}) if auth[0].lower() != ’jwt’: raise exceptions.AuthenticationFailed({’error’: ’Authorization請求頭中認證方式錯誤’, ’status’: False}) if len(auth) == 1: raise exceptions.AuthenticationFailed({’error’: '非法Authorization請求頭', ’status’: False}) elif len(auth) > 2: raise exceptions.AuthenticationFailed({’error’: '非法Authorization請求頭', ’status’: False}) token = auth[1] result = parse_payload(token) if not result[’status’]: raise exceptions.AuthenticationFailed(result) # 如果想要request.user等于用戶對象,此處可以根據payload去數據庫中獲取用戶對象。 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的過期時間,默認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): ''' 對token進行和發行校驗并獲取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認證失敗’ except jwt.InvalidTokenError: result[’error’] = ’非法的token’ return result

擴展

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

djangorestframework-jwt 本質是調用pyjwt實現的

使用場景兩端開發,app,小程序開發!

到此這篇關于python-jwt用戶認證食用教學的文章就介紹到這了,更多相關python-jwt認證內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 99v视频国产在线观看免费 | 大色综合 | 亚洲欧美日韩国产综合 | 国产精品自在线 | 麻豆高清视频在线观看 | 国产情侣一区二区 | 一级成人毛片免费观看欧美 | 国产亚洲精品日韩香蕉网 | 男女一级做片a性视频 | 亚洲日b | 一级片特黄 | 丰满的大乳老师三级在线观看 | 中文字幕亚洲综合久久男男 | 亚洲tv精品一区二区三区 | 欧洲美女与黑人性大战 | 国产污片在线观看 | 极品美女aⅴ高清在线观看 极品美女一级毛片 | 久99久爱精品免费观看视频 | 99视频在线观看高清 | 久久国产精品-久久精品 | 国产精品嫩模在线播放 | 中美日韩在线网免费毛片视频 | 精品综合久久久久久99 | 欧美日本黄色片 | 黄色自拍| 91福利网址| 欧美蜜桃臀在线观看一区 | 亚洲欧美在线观看91偷拍 | 96免费精品视频在线 | a级片在线观看视频 | 日本一级毛片中文字幕 | 99久久综合狠狠综合久久一区 | 日韩精品一区二区三区中文3d | 欧美一区二区视频三区 | 国产黄色a三级三级三级 | 成年午夜性爽快免费视频不卡 | pans国产大尺度私密拍摄视频 | 亚洲偷图色综合色就色 | 日本一级毛片免费看 | 韩国三级欧美三级国产三级 | 91麻豆怎么进去 |