如何保护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编码,都能通过浏览器开发者工具轻易获取。针对你的场景,可用的保护方式有两种:
通过后端代理转发请求
前端不再直接连接AppSync,而是请求自有后端服务。API Key仅存储在后端,由后端负责和AppSync建立WebSocket连接、处理订阅逻辑,再将实时数据推送给前端。这种方式彻底规避API Key暴露风险,还能在后端添加用户权限校验、数据过滤等额外业务逻辑。严格限制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

