使用 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
具有 Cognito 用户池授权方的 AWS SAM API