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

如何在Node.js后端服务器验证Telegram(tdweb)用户身份?

浏览器端tdweb登录Telegram后,Node.js后端的身份验证方案

核心逻辑

客户端通过tdweb完成Telegram登录后,将Telegram返回的用户唯一ID+访问哈希传给后端,后端调用Telegram官方接口验证凭证合法性,验证通过后生成自有会话令牌(如JWT),供后续API请求使用。


具体实现步骤

1. 客户端收集身份凭证

当tdweb的updateAuthorizationState回调返回authorizationStateReady状态时,调用getMe()获取用户核心信息:

  • id:Telegram用户唯一数字ID
  • access_hash:用户的访问哈希(验证身份的关键凭证)
  • 可选:username、phone_number(辅助校验)

将上述信息(至少id和access_hash)通过HTTPS请求传给后端的身份验证接口。

2. 后端验证凭证合法性(两种可选方案)

方案一:基于Telegram Bot API验证(推荐,轻量无TDLib依赖)

先通过@BotFather创建Bot并获取Bot Token,后端通过调用Bot API的getChat接口验证用户身份:

const axios = require('axios');

async function verifyTelegramUser(userId, botToken) {
  try {
    const res = await axios.get(`https://api.telegram.org/bot${botToken}/getChat`, {
      params: { chat_id: userId }
    });
    // 校验返回结果:必须是合法的私人聊天对象
    if (res.data.ok && res.data.result.type === 'private') {
      return { isValid: true, userInfo: res.data.result };
    }
    return { isValid: false };
  } catch (err) {
    // 若返回400错误(用户未与Bot交互/用户不存在),则验证失败
    return { isValid: false };
  }
}

注意:此方案要求用户已与你的Bot发起过对话,若需跳过该限制,可使用方案二。

方案二:基于TDLib后端直接验证(无需Bot交互,更灵活)

通过tdlib-node包在后端集成TDLib,需提前在my.telegram.org申请API ID和API Hash:

const { TDLib } = require('tdlib-node');

const tdlibClient = new TDLib({
  apiId: YOUR_TELEGRAM_API_ID,
  apiHash: YOUR_TELEGRAM_API_HASH,
  databaseDirectory: './tdlib-db',
  filesDirectory: './tdlib-files'
});

async function verifyTelegramUser(userId, accessHash) {
  try {
    const user = await tdlibClient.invoke({
      _: 'getUser',
      user_id: userId,
      access_hash: accessHash
    });
    // 成功获取用户对象则证明凭证合法
    return { isValid: true, userInfo: user };
  } catch (err) {
    return { isValid: false };
  }
}

3. 生成后端会话令牌

验证通过后,生成自有会话令牌(以JWT为例)返回给客户端,后续API请求只需校验JWT有效性:

const jwt = require('jsonwebtoken');
const JWT_SECRET = 'your-secure-secret-key';

// 生成JWT令牌
function generateSessionToken(userId) {
  return jwt.sign({ userId }, JWT_SECRET, { expiresIn: '7d' });
}

// 验证JWT的Express中间件
function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader?.split(' ')[1];
  
  if (!token) return res.sendStatus(401);
  
  jwt.verify(token, JWT_SECRET, (err, payload) => {
    if (err) return res.sendStatus(403);
    req.user = payload;
    next();
  });
}

4. 安全注意事项

  • 客户端传输凭证必须使用HTTPS,防止数据窃听
  • 客户端仅存储后端生成的JWT,不得明文存储access_hash
  • JWT密钥需妥善保管,避免泄露
  • 方案一中可在客户端登录后引导用户打开Bot链接,完成首次交互

内容的提问来源于stack exchange,提问作者Bad_m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:22:42