javascript - 如何使用 Cognito 身份池和 Amplify 连接到 AWS AppSync

标签 javascript amazon-web-services authentication aws-appsync aws-amplify

我有一个使用 IAM Angular 色进行身份验证的 AWS AppSync API。我正在使用 Amplify GraphQL 客户端连接到 AppSync 服务器。下图描述了获取 IAM 凭证所需执行的步骤,我假设 Amplify 能够执行这些步骤。但是,我找不到任何关于如何设置工作示例的文档。

请注意,我直接使用 Cognito 用户池进行身份验证,而不是 Google 或 Facebook 等外部提供商。

Access AWS Services with a User Pool and an Identity Pool

到目前为止,我能够对用户进行身份验证并获得 JWT token (第 1 步):

const Amplify = require('aws-amplify').default
const { Auth } = require('aws-amplify')


Amplify.configure({
  Auth: {
    region: process.env.AWS_REGION,
    userPoolId: process.env.COGNITO_USERPOOL_ID,
    userPoolWebClientId: process.env.COGNITO_WEBCLIENT_ID,
  },
})

Auth.signin(username, password)
  .then((user) => {
    const token = user.idToken.jwtToken
    // I've got the token - what next?
  })

我如何从身份池请求 IAM 凭据(第 2 步),并使用它们通过 Amplify 访问 AppSync API(第 3 步)?

如果 Amplify 本身无法获取凭据,我可以使用 AWS.CognitoIdentityCredentials 使用 AWS SDK 请求它们,但是,我看不到将它们传递给 Amplify 的方法对 API 请求进行身份验证(有关详细信息,请参阅 this issue I created)。

最佳答案

我能够使用 cognito 对我的客户端进行身份验证,然后将 jwtToken 传递给 aws-appsync 客户端,以便能够将 APPSYNC 与 AMAZON_COGINITO_USER_POOLS 结合使用。同样在代码中,您将看到我在哪里使用 API_KEY 作为替代。我将 API_KEY 注释掉了。我将此作为替代方案分享给那些也想尝试使用 Apollo 客户端和 aws-appsync 进行访问的人。

if (!process.browser) {
  global.fetch = require('node-fetch')
}

const appSyncClientOptions = {
  url: awsConfig.aws_appsync_graphqlEndpoint, 
  region: awsConfig.aws_appsync_region,
  auth: {
    // type: 'API_KEY',
    // apiKey: awsConfig.aws_appsync_apiKey,
    type: awsConfig.aws_appsync_authenticationType,   // 'AMAZON_COGNITO_USER_POOLS'
    jwtToken: async () => (await Auth.currentSession()).getAccessToken().getJwtToken()
  },
  disableOffline: true,
};

const apolloClientOptions = {
  link: createAppSyncLink({
    ...appSyncClientOptions,
    resultsFetcherLink: createHttpLink({ uri: appSyncClientOptions.url, fetch })
  })  
};

const client = new Client(appSyncClientOptions, apolloClientOptions);

const WithProvider = () => (
  <ApolloProvider client={client}>
    <Rehydrated>
      <GqlList />
    </Rehydrated>
  </ApolloProvider>
)

export default WithProvider;

关于javascript - 如何使用 Cognito 身份池和 Amplify 连接到 AWS AppSync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55722489/

相关文章:

javascript - HTML - 根据标题展开/折叠? "document map"

java - 有什么方法可以排除 pom.xml 中额外的 AWS Maven 依赖项吗?

php - Codeigniter 创建 session 和重定向在 IE 中不起作用

javascript - 将文件上传到 Amazon s3 - 客户端 javascript

amazon-web-services - 具有资源属性 CloudFormation 的 UserData 脚本

javascript - Web 身份验证 - 如何安全地将用户名/密码从客户端传输到服务器

react-native - 使用 Spotify 登录后无法返回我的应用程序

javascript - 准备要传递到 API 查询的字符串(转义特殊字符)

javascript - 如何将页眉扩展到整个页面宽度?

javascript - [Vue 警告] : Property or method "games" is not defined on the instance but referenced during render