news 2026/4/24 21:23:29

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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)|||<---------------------------||

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 21:06:57

c++模板初识

目录 一、 泛型编程 二、 函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 4.函数模板的实例化 1. 隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 2.显式实例化&#xff1a;在函数名后的<>中指定模板参数的实际类型 5.模板参数的…

作者头像 李华