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

如何获取API服务的请求来源网站域名?Node.js+React开发场景

问题解决:Node.js后端获取请求来源域名并实现白名单鉴权

你当前的问题出在错误地传入了API自身的地址作为请求来源参数,导致解析出的是API部署域名而非前端请求的真实来源域名。要获取请求的真实来源,需要从Node.js请求对象的HTTP头中提取,而非传入错误的参数。

核心原理

浏览器在发送请求时,会自动携带以下两个HTTP头标识请求来源:

  • Origin:跨域请求(CORS)中必带,格式为https://your-frontend-domain.com
  • Referer:同域/跨域请求可能携带,格式为完整的请求来源URL(比如https://your-frontend-domain.com/page)

优先使用Origin,因为它更简洁且专门用于标识来源;Referer作为 fallback 方案。

修正后的实现代码

const { URL } = require('url'); // 推荐使用URL对象,替代已废弃的url.parse

// 允许的域名白名单,替换成你的自有域名和本地地址
const ALLOWED_DOMAINS = ['your-frontend-domain.com', 'localhost', '127.0.0.1'];

exports.checkDomain = (req, res, next) => {
  // 获取请求来源头
  const origin = req.headers.origin;
  const referer = req.headers.referer;
  
  let sourceUrl;
  if (origin) {
    sourceUrl = origin;
  } else if (referer) {
    // 从Referer中提取域名部分
    sourceUrl = new URL(referer).origin;
  } else {
    // 无来源头,直接拒绝请求
    return res.status(403).json({ error: '非法请求:无来源标识' });
  }

  try {
    const parsedUrl = new URL(sourceUrl);
    const sourceDomain = parsedUrl.hostname;

    // 校验域名是否在白名单内
    if (ALLOWED_DOMAINS.includes(sourceDomain)) {
      // 校验通过,继续处理请求
      next();
    } else {
      res.status(403).json({ error: '非法请求:来源域名未被允许' });
    }
  } catch (err) {
    // 解析URL失败,说明来源头格式异常
    res.status(403).json({ error: '非法请求:来源格式无效' });
  }
};

代码说明

  1. 白名单配置:ALLOWED_DOMAINS里放你允许的前端域名,比如生产环境的自有域名、本地开发的localhost/127.0.0.1
  2. 来源头获取逻辑:先取Origin,没有的话用Referer的origin部分
  3. 域名解析:用URL对象解析来源地址,提取hostname(即域名部分)
  4. 鉴权逻辑:判断域名是否在白名单,通过则调用next()继续处理请求,否则返回403禁止访问

你的原代码问题点

  • requestip参数传入的是API自身的路径/地址,而非请求来源,导致解析错误
  • return Apikeys.includes(domain)之后的dns.lookup代码永远不会执行(return会直接终止函数)
  • 没有正确使用Node.js的req对象获取请求头信息

使用方式

把这个中间件挂载到需要鉴权的API路由上,比如:

const express = require('express');
const app = express();
const { checkDomain } = require('./path/to/your/file');

// 对所有API路由应用鉴权
app.use('/api', checkDomain);

// 或者单独对某个路由应用
app.get('/api/data', checkDomain, (req, res) => {
  res.json({ data: '授权通过的返回内容' });
});

内容的提问来源于stack exchange,提问作者Dannana Sai Ajith Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:27:18