电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

jwt

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

jwt的作用

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

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

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

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

jwt

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

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

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

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

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

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

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

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

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

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

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

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

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

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

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

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

以后用戶再來訪問的時候,需要攜帶token,后端需要對token進(jìn)行校驗(yàn)

獲取token

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

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

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

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

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

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

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

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

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

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’) # 檢測用戶和密碼是否正確,此處可以在數(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’: ’用戶名或密碼錯誤’})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'] #兩個認(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中通過參數(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等于用戶對象,此處可以根據(jù)payload去數(shù)據(jù)庫中獲取用戶對象。 return (payload, token)class JwtAuthorizationAuthentication(BaseAuthentication): ''' 用戶需要通過請求頭的方式來進(jìn)行傳輸token,例如: Authorization:jwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzM1NTU1NzksInVzZXJuYW1lIjoid3VwZWlxaSIsInVzZXJfaWQiOjF9.xj-7qSts6Yg5Ui55-aUOHJS4KSaeLq5weXMui2IIEJU ''' def authenticate(self, request): # 非登錄頁面需要校驗(yàn)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請求頭中認(rèn)證方式錯誤’, ’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等于用戶對象,此處可以根據(jù)payload去數(shù)據(jù)庫中獲取用戶對象。 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的過期時間,默認(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): ''' 對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)的

使用場景兩端開發(fā),app,小程序開發(fā)!

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 流量卡中心-流量卡套餐查询系统_移动电信联通流量卡套餐大全 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 鹤壁创新仪器公司-全自动量热仪,定硫仪,煤炭测硫仪,灰熔点测定仪,快速自动测氢仪,工业分析仪,煤质化验仪器 | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 滚珠丝杆升降机_螺旋升降机_丝杠升降机-德迈传动 | 实验室装修_实验室设计_实验室规划设计- 上海广建净化工程公司 | 首页-浙江橙树网络技术有限公司 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 圆窗水平仪|伊莉莎冈特elesa+ganter| 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 精密交叉滚子轴承厂家,转盘轴承,YRT转台轴承-洛阳千协轴承 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 天津次氯酸钠酸钙溶液-天津氢氧化钠厂家-天津市辅仁化工有限公司 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 棉柔巾代加工_洗脸巾oem_一次性毛巾_浴巾生产厂家-杭州禾壹卫品科技有限公司 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | TTCMS自助建站_网站建设_自助建站_免费网站_免费建站_天天向上旗下品牌 | 棉柔巾代加工_洗脸巾oem_一次性毛巾_浴巾生产厂家-杭州禾壹卫品科技有限公司 | 纯水设备_苏州皙全超纯水设备水处理设备生产厂家 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 传爱自考网_传爱自学考试网 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 湖南长沙商标注册专利申请,长沙公司注册代理记账首选美创! | 示波器高压差分探头-国产电流探头厂家-南京桑润斯电子科技有限公司 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net |