Next.js集成Backblaze B2遇CORS错误,调用b2.authorize()时触发
解决Next.js集成Backblaze B2时的CORS错误
核心问题
你遇到的CORS错误根源是:b2.authorize()属于Backblaze的账户级API接口,该接口本身不支持浏览器端的跨域请求,你配置的存储桶CORS规则仅对b2_upload_file这类存储桶级操作生效,管不到账户认证类接口。
另外还有个严重安全问题:你把applicationKey和applicationKeyId放在NEXT_PUBLIC_前缀的环境变量里,这会直接将密钥暴露在前端代码中,任何人都能获取你的B2账户权限——哪怕是普通应用密钥,也绝对不能这么做。
解决方案:将B2操作移至后端(Next.js API路由)
正确的做法是把B2的认证、上传逻辑放在Next.js的后端API路由中,前端仅调用自己的API接口,既避开CORS问题,也能保护密钥不泄露。
1. 创建Next.js API路由
在pages/api/upload-to-b2.ts(App Router环境下为app/api/upload-to-b2/route.ts)编写后端逻辑:
import { B2 } from 'backblaze-b2'; import type { NextApiRequest, NextApiResponse } from 'next'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { if (req.method !== 'POST') { return res.status(405).json({ error: 'Method not allowed' }); } try { // 从非公开环境变量读取密钥(禁止使用NEXT_PUBLIC_前缀) const b2 = new B2({ applicationKeyId: process.env.B2_APPLICATION_KEY_ID as string, applicationKey: process.env.B2_APPLICATION_KEY as string, }); // 后端调用authorize无CORS限制 const authResponse = await b2.authorize(); // 可在此继续处理文件上传逻辑,例如获取上传URL、执行上传 // const uploadUrlRes = await b2.getUploadUrl({ bucketId: '你的存储桶ID' }); // const uploadRes = await b2.uploadFile({ // uploadUrl: uploadUrlRes.data.uploadUrl, // uploadAuthToken: uploadUrlRes.data.authorizationToken, // fileName: '自定义文件名', // data: req.body.file, // }); res.status(200).json({ auth: authResponse.data }); } catch (error) { console.error('B2操作失败:', error); res.status(500).json({ error: '上传失败' }); } }
2. 前端调用自定义API路由
修改前端代码,不再直接调用B2接口,转而调用自己的API:
async function uploadToB2(file: Blob) { try { const formData = new FormData(); formData.append('file', file); const response = await fetch('/api/upload-to-b2', { method: 'POST', body: formData, }); const data = await response.json(); console.log(data); } catch (error) { console.error('上传失败:', error); } }
关于master密钥的问题
不需要使用master密钥,你只需要创建一个限制了存储桶权限的应用密钥即可(比如仅允许b2_upload_file、b2_get_upload_url等必要操作),但该密钥必须放在后端环境变量中,绝对不能暴露给前端。
内容的提问来源于stack exchange,提问作者Sebastian Casal
相关产品推荐
相关产品推荐

