如何通过OAuth2检查Discord账号是否已验证邮箱或手机号?
使用discord.js v14 + Node.js实现Discord账号验证状态检查(OAuth2方式)
核心思路
通过Discord OAuth2授权流程获取用户身份信息,从返回的用户对象中提取邮箱验证状态和手机号绑定验证状态,以此作为工单创建的准入条件。
步骤实现
1. 配置Discord OAuth2应用
- 登录Discord开发者平台,选择你的机器人应用,进入「OAuth2」→「URL Generator」页面。
- 勾选权限:
identify(获取用户基本信息,包含手机号状态)、email(获取邮箱及验证状态)。 - 设置重定向URL(例如
http://localhost:3000/callback),并在「OAuth2」→「General」页面将该URL添加到重定向列表。
2. 安装依赖
执行命令安装所需包:
npm install discord.js express node-fetch
若你的Node.js版本≥18.0.0,可直接使用内置的
fetch,无需安装node-fetch。
3. 核心代码实现
const express = require('express'); const fetch = require('node-fetch'); // Node.js<18时使用,否则替换为内置fetch const app = express(); // 替换为你的应用信息 const CLIENT_ID = '你的Discord客户端ID'; const CLIENT_SECRET = '你的Discord客户端密钥'; const REDIRECT_URI = 'http://localhost:3000/callback'; // 与开发者平台设置一致 // 引导用户授权的路由 app.get('/auth', (req, res) => { const authUrl = `https://discord.com/oauth2/authorize?client_id=${CLIENT_ID}&redirect_uri=${encodeURIComponent(REDIRECT_URI)}&response_type=code&scope=identify%20email`; res.redirect(authUrl); }); // 授权回调路由,处理验证逻辑 app.get('/callback', async (req, res) => { const { code } = req.query; if (!code) return res.send('授权失败:未获取到授权码'); // 用授权码交换访问令牌 const tokenRes = await fetch('https://discord.com/api/oauth2/token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ client_id: CLIENT_ID, client_secret: CLIENT_SECRET, code, grant_type: 'authorization_code', redirect_uri: REDIRECT_URI, scope: 'identify email' }) }); const tokenData = await tokenRes.json(); if (!tokenData.access_token) return res.send('令牌交换失败'); // 获取用户信息 const userRes = await fetch('https://discord.com/api/users/@me', { headers: { Authorization: `Bearer ${tokenData.access_token}` } }); const user = await userRes.json(); // 提取验证状态 const isEmailVerified = user.verified; // 布尔值:true=邮箱已验证 const isPhoneVerified = !!user.phone; // 存在phone字段则表示手机号已绑定验证 // 此处接入你的工单逻辑:比如根据验证状态允许/拒绝创建工单 res.send(` 账号验证结果:<br> 邮箱已验证:${isEmailVerified ? '是' : '否'}<br> 手机号已验证:${isPhoneVerified ? '是' : '否'} `); }); // 启动服务器 app.listen(3000, () => { console.log('验证服务已启动,请访问 http://localhost:3000/auth 进行授权'); });
关键字段说明
user.verified:Discord返回的布尔值,直接标识用户的邮箱是否完成验证。user.phone:仅当用户绑定并验证手机号后,该字段才会返回手机号字符串;未绑定/未验证则不存在,因此用!!user.phone判断手机号验证状态。
注意事项
- 重定向URL必须与Discord开发者平台中配置的完全一致,包括协议(http/https)和端口。
CLIENT_SECRET是敏感信息,切勿提交到代码仓库或暴露在前端代码中,建议使用环境变量管理(如process.env.CLIENT_SECRET)。
内容的提问来源于stack exchange,提问作者Smkv 2022
相关产品推荐
相关产品推荐

