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

React应用调用AWS Secrets Manager提示凭证缺失问题求助

解决React应用调用AWS Secrets Manager时的"Credential is missing"错误

错误原因

前端浏览器环境无法像后端(EC2、Lambda等)那样自动加载AWS凭证,AWS SDK没有默认的凭证获取路径,直接调用会导致凭证缺失。另外,绝对不要在前端代码中直接嵌入AWS凭证,这会导致凭证泄露,严重威胁账号安全。

推荐解决方案:后端代理请求

搭建后端服务作为中间层,由后端处理Secrets Manager的请求,前端调用后端接口获取私密信息,这是最安全的做法。

示例后端代码(Node.js + Express)

const express = require('express');
const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager");
const app = express();
const port = 3001;

// 后端自动加载AWS凭证(通过环境变量、IAM角色或本地配置文件)
const client = new SecretsManagerClient({ region: "us-west-2" });

app.get('/api/firebase-secret', async (req, res) => {
  try {
    const response = await client.send(
      new GetSecretValueCommand({
        SecretId: "deckstatistics/firebase",
        VersionStage: "AWSCURRENT",
      })
    );
    // 解析SecretString并返回给前端
    res.json(JSON.parse(response.SecretString));
  } catch (error) {
    console.error(error);
    res.status(500).send('获取私密信息失败');
  }
});

app.listen(port, () => {
  console.log(`代理服务运行在端口 ${port}`);
});

前端修改代码

import { getAuth } from "firebase/auth";
import { initializeApp } from "firebase/app";

const initializeFirebase = async () => {
  try {
    // 调用后端接口获取私密信息
    const response = await fetch('http://localhost:3001/api/firebase-secret');
    const secret = await response.json();
    
    console.log(secret);
    // 初始化Firebase
    initializeApp(secret);
  } catch (error) {
    console.error(error);
    throw error;
  }
};

临时测试方案(禁止生产环境使用)

如果只是本地开发测试,可以临时通过环境变量传入凭证,但生产环境绝对不能这么做:

  1. 在项目根目录创建.env文件:
REACT_APP_AWS_ACCESS_KEY=你的IAM用户AccessKeyId
REACT_APP_AWS_SECRET_KEY=你的IAM用户SecretAccessKey
  1. 修改前端代码中的SecretsManagerClient初始化:
const client = new SecretsManagerClient({
  region: "us-west-2",
  credentials: {
    accessKeyId: process.env.REACT_APP_AWS_ACCESS_KEY,
    secretAccessKey: process.env.REACT_APP_AWS_SECRET_KEY
  }
});

额外检查项

  • 确认IAM用户拥有secretsmanager:GetSecretValue权限,且资源指定了目标Secret的ARN(注意ARN末尾可能带有随机后缀):
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "arn:aws:secretsmanager:us-west-2:你的AWS账号ID:secret:deckstatistics/firebase-xxxx"
    }
  ]
}

内容的提问来源于stack exchange,提问作者Edmund Prescott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:40:24