使用 Cognito 用户池向 AWS AppSync 验证 Apollo 客户端

Posted

技术标签:

【中文标题】使用 Cognito 用户池向 AWS AppSync 验证 Apollo 客户端【英文标题】:Authenticate Apollo Client to AWS AppSync with Cognito User Pools 【发布时间】:2019-02-13 01:26:25 【问题描述】:

我正在尝试使用普通 Apollo 客户端连接到我的 AWS AppSync API,但我不确定如何正确构建身份验证标头。

到目前为止,我一直遵循这里的标头身份验证文档:https://www.apollographql.com/docs/react/recipes/authentication.html

并且有这个代码,我调整它以包含对 Amplify 身份验证服务的令牌调用,但它返回 401 错误:

const httpLink = createHttpLink(
  uri: '[API end point address]/graphql'
);

const authLink = setContext((_,  headers ) => 
  const token = async () => (await Auth.currentSession()).getAccessToken().getJwtToken();
  return 
    headers: 
      ...headers,
      authorization: token ? `Bearer $token` : ""
    
  
)

const client = new ApolloClient(
  link: authLink.concat(httpLink),
  cache: new InMemoryCache()
)

我能找到的唯一相关文档没有提供任何技术说明:

使用 Amazon Cognito 用户池时,您可以创建用户组 属于。此信息编码在您的 JWT 令牌中 应用程序在授权标头中发送到 AWS AppSync 时 发送 GraphQL 操作。

从这里:https://docs.aws.amazon.com/appsync/latest/devguide/security.html

我知道令牌很好,因为如果我使用 AppSync javascript API,它就可以工作。有什么地方我可以去了解如何实现这一目标,或者有人知道如何实现吗?

编辑:

到目前为止,我已尝试更改此行:

  authorization: token ? `Bearer $token` : ""

以下尝试:

token

jwtToken: token

authorization: token

Authorization: token

这些都没有奏效。

【问题讨论】:

【参考方案1】:

免责声明:从未尝试过,但我会这样做:

查看 AppSync 客户端代码 here 作为为 Apollo 客户端和 AppSync 服务器创建身份验证链接的基础。看起来该代码为每种可用的身份验证方法提供了脚手架。

具体来说,如果您尝试使用 OPENID_CONNECT 身份验证方法,则 JWT 令牌似乎不需要在前面加上 Bearer(第 156 行)。

【讨论】:

这是有道理的,但令人讨厌的是 Cognito 用户池的情况是空白的。编辑问题以显示迄今为止尝试过的事情。 根据我从 AppSync 开发人员指南中读到的内容,Cognito 用户池身份验证应该使用 OPENID_CONNECT 方法,使用 Cognito 用户池服务提供的 JWT 令牌。 另外,这是在我发布的链接的第 144 行指定的。 Authorization: token 格式应该是让它工作的关键,所以我认为问题可能出在您的 Cognito 用户池配置或令牌本身,而不是 Apollo 设置。 对不起,你是对的,我看到了那行,但没有意识到你在这个案例中什么都没有意味着它做了下面的案例。【参考方案2】:

您可以在 Github 上从 AWS 示例中查看它的示例。 适用于 AppSync,但非常相似。

// AppSync client instantiation
const client = new AWSAppSyncClient(
  url: GRAPHQL_API_ENDPOINT_URL,
  region: GRAPHQL_API_REGION,
  auth: 
    type: AUTH_TYPE,
    // Get the currently logged in users credential.
    jwtToken: async () => (await Auth.currentSession()).getAccessToken().getJwtToken(),
  ,
  // Amplify uses Amazon IAM to authorize calls to Amazon S3. This provides the relevant IAM credentials.
  complexObjectsCredentials: () => Auth.currentCredentials()
);

链接到 AWS repo

【讨论】:

以上是关于使用 Cognito 用户池向 AWS AppSync 验证 Apollo 客户端的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cognito 用户池调用 AWS APIGateway

在 AWS Cognito 中管理用户

具有 Cognito 用户池授权方的 AWS SAM API

AWS Cognito:Cognito 用户池的元数据 URL 在哪里?

AWS Cognito 用户身份验证

使用 AWS Cognito 和 Django 创建用户