当前位置: 首页 > 知识库问答 >
问题:

如何使用Cognito标识池连接到AWS AppSync并放大

锺高翰
2023-03-14

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

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

到目前为止,我能够对用户进行身份验证并获得JWT令牌(步骤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请求它们,但是,我看不到传递它们以放大API请求身份验证的方法(有关更多详细信息,请参阅我创建的本期)。

共有2个答案

岑熙云
2023-03-14

如果您的放大器配置具有AWS_IAM身份验证的AppSync API和认知用户池,放大器将使用id令牌自动获取AWS凭据。

要实际调用AppSync API,只需执行以下操作:

API.graphql({query})
孔瑾瑜
2023-03-14

我能够使用认知来验证我的客户端,然后将jwtToken传递给AWS-APPSYNC客户端,以便能够将APPSYNC与AMAZON_COGINITO_USER_POOLS一起使用。在代码中,您还将看到我使用API_KEY作为替代。我离开了API_KEY评论了。我分享这一点,作为那些也想尝试与阿波罗客户端和AWS-APPESNC访问的替代方案。

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;
 类似资料:
  • 我正在使用AWS Congito用户池进行帐户管理,其中Cognoto标识池将此用户池作为标识提供者。我用它来控制通过API网关对API的访问,API网关向Lambda发送请求。我的Lambda是使用Micronaut用Java8实现的。所有这些都很好。 在Lambda中,我从中的获得名称: 在Cognito标识符的字符串名称中返回的是什么。像这样的东西: us-east-1:xxxxe650-5

  • 应用程序是由angular开发的。 首先,用户应该使用Cognito登录。因此,在用户登录后,应用程序将获得CognitoUser数据,如其id令牌、访问密钥和会话令牌。 然后应用程序将开始连接到Iot Core,并尝试订阅或发布数据到我想要的主题。但我总是遇到Mqtt立即断开连接的情况。 以下是我的连接代码: 在运行代码之前,我还运行以下命令:

  • 当我使用带有固定连接提供者的TCP客户端时,我不能重用连接。 他们使连接超过maxConnection变量。 这是我写的。 即使我使用10个maxConnection,比如“ConnectionProvider”。固定(“测试”,10)”,有22个空闲连接。天啊 //NettyClient.java //NettyClientTest。Java语言 14:55:27.397[reactor-tcp

  • Tomcat在使用后不释放连接的原因可能是什么? 这是我的配置

  • 我使用的是spring-webflux-5.2.8。释放,此操作“正常”: 返回错误时,不会出现任何问题,因为连接已被破坏,并且不会放回连接池: 调试r.n.resources。PooledConnectionProvider-[id:0xa23f78ad,L:/127.0.0.1:7524!R:localhost/127.0.0.1:8443]通道已关闭,现在有0个活动连接和0个非活动连接 但当

  • 我有一个Lambda函数来处理由API网关触发的POST请求。后者设置为通过Cognito用户池授权器进行授权。授权有效-如果我传递了一个用户的ID令牌,请求就会被处理,如果我不传递,我就会得到一个401。 但是,我无法在Lambda函数中获取授权用户的身份。所有的文档都让我相信它应该在上下文中,但它不是。我也无法将它映射到上下文中。此外,似乎也没有一种方法可以查询给定ID令牌的用户的用户池。 我