如何限制可访问Azure OpenAI的域名?Next.js+Vercel场景实操
限制Azure OpenAI仅允许Vercel部署的Next.js域名访问的实现方法
一、Azure OpenAI服务端配置域名白名单
这是核心的访问限制手段,直接在Azure层面拦截非指定域名的请求:
- 登录Azure门户,找到你的OpenAI资源实例
- 进入「网络」选项卡,选择「允许从特定虚拟网络和IP地址访问」
- 切换到「防火墙」板块,点击「添加规则」,选择「添加FQDN(完全限定域名)」
- 输入你Vercel部署的域名(比如
your-app.vercel.app,如果绑定了自定义域名就填自定义域名),完成后保存规则 - 注意:Vercel的服务器IP是动态变化的,用FQDN白名单比IP白名单更可靠,无需频繁更新IP列表
二、Next.js端彻底避免前端暴露密钥
哪怕有Azure的域名限制,也绝对不要在前端代码里直接携带API密钥,通过Next.js的API路由做中间层转发:
配置Vercel环境变量
进入Vercel项目的「设置→环境变量」,添加以下变量:AZURE_OPENAI_API_KEY:你的Azure OpenAI密钥AZURE_OPENAI_ENDPOINT:你的Azure OpenAI服务端点(比如https://your-resource.openai.azure.com/)
创建API路由转发请求
- 如果你用App Router,在
app/api/openai/route.js创建文件;用Pages Router则在pages/api/openai.js创建 - 示例代码(App Router):
import { NextResponse } from 'next/server'; export async function POST(request) { const requestBody = await request.json(); try { // 替换成你的部署名称和API版本 const azureApiUrl = `${process.env.AZURE_OPENAI_ENDPOINT}/openai/deployments/gpt-35-turbo/chat/completions?api-version=2024-02-15-preview`; const response = await fetch(azureApiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'api-key': process.env.AZURE_OPENAI_API_KEY, }, body: JSON.stringify(requestBody), }); const data = await response.json(); return NextResponse.json(data); } catch (error) { return NextResponse.json({ error: error.message }, { status: 500 }); } } - 前端代码只需要调用这个API路由(比如
/api/openai),完全不需要接触Azure的密钥
- 如果你用App Router,在
可选:API路由额外校验
可以在API路由里添加请求来源校验,进一步加固:// 在POST方法开头添加 const origin = request.headers.get('origin'); const allowedOrigins = ['https://your-app.vercel.app', 'https://your-custom-domain.com']; if (!allowedOrigins.includes(origin)) { return NextResponse.json({ error: 'Not allowed' }, { status: 403 }); }
三、Vercel端辅助配置(可选)
- 如果使用自定义域名,确保在Vercel完成域名绑定并开启HTTPS
- 可在Vercel「设置→安全」中开启「IP访问控制」,限制仅指定IP能修改项目配置,防止环境变量泄露
内容的提问来源于stack exchange,提问作者CDN
相关产品推荐
相关产品推荐

