60秒系统安全认证实践

发布于:2024-10-24 编辑:匿名 来源:网络

/ python生产实践60秒系统安全认证实践/上一节主要讲解了目前主流的认证规范/协议并对JWT进行了深入的研究和分析,最后给出了解决方案在生产环境中如何生成有效的Token,以及如何基于Python语言在生产环境中进行有效的安全认证?在上一节中,我们还对基于JWT Token认证流程的登录认证和请求认证进行了理论分析,并以图形方式呈现了数据的流程。本节我们将从代码层面再次带大家过一遍这个过程,一方面加深大家对上一节理论部分的理解,另一方面也为大家提供了一套“模板”以便在工程过程中快速应用到项目中。

1 准备工具 1.1 密码安全 为了数据安全,我们使用PassLib对数据库中存储的用户密码进行加密,推荐的加密算法为“Bcrypt”。我们需要安装依赖包: 代码语言:javascript copy pip install passlibpip install bcrypt 我们简单介绍一下这两个库: 1. passlib 是 python2&3 的密码哈希库。

它提供了 30 多种密码哈希算法的跨平台实现。并作为管理现有密码哈希的框架。

它被设计用于广泛的任务,从验证 /etc/shadow 中找到的哈希值到为多用户应用程序提供全强度密码哈希值。 2. bcrypt模块是Python中用于生成强哈希的库。

注:如果您对以上两个库的详细信息感兴趣,可以去Python官网查看相关信息。本节的核心是实现整个流程。

这个具体的库内容就不详细介绍了。 2 用户登录流程 用户通过终端将用户名和密码发送到后端。

后端收到数据后,进行以下操作: 1、用户信息验证:检查当前系统中是否存在该用户,密码是否正确。 2. 如果用户存在,则生成JWT token并返回。

JWT 有效负载可以携带自定义内容。数据代码语言: javascript copy# -*- 编码: utf-8 -*-from datetime import datetime, timedeltafrom Typing importOptionalfrom fastapi import Depends, FastAPI, HTTPException, statusfrom fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestFormimport jwtfrom pydantic import BaseModelfrom passlib.context import CryptContext# 得到如下字符串:# openssl rand -hex 32SECRET_KEY = "09d25efaa6cac66b7ab93ff6f0f4caa6cf63b88e8d3e7"ALGORITHM = "HS" ACCESS_TOKEN_EXPIRE_MINUTES = 25# 模拟数据库数据 fake_users_db = { "hiashiniu" : { "用户名": "hiashiniu", " full_name": "HaiShiNiu", "email": "", "hashed_pa??ssword": "$2b$12$uG4n5CK4.kCid/MfQ3ns9.uRslWuWr9EL5FR4HYNg6SNo6wEn8OPC", "disabled": False, }}class Token(BaseModel): access_token: str token_type: strclass User(BaseModel): 用户名: str 电子邮件: 可选[str] = None full_name: 可选[str] = None 禁用: 可选[bool] = Noneclass UserInDB( User): hashed_pa??ssword: strpwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")app = FastAPI()# 验证密码 def verify_password(plain_password, hashed_pa??ssword) : return pwd_context.verify(plain_password, hashed_pa??ssword)# 密码哈希 def get_password_hash(password): # pwd_context.hash('9') # '$2b$12$uG4n5CK4.kCid/MfQ3ns9.uRslWuWr9EL5FR4HYNg6SNo6wEn8OPC' return pwd_context.hash(password) #模拟从数据库读取用户信息 def get_user(db, username: str): user_dict = db.get(username,None) if user_dict: return UserInDB(**user_dict)# 用户信息验证:用户名和密码分别验证 def verify_user( fake_db,用户名:str,密码:str):user = get_user(fake_db, username) print(user) if not user: return False if not verify_password(password, user.hashed_pa??ssword): return False return user# 生成带过期时间的 token def create_access_token(data: dict, expires_delta:Optional[ timedelta] = None): to_encode = data.copy() # 默认有效时间为25分钟 if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta(分钟 =15 )to_encode.update({“exp”:过期})encoded_jwt = jwt.encode(to_encode,SECRET_KEY,算法=算法)返回(“/ token”,response_model = Token)async def login_for_access_token(form_data:OAuth2PasswordRequestForm = Depends()): # 首先验证用户信息 print(form_data.password) print(form_data.username) user =authenticate_user(fake_users_db, form_data.username, form_data.password) if not user: raise HTTPException( status_code=status.HTTP__UNAUTHORIZED, detail="用户名或密码不正确", headers={"WWW-Authenticate": "Bearer"}, ) # 生成并返回token信息 access_token_expires = timedelta(分钟=ACCESS_TOKEN_EXPIRE_MINUTES) access_token = create_access_token( data= {"sub": user.username}, expires_delta=access_token_expires ) return {"access_token": access_token, "token_type": "bearer"}3 请求数据流端获取token信息后,必须包含在Authorization header中后续请求的信息只有持有 Bearer token 才可以被允许访问。

