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

如何通过Cognito联合身份获取凭证用于AWS AppSync客户端

使用Cognito联合身份向AWS AppSync客户端提供凭证的步骤

嘿,我来帮你梳理下怎么用Cognito联合身份给AWS AppSync客户端传递凭证——结合你已经配置好的IAM角色(针对未认证/认证用户的资源权限),一步步来:

1. 初始化Cognito身份池客户端

首先,你需要用AWS SDK创建Cognito身份服务的客户端实例,传入你的身份池ID和AWS区域:

import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity";
import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity";

// 替换成你的实际配置
const region = "us-east-1"; // 你的AWS区域
const identityPoolId = "us-east-1:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; // 你的Cognito身份池ID

// 创建Cognito身份客户端
const cognitoIdentityClient = new CognitoIdentityClient({ region });

2. 获取身份凭证(区分认证/未认证用户)

根据用户是否已通过联合身份提供商登录,我们需要两种不同的凭证获取方式:

未认证用户场景

对于未登录的匿名用户,直接通过身份池获取匿名凭证即可,不需要额外的登录令牌:

// 未认证用户的凭证提供者
const unauthCredentials = fromCognitoIdentityPool({
  client: cognitoIdentityClient,
  identityPoolId,
  logins: {}, // 未认证用户留空
});

认证用户场景(联合身份)

如果用户已经通过第三方身份提供商(比如Google、Facebook、Amazon等)登录,你需要先获取到该提供商的ID Token,然后将其传入Cognito的logins参数中。举个Google登录的例子:

// 假设你已经从Google登录流程中拿到了用户的ID Token
const googleIdToken = "用户登录后获取的Google ID Token";

// 认证用户的凭证提供者
const authCredentials = fromCognitoIdentityPool({
  client: cognitoIdentityClient,
  identityPoolId,
  logins: {
    "accounts.google.com": googleIdToken, // 对应你配置的联合身份提供商,不同提供商key不同
  },
});

提示:不同提供商的logins键对应值不同,比如Facebook是graph.facebook.com,Amazon是www.amazon.com,要和你在Cognito身份池里配置的一致。

3. 配置AWS AppSync客户端

接下来把凭证提供者集成到AppSync客户端中,这里以常用的aws-appsync和Apollo链接为例:

import { AppSyncClient } from "aws-appsync";
import { createAuthLink } from "aws-appsync-auth-link";
import { createHttpLink } from "apollo-link-http";
import { ApolloLink } from "apollo-link";
import { InMemoryCache } from "apollo-cache-inmemory";

// 根据用户登录状态选择对应的凭证提供者
const isUserAuthenticated = true; // 替换成你的实际登录状态判断逻辑
const credentialsProvider = isUserAuthenticated ? authCredentials : unauthCredentials;

// 创建AppSync认证链接(使用IAM认证方式)
const authLink = createAuthLink({
  url: "https://xxxxxx.appsync-api.us-east-1.amazonaws.com/graphql", // 你的AppSync端点URL
  region,
  credentials: credentialsProvider,
});

const httpLink = createHttpLink({ uri: "https://xxxxxx.appsync-api.us-east-1.amazonaws.com/graphql" });

// 组合链接
const link = ApolloLink.from([authLink, httpLink]);

// 初始化AppSync客户端
const appSyncClient = new AppSyncClient({
  link,
  cache: new InMemoryCache(),
});

4. 验证权限配置

你已经配置了IAM角色的资源路径(比如"Resource": [ "Region:Account:apis/AppSyncName/types/Mutation/fields/XXX" ]),需要确保:

  • 未认证用户的IAM角色有对应允许访问的资源权限(比如某些Query字段)
  • 认证用户的IAM角色有对应允许访问的资源权限(比如Mutation的XXX字段)

可以通过AppSync控制台的查询编辑器测试不同身份的访问权限,或者在客户端发送请求时观察是否有Unauthorized错误,以此验证权限是否生效。

关键注意点

  • 确保Cognito身份池已经正确关联了未认证和认证的IAM角色,并且角色的信任策略允许Cognito身份池扮演该角色(信任策略里包含cognito-identity.amazonaws.com)
  • AWS SDK会自动管理凭证的刷新,不需要手动处理过期问题
  • 如果使用Cognito用户池作为身份提供商,logins的键格式是cognito-idp.<区域>.amazonaws.com/<用户池ID>,值是用户池的ID Token

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:16:50