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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:17:22