使用Cognito用户池将Apollo客户端身份验证到AWS AppSync

时间:2018-09-07 17:00:25

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

我试图使用普通的Apollo Client连接到我的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

这些都不起作用。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您可以在AWS示例的Github上查看其示例。 可与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