我们添加验证函数来验证请求的合法性,读取token内容,解析并验证。代码语言:javascript copy# -*- 编码:utf-8 -*-async def get_current_user(token: str = Depends(oauth2_scheme)):credentials_exception = HTTPException( status_code=status.HTTP__UNAUTHORIZED,detail="无法验证凭据", headers={"WWW-Authenticate": "Bearer"}, ) 尝试:payload = jwt.decode(token, SECRET_KEY,algorithms=[ALGORITHM]) username: str = Payload.get("sub") 如果用户名为 None:引发凭证异常,除了 jwt.PyJWTError 作为 ex: print(ex) 引发凭证异常 user = get_user(fake_users_db, username=username) 如果用户为 None:引发凭证异常 return ("/users/me/", response_model=User )async def read_users_me(current_user: User = Depends(get_current_user)): return current_user4 效果展示本节我们整合上面的代码来展示效果。

代码语言:javascript copy# -*- 编码:utf-8 -*-from datetime import datetime, timedeltafrom getting a string like this run:# openssl rand -hex 32SECRET_KEY = "09d25efaa6cac66b7ab93ff6f0f4caa6 cf63b88e8d3e7 "ALGORITHM = "HS"ACCESS_TOKEN_EXPIRE_MINUTES = 25# 模拟数据库数据fake_users_db = { "hiashiniu": { "username": "hiashiniu", "full_name": "HaiShiNiu", "email": "", " hashed_pa??ssword": "$2b$12$uG4n5CK4.kCid/MfQ3ns9.uRslWuWr9EL5FR4HYNg6SNo6wEn8OPC", "已禁用": False, }}类令牌(BaseModel): access_token: str token_type: strclass 用户(BaseModel): 用户名: str 电子邮件: 可选[str ] = 无 full_na我:可选[str] = None 禁用:可选[bool] = Noneclass UserInDB(用户):hashed_pa??ssword:strpwd_context = CryptContext(schemes = [“bcrypt”],不推荐=“auto”)oauth2_scheme = OAuth2PasswordBearer(tokenUrl =“/ token” ")app = FastAPI()# 验证密码 def verify_password(plain_password, hashed_pa??ssword): return pwd_context.verify(plain_password, hashed_pa??ssword)# 密码哈希 def get_password_hash(password): # pwd_context.hash('9') # '$2 b$12 $uG4n5CK4.kCid/MfQ3ns9.uRslWuWr9EL5FR4HYNg6SNo6wEn8OPC' return pwd_context.hash(password)# 模拟从数据库读取用户信息 def get_user(db, username: str): user_dict = db.get(username,None) if user_dict: return UserInDB( **user_dict)# 用户信息验证:分别验证用户名和密码 defauthenticate_user(fake_db, username:str,password:str): user = get_user(fake_db, username) if not user: return False if not verify_password(password, user .hashed_pa??ssword): 返回 Falsereturn user# 生成带过期时间的 token def create_access_token(data: dict,expires_delta:Optional[timedelta] = None): to_encode = data.copy() # 有效期默认时间为 25 分钟 if expires_delta:expire = datetime .utcnow () +expires_delta else:expire = datetime.utcnow() + timedelta(分钟=15) to_encode.update({"exp":expire})encoded_jwt = jwt.encode(to_encode, SECRET_KEY,algorithm=ALGORITHM) returnencoded_jwt @app .post("/token", response_model=Token)async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()): # 首先验证用户信息 print(form_data.password) print(form_data.username) user =authenticate_user(fake_users_db , form_data .username, form_data.password) 如果不是用户:引发 HTTPException( status_code=status.HTTP__UNAUTHORIZED, detail="用户名或密码不正确", headers={"WWW-Authenticate": "Bearer"},) # 生成并返回token信息 access_token_expires = timedelta(分钟=ACCESS_TOKEN_EXPIRE_MINUTES) access_token = create_access_token( data={"sub": user.username}, expires_delta=access_token_expires ) return {"access_token": access_token, "token_type": "bearer" }async def get_current_user(token: str = Depends(oauth2_scheme)):credentials_exception = HTTPException(status_code=status.HTTP__UNAUTHORIZED,detail="无法验证凭据", headers={"WWW-Authenticate": "Bearer"},) 尝试:payload = jwt.decode(token,SECRET_KEY,algorithms=[ALGORITHM])用户名:str = Payload.get(“sub”)如果用户名为None:引发凭证_异常,除了jwt.PyJWTError作为ex:print(ex)引发凭证_异常用户= get_user(fake_users_db, username=username) 如果用户为 None: raise凭证异常返回(“/ users / me /”,response_model = User)async def read_users_me(current_user:User = Depends(get_current_user)):返回current_user1。使用命令启动项目: 代码语言: javascript copy uvicorn main ;对原创性有新的认识并不容易。

