You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:35:27