我在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 })
我希望网关服务器能够针对其他微服务进行身份验证。
答案 0 :(得分:1)
Cloud Run授权要求您的authorization: bearer TOKEN
HTTP标头中包含OAuth 2.0身份令牌。一个常见的错误是使用访问令牌。
除非您在deploy命令中指定了新的服务帐户,否则Cloud Run将使用Compute Engine默认服务帐户作为其标识。这意味着您需要为role/run.Invoker
指定服务帐户的电子邮件地址。
使用OAuth授权用户凭据时,您可以接收三个令牌:访问令牌,刷新令牌和身份令牌,具体取决于您在Scopes参数中指定的内容。身份令牌是您在HTTP授权标头中使用的令牌。
使用服务帐户标识授权服务到服务时,请调用Cloud Run元数据服务器为您创建令牌。该端点将返回一个身份令牌。在HTTP授权标头中使用返回的令牌。
http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=<ususally-the-url-of-the-cloud-run-service-you-are-calling>
返回的令牌是可以解码的Signed JWT。 header.payload.signature的典型base64编码。有效负载包含服务帐户的电子邮件地址,此电子邮件地址是Cloud Run Proxy用于授权的电子邮件地址。