如何通过Discord OAUTH2结合Flask/discord.py实现后台面板角色权限管控
使用Flask结合Discord OAuth2实现管理员权限管控
核心思路
通过Discord OAuth2授权时获取用户的服务器角色信息,在访问后台面板前验证用户是否拥有指定的管理员角色,直接拒绝无权限用户的访问请求。
步骤与代码实现
- 安装依赖
pip install flask flask-dance-discord
- Flask应用配置与权限验证逻辑
from flask import Flask, redirect, url_for, abort from flask_dance.contrib.discord import make_discord_blueprint, discord import os app = Flask(__name__) app.secret_key = os.environ.get("FLASK_SECRET_KEY", "your-custom-secret-key") # 替换为你的Discord应用信息和服务器/角色ID DISCORD_CLIENT_ID = os.environ.get("DISCORD_CLIENT_ID") DISCORD_CLIENT_SECRET = os.environ.get("DISCORD_CLIENT_SECRET") TARGET_GUILD_ID = 123456789012345678 # 你的目标服务器ID ADMIN_ROLE_ID = 987654321098765432 # 管理员角色ID # 初始化Discord OAuth2蓝图,请求必要权限 discord_bp = make_discord_blueprint( client_id=DISCORD_CLIENT_ID, client_secret=DISCORD_CLIENT_SECRET, scope=["identify", "guilds"], # 必须包含guilds才能获取用户角色信息 redirect_to="index" ) app.register_blueprint(discord_bp, url_prefix="/login") def has_admin_permission(): if not discord.authorized: return False # 获取用户加入的服务器列表 guilds_resp = discord.get("/users/@me/guilds") if guilds_resp.status_code != 200: return False # 检查用户是否在目标服务器,并验证角色 for guild in guilds_resp.json(): if guild["id"] == str(TARGET_GUILD_ID): member_resp = discord.get(f"/guilds/{TARGET_GUILD_ID}/members/{discord.token['user_id']}") if member_resp.status_code == 200: member_data = member_resp.json() return str(ADMIN_ROLE_ID) in member_data["roles"] return False # 普通首页路由 @app.route("/") def index(): if not discord.authorized: return redirect(url_for("discord.login")) return "欢迎访问首页" # 后台面板路由,仅管理员可访问 @app.route("/admin") def admin_panel(): if not has_admin_permission(): abort(403) # 返回403禁止访问 return "管理员后台面板" if __name__ == "__main__": app.run(debug=True)
关键注意事项
- 权限配置:在Discord开发者门户的OAuth2设置中,需为应用添加
guilds.members.read权限,否则无法获取用户在服务器内的角色信息。 - 角色ID验证:优先使用角色ID而非名称进行验证,避免因角色名称修改导致权限判断失效。
- 自定义错误页:可替换
abort(403)为自定义页面跳转,提升无权限用户的体验。
内容的提问来源于stack exchange,提问作者Mikey K
相关产品推荐
相关产品推荐

