如何通过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
相关产品推荐
相关产品推荐

