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

Javascript 如何使用Cognito标识池连接到AWS AppSync并放大,javascript,amazon-web-services,authentication,aws-appsync,aws-amplify,Javascript,Amazon Web Services,Authentication,Aws Appsync,Aws Amplify,我有一个AWS AppSync API,它使用IAM角色进行身份验证。我正在使用Amplify GraphQL客户端连接到AppSync服务器。下图描述了获取IAM凭据所需的步骤,我假设Amplify能够执行这些步骤。但是,我找不到任何关于如何建立工作示例的文档 请注意,我直接使用Cognito用户池进行身份验证,而不是像Google或Facebook这样的外部提供商 到目前为止,我能够对用户进行身份验证并获得JWT令牌(步骤1): 如何从标识池请求IAM凭据(步骤2),并使用Amplify使

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

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

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

如何从标识池请求IAM凭据(步骤2),并使用Amplify使用这些凭据访问AppSync API(步骤3)


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

如果您的amplify配置具有带有AWS_IAM身份验证的AppSync API和cognito用户池,amplify将使用id令牌自动获取AWS凭据

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

API.graphql({query})

我能够使用cognito对我的客户端进行身份验证,然后将jwtToken传递给aws appsync客户端,以便能够使用appsync与AMAZON\u COGINITO\u USER\u池。在代码中,您还将看到我在何处使用API_键作为替代。我把API_键注释掉了。对于那些也希望尝试使用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;
if(!process.browser){
global.fetch=require('node-fetch')
}
常量appSyncClientOptions={
url:awsConfig.aws_appsync_graphqlenpoint,
地区:awsConfig.aws_appsync_地区,
认证:{
//键入:“API_密钥”,
//apiKey:awsConfig.aws\u appsync\u apiKey,
类型:awsConfig.aws\u appsync\u authenticationType,//“AMAZON\u COGNITO\u用户\u池”
jwtToken:async()=>(等待Auth.currentSession()).getAccessToken().getJwtToken()
},
disableOffline:对,
};
常量客户端选项={
链接:createAppSyncLink({
…appSyncClientOptions,
resultsFetcherLink:createHttpLink({uri:appSyncClientOptions.url,fetch})
})  
};
const client=新客户端(appSyncClientOptions、apolloClientOptions);
const with provider=()=>(
)
使用提供者导出默认值;

这是正确的,它确实可以自动工作。但是,我的Amplify config对象中缺少了
Auth.identityPoolId
属性。除了我的问题中显示的
区域
用户池ID
用户池WebClientID
属性外,还需要此属性。您如何知道Amplify.configure接受哪些对象(以及什么结构)?请注意,此答案是使用aws appsync的
AMAZON_COGNITO_用户池
,正如我在问题中明确提到的,不带Amplify的AWS_IAM。这可能会让寻找答案的人感到困惑。我认为最初的问题有点不清楚。作者声明“注意,我直接使用Cognito用户池进行身份验证…”但您的观点很好地理解了AWS_IAM和AMAZON_Cognito_用户池之间的区别
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;