Google cloud platform 如何在GCP云运行时对联邦GraphQL服务进行身份验证?

Google cloud platform 如何在GCP云运行时对联邦GraphQL服务进行身份验证?,google-cloud-platform,graphql,apollo,google-cloud-run,federated,Google Cloud Platform,Graphql,Apollo,Google Cloud Run,Federated,我在GCP云上运行了一系列微服务,每个微服务都托管一个联合Apollo GraphQL服务。然后,我有最后一个容器,它充当其余服务的联邦GraphQL网关 当在容器上启用公共访问时,这可以正常工作,但我无法让网关服务器针对其他两个服务进行身份验证 我尝试使用Apollo RemoteGraphQLDataSource并实现willSendRequest方法来设置必要的头 我还尝试将云运行调用者角色添加到网关作为服务角色运行 const servicex=new RemoteGraphQLData

我在GCP云上运行了一系列微服务,每个微服务都托管一个联合Apollo GraphQL服务。然后,我有最后一个容器,它充当其余服务的联邦GraphQL网关

当在容器上启用公共访问时,这可以正常工作,但我无法让网关服务器针对其他两个服务进行身份验证

我尝试使用Apollo RemoteGraphQLDataSource并实现willSendRequest方法来设置必要的头

我还尝试将云运行调用者角色添加到网关作为服务角色运行

const servicex=new RemoteGraphQLDataSource({
url:serviceurl,
willSendRequest({request,context}){
request.http.headers.set(
“授权”,
“持票人${TOKEN}”
);
}
});
const gateway=新网关({
服务列表:[
servicex
]
});
const{schema,executor}=wait gateway.load();
const server=new服务器({schema,executor})

我希望网关服务器能够针对其他微服务进行身份验证。

云运行授权需要在您的
授权:承载令牌
HTTP头中使用OAuth 2.0身份令牌。一个常见的错误是使用访问令牌

除非您在部署命令中指定了新的服务帐户,否则Cloud Run将使用计算引擎默认服务帐户作为其标识。这意味着您需要为
角色/run.Invoker
指定服务帐户电子邮件地址

当您使用OAuth对用户凭据进行授权时,您可以收到三个令牌:访问令牌、刷新令牌和标识令牌,具体取决于您在Scopes参数中指定的内容。标识令牌是您在HTTP授权头中使用的

http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=<ususally-the-url-of-the-cloud-run-service-you-are-calling>
当您使用服务帐户标识授权服务时,请调用云运行元数据服务器为您创建令牌。此端点将返回标识令牌。在HTTP授权头中使用返回的令牌

http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=<ususally-the-url-of-the-cloud-run-service-you-are-calling>
http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=

返回的令牌是一个可以解码的签名JWT。header.payload.signature的典型base64编码。有效负载包含服务帐户的电子邮件地址,此电子邮件地址是云运行代理用于授权的电子邮件地址。

我刚刚发现,willSendRequest回调仅在外部服务调用该服务时触发,而不是在初始获取联合服务时触发。公开发行详情如下: