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

如何保护AWS AppSync的API Key?寻求替代认证方案

问题

以下代码可成功订阅AWS AppSync GraphQL端点并获取实时数据:

const APPSYNC_HOST = "host.appsync-api.us-east-1.amazonaws.com";
const APPSYNC_REALTIME_HOST =
  "host.appsync-realtime-api.us-east-1.amazonaws.com";
const APPSYNC_API_KEY = "da2-key";

function encodeAppSyncCredentials() {
  const creds = {
    host: APPSYNC_HOST,
    "x-api-key": APPSYNC_API_KEY,
  };
  const b64Creds = window.btoa(JSON.stringify(creds));

  return b64Creds;
}

function getWebsocketUrl() {
  const header = encodeAppSyncCredentials(APPSYNC_HOST, APPSYNC_API_KEY);
  const payload = window.btoa(JSON.stringify({}));

  const url = `wss://${APPSYNC_REALTIME_HOST}/graphql?header=${header}&payload=${payload}`;

  return url;
}

function startSubscription(websocket) {
  const subscribeMessage = {
    id: window.crypto.randomUUID(),
    type: "start",
    payload: {
      data: JSON.stringify({
        query: `subscription NotificationSubscription {
                onCreateNotification {
                  content
                  id
                  time
                }
              }`,
      }),
      extensions: {
        authorization: {
          "x-api-key": APPSYNC_API_KEY,
          host: APPSYNC_HOST,
        },
      },
    },
  };
  websocket.send(JSON.stringify(subscribeMessage));
}

const url = getWebsocketUrl();

const websocket = new WebSocket(url, ["graphql-ws"]);

websocket.addEventListener("open", () => {
  websocket.send(
    JSON.stringify({
      type: "connection_init",
    })
  );
});

websocket.addEventListener("message", (event) => {
  message = JSON.parse(event.data);
  switch (message.type) {
    case "connection_ack":
      startSubscription(websocket);
      break;
    case "start_ack":
      console.log("start_ack");
      break;
    case "error":
      console.error(message);
      break;
    case "data":
      console.log( message.payload.data.onCreateNotification );
      break;
  }
});

我即将将其部署到生产环境,但发现代码中API Key存在暴露风险,且无API Key则认证无法通过。请问如何保护该API Key?有哪些可用的替代认证方案?


解答

如何保护API Key?

API Key本质是轻量认证方式,绝对不能在前端代码硬编码——不管是明文还是base64编码,都能通过浏览器开发者工具轻易获取。针对你的场景,可用的保护方式有两种:

  1. 通过后端代理转发请求
    前端不再直接连接AppSync,而是请求自有后端服务。API Key仅存储在后端,由后端负责和AppSync建立WebSocket连接、处理订阅逻辑,再将实时数据推送给前端。这种方式彻底规避API Key暴露风险,还能在后端添加用户权限校验、数据过滤等额外业务逻辑。

  2. 严格限制API Key的权限与范围
    如果必须让前端直连AppSync,一定要给API Key配置最小权限:

    • 仅授予订阅onCreateNotification的权限,禁止查询、修改等其他操作;
    • 设置API Key有效期,定期轮换;
    • 在AppSync中配置请求频率限制,防止滥用;
    • 限制允许访问的IP范围(若用户群体IP固定)。

可用的替代认证方案

API Key仅适合开发测试或公开只读场景,生产环境更推荐以下安全认证方式:

  • Amazon Cognito 用户池
    这是前端对接AppSync最常用的方案。用户通过Cognito完成登录后获取ID Token,前端用该Token进行AppSync的WebSocket连接与订阅。AppSync可配置Cognito用户池作为认证源,支持基于用户组或用户ID的细粒度权限控制,完全适配实时订阅场景。

  • IAM 认证
    通过AWS STS为前端生成临时IAM凭证(Access Key、Secret Key、Session Token),前端用这些凭证对AppSync请求签名。适合已基于AWS IAM构建权限体系的场景,比如通过Cognito身份池为未登录用户提供临时权限,或给EC2/EKS中的应用分配IAM角色。

  • OpenID Connect (OIDC)
    支持对接第三方OIDC提供商(如Auth0、Okta)。用户登录后获取OIDC Token,AppSync验证Token的有效性与合法性,进而允许用户访问指定资源。适合已有外部身份系统的企业场景。

  • Lambda 授权
    自定义认证逻辑:前端发送自定义认证Token,AppSync调用你编写的Lambda函数验证Token有效性。这种方案高度灵活,适合复杂的自定义认证需求(如企业内部SSO、自定义用户体系)。


内容的提问来源于stack exchange,提问作者Sajjad Hossain Sagor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:55:07