如何实现API仅支持服务端调用、禁止客户端访问?附Google RSS跨域案例
核心实现方案
以下是几种常用的限制手段,结合你提到的Google RSS场景逐一说明:
通过CORS策略拦截前端请求
这就是Google RSS采用的方式:API服务器配置严格的CORS规则,仅允许特定服务端域名发起跨域请求,直接拒绝浏览器带前端Origin头的请求。
比如在Node.js Express中用cors中间件配置:const cors = require('cors'); app.use(cors({ origin: 'https://your-server-domain.com' // 仅放行自家服务端域名 }));更极端的可以直接禁用OPTIONS预检请求,前端发起跨域请求时,浏览器会先发送OPTIONS请求做预检,服务器直接返回403,前端就会触发CORS错误。
用API密钥限制,仅在服务端存储密钥
给API设置专属密钥,只把密钥放在服务端环境变量里,绝不暴露给前端。API服务器验证请求头中的密钥,无效或缺失则返回401/403。
服务端请求示例:const axios = require('axios'); async function fetchData() { const res = await axios.get('https://your-api-url.com', { headers: { 'X-API-Key': process.env.API_SECRET } // 密钥从环境变量读取,前端无法获取 }); return res.data; }IP白名单限制访问来源
将API服务器的访问权限限定在服务端的固定IP范围内,只有服务端IP能发起请求,客户端公网IP直接被拦截。
比如Nginx配置IP白名单:location /api { allow 192.168.1.100; # 你的服务端IP deny all; proxy_pass http://your-api-backend; }云服务器环境也可以通过安全组配置IP白名单,更便捷。
后端代理中转请求
就像你用Node.js访问Google RSS的方式:前端不直接调用目标API,而是请求自家服务端,由服务端作为代理去调用目标API,再把结果返回给前端。
Express代理示例:const { createProxyMiddleware } = require('http-proxy-middleware'); app.use('/rss-proxy', createProxyMiddleware({ target: 'https://news.google.com/rss', changeOrigin: true, pathRewrite: { '^/rss-proxy': '' } }));前端只需请求
/rss-proxy,全程接触不到目标API的地址和权限信息,自然避开了CORS限制。
关于Google RSS的场景说明
Google RSS的API服务器配置了严格的CORS规则,浏览器发起跨域请求时会自动携带Origin头,服务器检测到是前端域名后直接拒绝;而服务端请求不受浏览器同源策略限制,也不会触发CORS预检流程,因此能正常访问。
内容的提问来源于stack exchange,提问作者rionalab

