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

Flask》》 Flask-OpenID 认证、 OpenID Connect (OIDC)

OpenID 停用了

Flask-OpenID 是一个用于集成OpenID 2.0 认证协议的 Flask 扩展。不过,要注意,这个协议和对应的扩展库已经过时了,现代的应用都转向了基于 OAuth 2.0 的 OpenID Connect (OIDC)

# 安装pip install Flask-OpenID## app.pyimport osfromflaskimportFlask,render_template,request,redirect,url_for,session,flashfromflask_openid import OpenID# --- 1. 应用配置和初始化 ---app=Flask(__name__)app.secret_key='your-secret-key-here' # 请务必修改为一个强随机字符串# 设置临时文件存储路径的根目录# BASE_DIR = os.path.abspath(os.path.dirname(__file__))# oid = OpenID(app, os.path.join(BASE_DIR, 'tmp'))oid=OpenID(app,'./tmp',safe_roots=[])# 简化路径写法,safe_roots用于安全验证# --- 2. 辅助函数:在请求前加载用户 ---@app.before_requestdeflookup_current_user():"""在每个请求前,根据 session 中的 openid 加载当前用户信息""" session.permanent=True# 假设我们用 g 对象来存储当前用户fromflask import g g.user=Noneif'openid'insession:# 这里简化处理,实际应从数据库查询# g.user = User.query.filter_by(openid=session['openid']).first()g.user=session['openid']# 演示用,直接将openid作为用户标识# --- 3. 登录视图 (核心逻辑) ---@app.route('/login',methods=['GET','POST'])@oid.loginhandler # 装饰器标记为登录处理器deflogin():"""处理用户的登录请求和OpenID回调"""# 如果用户已登录,直接重定向到下一页或主页ifg.userisnotNone:returnredirect(oid.get_next_url())ifrequest.method=='POST':# 获取用户在表单中输入的 OpenID 标识 URLopenid_url=request.form.get('openid')ifopenid_url:# 尝试登录,并请求获取用户的邮箱和昵称returnoid.try_login(openid_url,ask_for=['email','nickname'])# GET 请求或未提供 OpenID URL 时,显示登录表单returnrender_template('login.html',next=oid.get_next_url(),error=oid.fetch_error())@oid.after_logindefcreate_or_login(resp):"""OpenID 认证成功后,会回调此函数。resp 包含从 OpenID 提供者返回的用户信息""" session['openid']=resp.identity_url# 从响应中提取用户信息 (如果提供并且用户授权了)user_email=resp.emailifhasattr(resp,'email')else'' user_nickname=resp.nicknameifhasattr(resp,'nickname')else''# 这里应该进行数据库操作:根据 identity_url 查找或创建用户# 例如:# user = User.query.filter_by(openid=resp.identity_url).first()# if user is None:# user = User(openid=resp.identity_url, email=user_email, nickname=user_nickname)# db.session.add(user)# db.session.commit()flash('登录成功!')# 登录成功后,跳转到登录前想访问的页面returnredirect(oid.get_next_url())# --- 4. 登出视图 ---@app.route('/logout')deflogout():"""清除 session 中的用户标识,退出登录""" session.pop('openid',None)flash('您已成功登出。')returnredirect(url_for('login'))# --- 5. 受保护的页面示例 ---# 实际使用中,可以配合 Flask-Login 的 @login_required 装饰器来保护页面@app.route('/')defindex():ifg.userisNone:returnredirect(url_for('login'))returnf'Hello,{g.user}!<br><ahref="/logout">登出</a>'# templates/login.html<!DOCTYPE html><html><head><title>OpenID 登录示例</title></head><body><h1>OpenID 登录</h1><formaction=""method="post"><inputtype="text"name="openid"value="https://your-openid-provider.com"/><inputtype="hidden"name="next"value="{{ next }}"/><inputtype="submit"value="登录"/></form>{%iferror%}<h4>错误信息:{{error}}</h4>{%endif%}</body></html>


