Flask项目实现Steam账号绑定已有用户的Steam ID获取方案咨询
Steam账号绑定功能实现方案
两种方案均可实现需求,可根据你的业务安全要求选择:
方案1:用户输入Steam用户名/个人资料链接获取ID
该方案实现成本最低,但仅能验证输入的Steam账号是否存在,无法证明当前操作的用户持有该账号,存在被恶意绑定他人账号的风险,适合对安全性要求极低的场景。
实现步骤:
- 提前申请Steam Web API密钥
- 前端提供输入框让用户提交Steam自定义用户名(个人资料URL
/id/后的后缀)或完整的个人资料链接 - 后端提取用户输入的自定义标识,调用
ISteamUser/ResolveVanityURL接口传入标识和API密钥,即可获取对应的64位Steam ID - 再调用
ISteamUser/GetPlayerSummaries接口拉取账号昵称、头像等公开信息,返回前端展示给用户确认 - 用户确认后,将Steam ID与当前登录的本站账号关联存入数据库即可
方案2:通过Steam OpenID流程校验账号权属(推荐)
该方案可以100%验证当前操作的用户是Steam账号的持有者,安全性更高,和Steam直接登录本站的逻辑差异仅为拿到Steam ID后无需创建本站登录态,仅做账号关联即可,支持绑定多个Steam账号。
实现流程
- 前端绑定页面放置「绑定Steam账号」按钮
- 用户点击按钮后跳转至Steam的OpenID登录页,回调地址指定为你站点的绑定回调路由
- 用户在Steam完成登录后会自动跳转回你的回调地址,回调请求会携带经过Steam验证的64位Steam ID
- 拉取账号信息展示给用户确认后,即可将Steam ID与当前登录的本站账号绑定
最简Flask实现示例
先安装所需依赖:pip install flask requests python-openid
核心代码参考:
from flask import Flask, redirect, request, session, render_template import requests import urllib.parse # 配置参数 STEAM_API_KEY = "你申请的Steam Web API密钥" STEAM_OPENID_ENDPOINT = "https://steamcommunity.com/openid/login" app = Flask(__name__) app.secret_key = "你的Flask会话加密密钥" # 绑定页面,需先校验用户已登录本站 @app.route("/bind-steam") def bind_page(): if not session.get("site_user_id"): return redirect("/your-site-login-page") return render_template("bind_steam.html") # 发起Steam绑定请求 @app.route("/steam/bind/start") def start_bind(): if not session.get("site_user_id"): return redirect("/your-site-login-page") # 构造OpenID请求参数 openid_params = { "openid.ns": "http://specs.openid.net/auth/2.0", "openid.mode": "checkid_setup", "openid.return_to": f"{request.host_url}steam/bind/callback", "openid.realm": request.host_url, "openid.identity": "http://specs.openid.net/auth/2.0/identifier_select", "openid.claimed_id": "http://specs.openid.net/auth/2.0/identifier_select" } return redirect(f"{STEAM_OPENID_ENDPOINT}?{urllib.parse.urlencode(openid_params)}") # Steam回调处理 @app.route("/steam/bind/callback") def bind_callback(): if not session.get("site_user_id"): return redirect("/your-site-login-page") # 提取Steam ID claimed_id = request.args.get("openid.claimed_id") if not claimed_id: return "绑定失败,请重试" steam_id = claimed_id.split("/")[-1] # 拉取账号信息用于展示确认 player_resp = requests.get( "https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v2/", params={"key": STEAM_API_KEY, "steamids": steam_id} ) player_info = player_resp.json()["response"]["players"][0] # 展示确认页面或直接执行绑定逻辑,数据库将site_user_id和steam_id做关联即可 # 如需支持多账号绑定,只需将用户和SteamID的关联关系设为一对多即可 return f"绑定成功,你绑定的Steam账号:{player_info['personaname']},SteamID:{steam_id}"
内容的提问来源于stack exchange,提问作者mattjarr
相关产品推荐
相关产品推荐

