【问题标题】:Authenticate Apollo Client to AWS AppSync with Cognito User Pools使用 Cognito 用户池向 AWS AppSync 验证 Apollo 客户端
【发布时间】: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

这些都没有奏效。

【问题讨论】:

    标签: javascript amazon-web-services graphql apollo aws-appsync


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 2018-12-07
      • 2021-08-13
      • 2020-05-14
      • 2019-10-15
      • 2020-12-05
      • 2020-08-31
      • 2020-09-03
      相关资源
      最近更新 更多