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

如何通过Node.js生成Azure Blob Storage 1分钟过期SAS密钥并部署至App Service

通过Azure App Service生成短期Blob SAS密钥的实现方案

一、核心逻辑

前端直接使用SAS密钥访问Blob存储会导致密钥在网络请求中暴露,风险极高。解决方案是通过部署在Azure App Service的后端API生成仅1分钟有效期的SAS密钥,前端调用API获取后再访问Blob存储,从根源避免密钥泄露。

二、Node.js开发依赖的NPM包

使用微软官方维护的Azure Storage SDK:@azure/storage-blob,支持SAS密钥生成、Blob操作等全功能。
安装命令:

npm install @azure/storage-blob

如果用Azure AD托管身份鉴权,还需安装:

npm install @azure/identity

三、Node.js生成短期SAS密钥的代码实现

1. 鉴权方式选择

推荐用Azure AD托管身份(无需存储密钥,更安全),也可使用存储账户连接字符串(需避免硬编码)。

2. Blob级SAS生成示例(Express API)

const { BlobServiceClient, generateBlobSASQueryParameters, BlobSASPermissions } = require("@azure/storage-blob");
const { DefaultAzureCredential } = require("@azure/identity");
const express = require("express");
const app = express();

// 生成短期Blob SAS的核心函数
async function getShortLivedBlobSAS(containerName, blobName) {
  const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
  // 初始化Blob服务客户端(托管身份鉴权)
  const blobServiceClient = new BlobServiceClient(
    `https://${accountName}.blob.core.windows.net`,
    new DefaultAzureCredential()
  );

  const blobClient = blobServiceClient.getContainerClient(containerName).getBlobClient(blobName);
  
  // 配置SAS参数:仅读权限、1分钟有效期
  const sasConfig = {
    containerName,
    blobName,
    permissions: BlobSASPermissions.parse("r"),
    expiresOn: new Date(Date.now() + 60 * 1000)
  };

  // 生成SAS令牌
  const sasToken = generateBlobSASQueryParameters(
    sasConfig,
    await blobClient.getAccountInfo()
  ).toString();

  // 返回带SAS的完整Blob访问URL
  return `${blobClient.url}?${sasToken}`;
}

// API接口:接收容器名和Blob名,返回SAS URL
app.get("/api/blob-sas", async (req, res) => {
  const { container, blob } = req.query;
  if (!container || !blob) {
    return res.status(400).json({ error: "缺少container或blob参数" });
  }

  try {
    const sasUrl = await getShortLivedBlobSAS(container, blob);
    res.json({ sasUrl });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: "生成SAS失败" });
  }
});

const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`服务运行在端口${port}`));

3. 关键注意事项

  • 最小权限原则:仅授予r(读取)权限,避免过度授权。
  • 敏感信息不硬编码:存储账户名等配置通过Azure App Service的应用设置(Configuration > Application settings)注入,用process.env读取。
  • 有效期严格限制为1分钟,即使SAS泄露也无利用价值。

四、部署到Azure App Service的步骤

  1. 创建Node.js类型的App Service,选择合适的定价层(基础层即可)。
  2. 配置应用设置:
    • 添加AZURE_STORAGE_ACCOUNT_NAME:你的存储账户名称。
    • 启用托管身份:在App Service的身份设置中开启系统分配的托管身份,给该身份授予存储账户的Storage Blob Data Contributor权限(或更细粒度的权限)。
  3. 部署代码:通过GitHub Actions、Azure CLI或VS Code Azure插件将本地代码部署到App Service。
  4. 测试API:访问https://<你的App Service名称>.azurewebsites.net/api/blob-sas?container=你的容器名&blob=目标PDF文件名,验证返回的SAS URL可正常访问Blob。

五、轻量化替代方案:Azure Function

如果不需要完整Web应用,可使用Azure Function实现该API,代码逻辑一致,部署更简洁,按调用次数计费,成本更低。

内容的提问来源于stack exchange,提问作者kishore pantra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:15:39