具有 Cognito 联合身份的 AWS AppSync IAM 授权

Posted

技术标签:

【中文标题】具有 Cognito 联合身份的 AWS AppSync IAM 授权【英文标题】:AWS AppSync IAM Authorization with Cognito Federated Identities 【发布时间】:2018-07-30 05:53:39 【问题描述】:

我正在使用 AWS AppSync,并使用 Cognito 联合身份登录用户。

我希望未经身份验证的用户可以访问某些端点,而经过身份验证的用户将可以访问其他端点。

我已经为上述每个配置了 IAM 角色,例如使用"Resource": [ "Region:Account:apis/AppSyncName/types/Mutation/fields/XXX”]

我的问题是 — 我如何使用 Cognito 联合身份获取凭据以通过 AppSync 客户端发送。

我的 AppSync 配置:

const client = new AWSAppSyncClient(
  url: config.AppSync.ENDPOINT,
  region: config.AppSync.REGION,
  auth: 
    type: AUTH_TYPE.AWS_IAM,
    credentials: () => ReturnCredentials()
  
);

我的登录功能

login(username, password) 
    const user = new CognitoUser( Username: username, Pool: userPool );
    const authenticationData =  Username: username, Password: password ;
    const authenticationDetails = new AuthenticationDetails(authenticationData);
    var responseFunctions = 
      onSuccess: result => 
      ,
      onFailure: err => 
        console.log(err);
      
    ;

    user.authenticateUser(authenticationDetails, responseFunctions);
  

我想我需要在登录后使用GetCredentialsForIdentity,但我不确定如何将这些传递到 AppSync 配置中。此外,如何获取未经身份验证的用户的凭据?

【问题讨论】:

这方面有进展吗? 【参考方案1】:

我建议在您的应用程序中使用 AWS Amplify:https://github.com/aws/aws-amplify

npm install aws-amplify --save

然后,您将能够在 AppSync 客户端构造函数中使用 Amplify 中的 Auth 模块,如下所示:

const client = new AWSAppSyncClient(
    url: AppSync.graphqlEndpoint,
    region: AppSync.region,
    auth: 
        credentials: () => Auth.currentCredentials(),
    ,
);

从那里您将 client 对象传递给 Apollo GraphQL Provider:

const WithProvider = () => (
    <ApolloProvider client=client>
        <Rehydrated>
            <App />
        </Rehydrated>
    </ApolloProvider>
);

现在您可以开始使用 Apollo 对 AWS AppSync 进行标准 GraphQL 调用。数据将自动离线保存,但如果您想进行离线突变,您需要配置 Optimistic UI。你可以在这里阅读所有这些:https://docs.aws.amazon.com/appsync/latest/devguide/building-a-client-app-react.html#import-the-appsync-sdk-into-your-app

【讨论】:

以上是关于具有 Cognito 联合身份的 AWS AppSync IAM 授权的主要内容,如果未能解决你的问题,请参考以下文章

AWS Amplify 与托管 Cognito UI 的联合 Okta 身份验证

如何在 Keycloak 中创建客户端以与 AWS Cognito 身份联合使用

AWS Cognito 角色:区分联合身份池角色和用户池组角色

使用带或不带 cognito 的 aws api 网关的联合身份的轻量级 rbac

如何从 AWS cognito 授权代码获取访问和刷新令牌

Cognito:联合身份 ID 和用户属性