我在GCP Cloud Run上有一系列微服务,每个微服务都托管一个联合的Apollo GraphQL服务。然后,我还有最后一个容器,它充当其余服务的联合GraphQL网关。
当容器上启用了公共访问时,这可以很好地工作,但是我不能让网关服务器对其他两个服务进行身份验证。
我已经尝试使用Apollo RemoteGraphQLDataSource并实现willSendRequest方法来设置必要的标头。
我还尝试将云运行调用者角色添加到网关作为的服务角色。
const servicex = new RemoteGraphQLDataSource({
url: serviceurl,
willSendRequest({ request, context }) {
request.http.headers.set(
"Authorization",
"Bearer ${TOKEN}"
);
}
});
const gateway = new ApolloGateway({
serviceList: [
servicex
]
});
const { schema, executor } = await gateway.load();
const server = new ApolloServer({ schema, executor })我希望网关服务器能够针对其他微服务进行身份验证。
发布于 2019-07-02 04:21:42
云运行授权需要在您的authorization: bearer TOKEN HTTP头中有一个HTTP2.0身份令牌。一个常见的错误是使用访问令牌。
除非您在部署命令中指定了新的服务帐户,否则Cloud Run将使用Compute Engine默认服务帐户作为其标识。这意味着您需要指定role/run.Invoker的服务帐户电子邮件地址。
使用OAuth对用户凭据进行授权时,您可以收到三个令牌:访问令牌、刷新令牌和身份令牌,具体取决于您在Scopes参数中指定的内容。身份令牌是您在HTTP Authorization标头中使用的令牌。
当您使用服务帐户身份对服务进行授权时,请调用Cloud Run元数据服务器为您创建令牌。此终结点将返回身份令牌。在HTTP Authorization标头中使用返回的令牌。
http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=<ususally-the-url-of-the-cloud-run-service-you-are-calling>返回的令牌是您可以解码的带签名的JWT。header.payload.signature的典型base64编码。有效负载包含服务帐户的电子邮件地址,此电子邮件地址是Cloud Run代理用于授权的地址。
https://stackoverflow.com/questions/56841825
复制相似问题