当前位置: 首页 > article >正文

Python API认证与授权实战:从Basic Auth到OAuth2.0

Python API认证与授权实战从Basic Auth到OAuth2.0引言API安全是后端开发中至关重要的一环。作为从Python转向Rust的后端开发者我深刻体会到认证与授权机制的重要性。一个安全可靠的API需要完善的认证体系来保护敏感数据和资源。本文将从实战角度出发深入探讨Python API认证与授权的各种方案帮助你构建安全的后端服务。一、认证与授权概述1.1 基本概念认证(Authentication)验证用户身份确认你是谁授权(Authorization)决定用户能访问什么资源确认你能做什么会话管理跟踪用户登录状态1.2 常见认证方案对比方案安全性复杂度适用场景Basic Auth低低内部工具、开发环境API Key中低服务器间通信JWT高中现代Web应用OAuth2.0高高第三方登录、开放平台Session-Cookie中中传统Web应用二、Basic Authentication2.1 原理Basic Auth是最简单的认证方式通过在请求头中发送Base64编码的用户名和密码Authorization: Basic base64(username:password)2.2 Flask实现from flask import Flask, request, jsonify from base64 import b64decode app Flask(__name__) def check_auth(username, password): return username admin and password secret def authenticate(): return jsonify({error: Unauthorized}), 401, { WWW-Authenticate: Basic realmLogin Required } app.route(/protected) def protected(): auth request.headers.get(Authorization) if not auth or not auth.startswith(Basic ): return authenticate() encoded auth.split( )[1] decoded b64decode(encoded).decode(utf-8) username, password decoded.split(:) if check_auth(username, password): return jsonify({message: Welcome!}) return authenticate() if __name__ __main__: app.run()三、API Key认证3.1 设计思路API Key适合服务器间通信通过在请求头或URL参数中传递密钥from fastapi import FastAPI, Header, HTTPException app FastAPI() API_KEYS {valid_api_key_123: user1, valid_api_key_456: user2} async def get_api_key(x_api_key: str Header(None)): if x_api_key not in API_KEYS: raise HTTPException(status_code401, detailInvalid API Key) return API_KEYS[x_api_key] app.get(/api/data) async def get_data(api_key: str Depends(get_api_key)): return {data: sensitive information, user: api_key}3.2 安全建议使用HTTPS传输API Key定期轮换API Key限制API Key的使用范围四、JWT认证4.1 JWT结构JWT由三部分组成用点号分隔Header声明类型和算法Payload包含用户信息和声明Signature用于验证完整性4.2 PyJWT实现import jwt from datetime import datetime, timedelta from fastapi import FastAPI, Depends, HTTPException from pydantic import BaseModel app FastAPI() SECRET_KEY your-secret-key-here ALGORITHM HS256 ACCESS_TOKEN_EXPIRE_MINUTES 30 class Token(BaseModel): access_token: str token_type: str class User(BaseModel): username: str password: str def create_access_token(data: dict): to_encode data.copy() expire datetime.utcnow() timedelta(minutesACCESS_TOKEN_EXPIRE_MINUTES) to_encode.update({exp: expire}) encoded_jwt jwt.encode(to_encode, SECRET_KEY, algorithmALGORITHM) return encoded_jwt app.post(/token, response_modelToken) async def login(form_data: User): if form_data.username ! admin or form_data.password ! secret: raise HTTPException(status_code401, detailInvalid credentials) access_token create_access_token(data{sub: form_data.username}) return {access_token: access_token, token_type: bearer} app.get(/protected) async def protected(token: str Depends(get_token)): return {message: Welcome!}4.3 Token验证中间件from fastapi import Request, HTTPException from starlette.middleware.base import BaseHTTPMiddleware class AuthMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): if request.url.path /token: return await call_next(request) auth_header request.headers.get(Authorization) if not auth_header or not auth_header.startswith(Bearer ): raise HTTPException(status_code401, detailToken missing) token auth_header.split( )[1] try: payload jwt.decode(token, SECRET_KEY, algorithms[ALGORITHM]) request.state.user payload.get(sub) except jwt.PyJWTError: raise HTTPException(status_code401, detailInvalid token) return await call_next(request)五、OAuth2.0认证5.1 OAuth2.0流程用户 → 授权请求 → 授权服务器 → 授权码 → 令牌请求 → 访问令牌 → 资源服务器5.2 使用Authlib实现from flask import Flask, redirect, url_for, session from authlib.integrations.flask_client import OAuth app Flask(__name__) app.secret_key your-secret-key oauth OAuth(app) github oauth.register( namegithub, client_idyour-client-id, client_secretyour-client-secret, access_token_urlhttps://github.com/login/oauth/access_token, authorize_urlhttps://github.com/login/oauth/authorize, api_base_urlhttps://api.github.com/, client_kwargs{scope: user:email} ) app.route(/login) def login(): redirect_uri url_for(authorize, _externalTrue) return github.authorize_redirect(redirect_uri) app.route(/authorize) def authorize(): token github.authorize_access_token() resp github.get(user, tokentoken) user_info resp.json() session[user] user_info return redirect(/profile) app.route(/profile) def profile(): user session.get(user) if not user: return redirect(/login) return fHello {user[login]}!六、权限控制6.1 基于角色的访问控制(RBAC)from enum import Enum class Role(str, Enum): ADMIN admin USER user GUEST guest class User(BaseModel): username: str role: Role def require_role(required_role: Role): def decorator(func): async def wrapper(*args, **kwargs): user kwargs.get(user) if not user or user.role required_role: raise HTTPException(status_code403, detailInsufficient permissions) return await func(*args, **kwargs) return wrapper return decorator app.get(/admin) require_role(Role.ADMIN) async def admin_panel(user: User Depends(get_current_user)): return {message: Admin panel}6.2 基于资源的访问控制async def check_resource_access(user_id: str, resource_id: str) - bool: # 检查用户是否有权访问该资源 return True app.get(/resources/{resource_id}) async def get_resource( resource_id: str, user: User Depends(get_current_user) ): if not await check_resource_access(user.id, resource_id): raise HTTPException(status_code403, detailAccess denied) return {resource: data}七、实战完整认证系统7.1 用户模型from sqlalchemy import Column, String, Boolean from sqlalchemy.ext.declarative import declarative_base from passlib.context import CryptContext Base declarative_base() pwd_context CryptContext(schemes[bcrypt], deprecatedauto) class User(Base): __tablename__ users id Column(String, primary_keyTrue) username Column(String, uniqueTrue, indexTrue) email Column(String, uniqueTrue, indexTrue) hashed_password Column(String) is_active Column(Boolean, defaultTrue) def verify_password(self, password: str) - bool: return pwd_context.verify(password, self.hashed_password) def create_access_token(self) - str: return create_access_token(data{sub: self.username})7.2 注册与登录class UserCreate(BaseModel): username: str email: str password: str app.post(/register) async def register(user: UserCreate, db: Session Depends(get_db)): db_user db.query(User).filter(User.email user.email).first() if db_user: raise HTTPException(status_code400, detailEmail already registered) hashed_password pwd_context.hash(user.password) new_user User( idstr(uuid.uuid4()), usernameuser.username, emailuser.email, hashed_passwordhashed_password ) db.add(new_user) db.commit() db.refresh(new_user) return {message: User created successfully}八、安全最佳实践8.1 密码安全使用强哈希算法bcrypt、Argon2禁止存储明文密码定期更换密码8.2 Token安全使用HTTPS传输所有数据设置合理的Token过期时间使用安全的存储方式HttpOnly Cookie8.3 防止攻击实现速率限制使用CSRF保护验证所有输入数据九、总结API认证与授权是构建安全后端服务的核心。通过选择合适的认证方案、实现完善的权限控制机制并遵循安全最佳实践我们可以构建出安全可靠的API系统。关键要点选择合适的认证方案根据场景选择Basic Auth、API Key、JWT或OAuth2.0实现权限控制使用RBAC或基于资源的访问控制保护敏感数据使用HTTPS、强哈希算法添加安全层速率限制、CSRF保护、输入验证从Python转向Rust后我发现Rust在安全方面的优势非常明显编译时的内存安全检查可以帮助我们在开发阶段就发现潜在的安全问题。延伸阅读OAuth2.0官方规范JWT官方文档FastAPI安全指南OWASP安全实践

相关文章:

Python API认证与授权实战:从Basic Auth到OAuth2.0

Python API认证与授权实战:从Basic Auth到OAuth2.0 引言 API安全是后端开发中至关重要的一环。作为从Python转向Rust的后端开发者,我深刻体会到认证与授权机制的重要性。一个安全可靠的API需要完善的认证体系来保护敏感数据和资源。本文将从实战角度出…...

【Elasticsearch从入门到精通】第06篇:Elasticsearch重要系统参数设置——防止启动检查失败

上一篇【第05篇】Elasticsearch配置详解——config.yml核心配置项全解析 下一篇【第07篇】Elasticsearch集群安全配置 摘要 将Elasticsearch部署到生产环境时,操作系统层面的参数配置往往是被忽视的关键环节。ES通过Bootstrap Checks机制在启动时强制检测这些参数&…...

AI Agent架构选型实战指南:从行为复杂度到协作粒度

1. 这不是理论课,是我在真实项目里踩坑后画出的AI Agent架构地图你有没有过这种感觉:刚学完LangChain,信心满满想搭个“智能客服”,结果写到第三层条件分支就发现逻辑像毛线团——用户问“查订单”,系统要先判断是否登…...

Python机器学习模型部署实战:从训练到生产环境

Python机器学习模型部署实战:从训练到生产环境 引言 作为从Python转向Rust的后端开发者,我深刻体会到机器学习模型部署的重要性。一个优秀的模型如果不能成功部署到生产环境,其价值将大打折扣。本文将从实战角度出发,详细介绍Pyth…...

KAG增强生成、AlphaMath推理与Offloading协同架构

1. 项目概述:一场聚焦模型轻量化与推理边界的深度技术切片 “AI Innovations and Insights 23: KAG, AlphaMath, and Offloading”这个标题,乍看像是一场行业峰会的分论坛名称,但拆开来看,它其实是一份高度凝练的技术路线图——KA…...

通过Taotoken的CLI工具一键配置Python开发环境

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken的CLI工具一键配置Python开发环境 对于希望快速开始使用大模型API的Python开发者而言,手动配置API密钥、B…...

Donut端到端票据识别:小票图像直出结构化JSON

1. 项目概述:一张小票,如何让AI“看懂”并结构化输出?你有没有试过把超市小票拍张照,想让手机自动提取“总金额:89.50”“商品:牛奶2”“时间:2024-03-12 18:23”这些信息?不是OCR识…...

Python机器学习实战路线图:从EDA到模型部署的工业级路径

1. 这不是“速成课”,而是一份我带过37个转行学员后重写的Python机器学习实战路线图 你点开这篇,大概率正站在两个路口之间:一边是刷了三个月Kaggle入门赛却卡在特征工程上动弹不得,另一边是翻烂了《统计学习方法》却连一个能跑通…...

NotebookLM风格崩塌的7个隐性信号:从语义漂移到角色失焦,一文诊断并修复

更多请点击: https://intelliparadigm.com 第一章:NotebookLM风格崩塌的诊断元框架 当NotebookLM在真实知识工作流中表现出响应失焦、引用漂移、上下文断裂或语义坍缩等现象时,“风格崩塌”并非界面缺陷,而是底层多模态对齐机制失…...

AI Agent预测式防御:毫秒级故障预判与柔性干预

1. 项目概述:这不是又一个“AI Agent故障复盘”,而是一次对失败根因的工程化反演 你有没有遇到过这样的情况:花两周时间精心设计了一个AI Agent流程,接入了最新版的LLM API,配置了多层工具调用和记忆机制,测…...

1756-PA75R直流冗余电源模块

1756-PA75R直流冗余电源模块产品特点1756-PA75R是为ControlLogix系统设计的高可靠直流冗余电源模块,支持热更换与均流控制。其核心特点如下:支持双机并联,构建真正的N1冗余系统。具备自动均流技术,避免单模块过载。支持带电热更换…...

云飞云 + SolidWorks服务器 = 10人研发共享方案,附硬件配置清单

10人研发团队用SolidWorks搞设计,是中小制造企业最常见的场景——模型要画、装配要搭、渲染要跑、图纸要存,每天8小时高强度运转。传统模式下每台工作站动辄2~3万元,10台就是25万起步;软件授权10套License,年费轻松30~…...

Monk AI小样本分类实战:用几十张图快速构建可用AI模型

1. 项目概述:用 Monk AI 做分类,但只喂它一小块数据——这到底在解决什么问题?“Classification Using Monk AI by Using a Slice of the Dataset”这个标题乍看平平无奇,甚至有点拗口,但如果你在工业质检、医疗影像初…...

原神抽卡数据分析神器:告别盲目抽卡,用数据掌控你的欧皇之路

原神抽卡数据分析神器:告别盲目抽卡,用数据掌控你的欧皇之路 【免费下载链接】genshin-wish-export Easily export the Genshin Impact wish record. 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin-wish-export 你是否曾在原神抽卡时…...

用随机森林实现手写大写字母识别的完整实践

1. 项目概述:用随机森林搞定手写信件识别,这事儿比你想象中更接地气 “How To Perform Letter Recognition in Python Using Random Forest Classifier”——这个标题乍看像教科书里的章节名,但实际拆开来看,它直指一个非常典型、…...

AI驱动的数据操作系统:重构标注、治理与质量闭环

1. 项目概述:当数据标注不再只是“画框”和“打标签”“State-of-the-Art Data Labeling With a True AI-Powered Data Management Platform”——这个标题乍看像一句市场宣传语,但拆开来看,它其实精准锚定了当前AI工程落地最卡脖子的环节&am…...

如何快速配置FanControl风扇控制:从安装到优化的完整指南

如何快速配置FanControl风扇控制:从安装到优化的完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

用随机森林实现手写英文字母识别(Python实战)

1. 项目概述:用随机森林搞定手写信件识别,这事儿比你想象中更接地气 “How To Perform Letter Recognition in Python Using Random Forest Classifier”——这个标题乍看像教科书里的章节名,但实际拆开来看,它直指一个非常具体、…...

HS2汉化补丁终极指南:打造完美中文游戏体验的完整解决方案

HS2汉化补丁终极指南:打造完美中文游戏体验的完整解决方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2汉化补丁是针对Honey Select 2游戏的专…...

诸侯割据:不是只有坏处——有些阶段,它是“必要的恶”

在主流的管理话语里,“诸侯割据”几乎是个贬义词。它让人联想到山头主义、资源内耗、总部失控。但有没有一种可能:它在某些阶段、某些条件下,恰恰是企业活下去、长起来的“必要代价”? 一、先看好处:诸侯式架构的“四…...

AI Agent 运行时革命:从上下文牢笼到可审计的会话日志

1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了 你有没有试过让一个 AI 代理连续工作四十分钟?不是闲聊,而是真正在查资料、调 API、写代码、改文档——一环扣一环地推进一个复杂任务。我去年就带着团队跑过这样一个销售线索深度分析 …...

淘宝淘金币自动化终极指南:如何用5分钟完成30分钟日常任务

淘宝淘金币自动化终极指南:如何用5分钟完成30分钟日常任务 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi …...

机器学习生产化:从Notebook到可运维ML服务的实战路径

1. 项目概述:当模型走出笔记本,真正开始“呼吸”现实空气 你有没有经历过这样的时刻:Jupyter Notebook里所有指标都闪闪发亮,AUC 0.92,F1 0.87,交叉验证稳如泰山;业务方点头签字,上线…...

Supermask:冻结权重+二值掩码的神经网络子结构发现方法

1. 什么是 Supermasks?——不是“超级面具”,而是神经网络里的“先天直觉” 你有没有试过教一个刚学会走路的孩子认苹果?你不需要从零开始教他光谱分析、细胞结构或者植物分类学,只要拿个红彤彤的苹果在他眼前晃一晃,再…...

python旅游分享点评网系统

目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能技术栈扩展功能建议项目亮点项目技术支持源码获取详细视频演示 :同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目概述 Python旅游分…...

NoFences:免费开源的Windows桌面整理神器,让杂乱图标瞬间归位

NoFences:免费开源的Windows桌面整理神器,让杂乱图标瞬间归位 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为Windows桌面上堆积如山的图标而烦…...

python旅游出行指南系统

目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能技术实现代码示例(路线规划)扩展方向适用场景源码获取详细视频演示 :同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货…...

python拼装模型商城销售管理系统

目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能技术栈特色亮点适用场景项目技术支持源码获取详细视频演示 :同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目概述 Python拼装模型商…...

兜兜转转又回到大浪浪的S05,遥看当年黑丝在,今朝尽染满头霜。

偶然翻看CSDN头像,恍然惊觉已是十五载光阴。2011年拍照于此设头像。初来S05,一路辗转S01,兜兜转转,历经浮沉,如今终究重回最初的S05。这十几年来,方寸代码天地,见证了我的所有成长与蜕变。一路行…...

如何在3分钟内免费解决Windows HEIC缩略图预览难题

如何在3分钟内免费解决Windows HEIC缩略图预览难题 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你是否经常遇到iPhone拍摄的照…...