浏览器(User)你的网站(mysite.com)OpenID 提供者(openid.com)||||GET/|||--------------------------->|||302to/login|||<---------------------------|||GET/login|||--------------------------->|||200(loginform)|||<---------------------------|||POST/login(openid=url)|||--------------------------->||||oid.try_login()发现提供者地址||302to openid.com/login|||<---------------------------|||GET/login(at openid.com)|||------------------------------------------------------------->|||(用户输入密码确认)||<-------------------------------------------------------------|302to mysite.com/login?openid_complete=...|GET/login?openid_complete=...|||--------------------------->||||@oid.loginhandler 检测回调|||验证签名->调用 @oid.after_login|||设置 session['openid']||302to/(next)|||<---------------------------|||GET/|||--------------------------->|||200(Hello,user)|||<---------------------------||

http://www.jsqmd.com/news/694532/

相关文章:

  • 告别OpenHardwareMonitor:用C#的WMI手撸一个轻量级硬件监控工具(附完整源码)
  • Midscene.js完整教程:让AI成为你的浏览器操作员
  • 告别手动拖拽!用Qt的QHBoxLayout轻松搞定复杂工具栏布局(附完整代码)
  • 告别‘打包即膨胀’:用Python虚拟环境为你的Tkinter程序‘瘦身’,exe文件从95MB瘦到16MB
  • 国内2026 广东最新奶茶供应链推荐!广州优质公司榜单发布,靠谱 - 十大品牌榜
  • 2026年论文降AI后AI率又反弹?3款降AI工具的这个细节很多人忽视
  • 2026最新翡翠手镯定制批发/工厂推荐!广东优质权威榜单发布,实力靠谱佛山等地工厂精选 - 十大品牌榜
  • 【Eclipse】中文语言包离线安装
  • 超越ResNet:为什么HRNet的多分辨率并行结构在姿态估计和分割任务上更胜一筹?
  • Dynamic 3D Gaussians:革命性动态3D场景建模与跟踪技术详解
  • Genetic Drawing实战案例:从零开始制作个人专属艺术画作
  • 2026 广东珠三角最新燕窝推荐!广州优质厂家榜单发布,靠谱 - 十大品牌榜
  • 别再只盯着Linux了!从零到一,聊聊一个普通运维工程师的日常工具箱(含具体工具清单)
  • HackGen字体构建揭秘:从源代码到TTF的完整流程
  • ADSP21489的SPORT接口实战:手把手教你用CCES配置I2S音频传输(附SRU路由避坑点)
  • 如何快速激活Windows和Office?KMS_VL_ALL_AIO智能激活脚本完整指南
  • Linux 的 sleep 命令
  • 量子纠错码与Steane编码原理及实践
  • ConfettiSwiftUI源码解析:揭秘纯SwiftUI实现的动画引擎原理
  • Linux运维天花板!RHCA到底有多难?考下来直接封神
  • 实战对比:用Mellanox网卡和InfiniBand给Redis加速,UC、RC模式到底怎么选?
  • 别再乱用@RequestParam和@RequestBody了!Spring Boot接口传参保姆级避坑指南
  • Wrong Collections
  • 05华夏之光永存:电磁弹射+一次性火箭航天入轨方案【第五篇:发射场电力、测控、安防全套配套方案】
  • STM32CubeMX HAL库实战:手把手教你解析ATGM336H GPS/北斗模块的NMEA数据
  • CLImageEditor实战案例:构建Instagram风格的照片编辑器
  • 从文丘里管到皮托管:手把手教你用伯努利方程搞定流体测量(附Python计算脚本)
  • Simd高性能图像处理库:初学者完整入门指南
  • 3个步骤彻底清理Mac残留文件:Pearcleaner如何让你的Mac重获新生?
  • 别再为el-table打印不全发愁了!手把手教你用PrintJS搞定Vue项目里的复杂表格打印