1

我在 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 })

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

4

1 回答 1

1

authorization: bearer TOKENCloud Run 授权需要在您的HTTP 标头中使用 OAuth 2.0 身份令牌。一个常见的错误是使用访问令牌。

除非您在部署命令中指定了新的服务帐号,否则 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>

返回的令牌是您可以解码的签名 JWT。header.payload.signature 的典型 base64 编码。有效负载包含服务帐号的电子邮件地址,该电子邮件地址是 Cloud Run 代理用于授权的地址。

于 2019-07-01T20:21:41.523 回答