我试图使用普通的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
这些都不起作用。
答案 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