只希望对那些需要这些内容的同事或者刚入行的人有所帮助。你们的每一次点赞和分享都是我继续创作的动力。

希望能够在路上推广Python技术。我会尽我所能,尽我所能。

欢迎大家在评论区向我提问。我将一一解答。

60秒系统安全认证实践

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 光润真空完成首轮天使轮融资,无锡天使基金独家完成

    光润真空完成首轮天使轮融资,无锡天使基金独家完成

    投资圈(ID:pedaily)据6月29日消息,复合集电设备制造商——无锡光润真空科技有限公司( (以下简称“广润真空”)完成天使轮融资。 本轮融资由无锡天使基金独家完成。 本轮融资将主要用于推动复合集流体专用磁控溅射镀膜设备的研发和生产,加速新一代产品的迭代落地。 广润

    06-18

  • 金属粉末零件公司西安欧众科技助力中国制造2.0

    金属粉末零件公司西安欧众科技助力中国制造2.0

    金属粉末是工程粉末的重要组成部分,广泛应用于机械、冶金、化工、航天材料等领域。 汽车工业的发展刺激和促进了粉末冶金工业的发展。 我国粉末冶金市场容量保持每年10%的增速。 近年来,我国国民经济平稳较快发展。 汽车(摩托车)、家电、冶金、化工等主要行业的发展带动了

    06-17

  • 今年首家易主PE公司:470亿出售

    今年首家易主PE公司:470亿出售

    一场震惊PE圈的并购诞生了。 投资界获悉,昨日(3月16日),瑞典私募股权公司EQT(EQT Group,下称:EQT)宣布,已收购Baring Private Equity Asia(下称:BPEA)/霸菱亚洲(Barings Asia)达成一项收购协议。 协议收购霸菱亚洲控股基金的普通合伙人实体霸菱亚洲管理公司 %股

    06-17

  • 半导体投资2320亿,三星力压群雄

    半导体投资2320亿,三星力压群雄

    据报道,韩国三星电子2016年在芯片工厂和设备上的投资比台积电、英特尔等任何竞争对手都多。 三星电子周三(9日)表示,已投资43.6万亿韩元(约合人民币1亿元)升级和扩建位于韩国和中国的芯片工厂。 这些工厂生产先进的 DRAM 芯片和垂直 NAND 闪存芯片。 资金也得到了补充。

    06-08

  • 【全球财经24小时】2023年7月19日投融资事件汇总及详情

    【全球财经24小时】2023年7月19日投融资事件汇总及详情

    今日全球市场共发生27起投资披露事件,其中境内20起,境外7起。 其中,国内先进制造业9例,医疗健康行业8例,传统制造业1例,电商行业2例。 国外区块链行业1个案例,医疗健康行业1个案例,企业服务行业1个案例,电商行业2个案例,金融行业2个案例。 国内事件 1、爱科光电今日

    06-18

  • 2021阿里巴巴封神之战暨宝马“互联网+汽车”赛道全球总决赛人气奖投票通道已开启!

    2021阿里巴巴封神之战暨宝马“互联网+汽车”赛道全球总决赛人气奖投票通道已开启!

    聚焦“未来汽车及智能汽车产业”,着力推动科技创新生态。 5月20日,由金桥集团、宝马、阿里云联合主办的阿里巴巴封神之战宝马“互联网+汽车”赛道全球总决赛将在上海拉开帷幕。 作为全球规模最大的创业大赛之一,阿里巴巴封神之战&宝马“互联网+汽车”赛道布局“互联网+汽车

    06-18

  • 库克言出必行,苹果发布自主研发防护口罩

    库克言出必行,苹果发布自主研发防护口罩

    疫情期间,苹果开始生产医疗用品。 2020年4月6日,苹果在官网发布了自研防护口罩Face Shield的教学指南。 防护面罩由三个主要部分组成:额头带、塑料面罩和不含乳胶的硅胶带。 首先,对准面罩和额头带的插槽,选择合适的插槽。 然后,将硅胶带穿过插槽并拉动进行调整。 面罩旨

    06-18

  • 佛山南海区累计设立直投基金45.81亿元

    佛山南海区累计设立直投基金45.81亿元

    据投资界(ID:pedaily)7月24日消息,近日,广东金融高新区投融资对接会召开位于广东千灯湖创业投资小镇。 来自金融机构、投资机构和企业的代表参加了本次活动。 会上,广东省佛山市南海区人民政府、国家开发银行广东省分行、南海农商银行共同签署支持南海制造业高质量发展

    06-18

  • 罗技MX Anywhere 3无线鼠标体验:关注者

    罗技MX Anywhere 3无线鼠标体验:关注者

    大约三年前,我想买一款体积小巧(出差方便)、支持多设备切换的蓝牙鼠标,最终选定了罗技MX系列鼠标。 我已经体验过这个系列的旗舰MX Master,它是办公鼠标的集大成者,但体积大,价格贵。 最终我选择了它的“小弟”MX Anywhere 2S,左右手都可以使用。 在我使用MX Anywhere

    06-21

  • 深圳:国家高新技术企业超过18000家,科技型中小企业超过5万家

    深圳:国家高新技术企业超过18000家,科技型中小企业超过5万家

    创造头条新闻,10月14日,科技部副部长邵新宇在新闻发布会上介绍国务院新闻办公室数据显示,截至今年,深圳全国高新技术企业超过1.8万家,科技型中小企业超过5万家,位居全国城市前列,有8家企业获得高新技术企业称号。 被选为世界最强。 高技术产业实现产值2.7万亿元,增加值

    06-18

  • 广州雷德倍尔完成金阖资本超5000万元B轮战略投资

    广州雷德倍尔完成金阖资本超5000万元B轮战略投资

    据投资界9月7日消息,据Arterial.com报道,广州耀明生物科技(简称雷德倍尔)完成B轮战略投资投资1万多元。 金阖资本(黄金)(领域医疗相关基金)投资。 本次战略融资将推动雷德倍尔两大诊断产品的研发和营销,满足两大疾病领域的临床诊断需求。 同年11月成立,是一家专注于

    06-17

  • 张本伟彻底退出我赛网第二人际圈,推广的新企业家

    张本伟彻底退出我赛网第二人际圈,推广的新企业家

    张本伟彻底退出我赛网第二人际圈,推广的新企业家。 2月12日,我赛网前CEO张本伟证实,他已完全退出该公司,不再维护该公司。 有公司股份。 正在筹划的新业务计划将围绕“第二人际圈”概念展开,计划于3月份正式发布新品。

    06-18