当前位置: 首页 > 知识库问答 >
问题:

如何使用Workload identity在Google云的Google Kubernetes引擎中访问ESP。NET SDK?

曹昊焱
2023-03-14

出身背景

在Google Kubernetes引擎上,我们一直在使用云endpoint和可扩展服务代理(v2)进行服务到服务的身份验证。

这些服务通过在HTTP请求的授权头中包含承载JWT令牌来进行身份验证。

服务的标识已通过GCP服务帐户维护,并且在部署期间,Json服务帐户密钥被挂载到容器的预定义位置,该位置被设置为GOOGLE_APPLICATION_CREDENTIALSenv var的值。

这些服务是在C#和ASP. NET Core中实现的,为了生成实际的JWT令牌,我们使用Google Cloud SDK(https://github.com/googleapis/google-cloud-dotnet和https://github.com/googleapis/google-api-dotnet-client),其中我们调用以下方法:

var credentials = GoogleCredential.GetApplicationDefault();

如果GOOGLE_APPLICATION_CREDENTIALS被正确地设置为服务帐户密钥的路径,那么这将返回一个ServiceAcCountCredential对象,我们可以在该对象上调用GetAccessTokenForrecestAsync()方法,该方法返回实际的JWT令牌。

var jwtToken = await credentials.GetAccessTokenForRequestAsync("https://other-service.example.com/");
var authHeader = $"Bearer {jwtToken}";

这个过程一直在正常工作,没有任何问题。

情况是,我们正在从使用手动维护的服务帐户密钥迁移到使用工作负载标识,我不知道如何正确使用Google Cloud SDK来生成必要的JWT令牌。

问题

当我们在容器中启用工作负载标识时,不装载服务帐户密钥文件,也不设置GOOGLE_应用程序_凭据env var,然后设置GoogleCredential。GetApplicationDefault()调用返回一个ComputeCredential而不是ServiceAccountCredential
如果我们调用GetAccessTokenForRequestAsync()方法,它将返回一个不是JWT格式的令牌。

我检查了实现,令牌似乎是从元数据服务器检索到的,其中预期的响应格式似乎是标准的OAuth 2.0模型(在此模型类中表示):

{
  "access_token": "foo",
  "id_token": "bar",
  "token_type": "Bearer",
  ...
}

GetAccessTokenForRequestAsync()方法返回access\u token的值。但据我所知,这不是JWT令牌,事实上,当我尝试使用它对ESP进行身份验证时,它的响应是

{
 "code": 16,
 "message": "JWT validation failed: Bad JWT format: Invalid JSON in header",
 ..
}

据我所知,通常id_token包含JWT令牌,它应该可以通过Token响应对象的IdToken属性访问,也可以通过SDK访问,我尝试这样访问它:

var jwtToken = ((ComputeCredential)creds.UnderlyingCredential).Token.IdToken;

但这会返回null,因此元数据服务器显然不会返回id_令牌字段中的任何内容。

问题

使用JWT令牌的正确方式是什么。NET Google Cloud SDK,用于在GKE中使用工作负载标识时访问ESP?

共有1个答案

郗浩
2023-03-14

要获得附加服务号的IdToken,可以使用GoogleCredential。默认值。GetOidcTokenAsync(...)

 类似资料:
  • 问题内容: 我无法在Google Container Engine中使用“应用程序默认凭据”。这些文档说,它们是为App Engine和Compute Engine设计的,但是有人告诉我,它们应该透明地传递给在Container Engine上运行的容器。 这是失败的代码: 失败的错误: 期望Application Default Credentials与Container Engine一起使用是

  • 我正在App Engine上评估一个Quarkus应用程序。该应用程序需要一个基于Cloud SQL的Postgres DB,我将该实例命名为“quarkus”。 但是我遇到了这些访问错误:无权访问实例:addlogic-foodiefnf-1:quarkus Service account:addlogic-foodiefnf-1 @ app spot . gserviceaccount . c

  • 我在docker容器中运行gunicorn flask服务,并使用Google容器引擎。我在下面的教程中设置了集群http://kubernetes.io/docs/hellonode/ 环境变量在Kubernetes集群中始终包含一个内部地址。我要找的是HTTP_X_FORWARDED_for,但请求头中缺少它。是否可以将服务配置为在请求中保留外部客户端ip?

  • Google Cloud Platform已经引入了身份感知代理,以保护应用引擎灵活环境实例免受公共访问。 然而,尚不完全清楚这是否可以或应该从访问GAE托管APIendpoint的谷歌云函数中使用。 文档(包括Python和Java示例)显示了一个IAP身份验证工作流,包括1)生成JWT令牌,2)创建OpenID令牌,3)然后使用头向Google App Engine提交请求。 如果每次调用函数

  • 我试图在我的云功能中访问Firebase云存储,但我一直在云功能日志中出现以下错误: 下面是我的代码: const admin=需要('Firebase-admin'); const函数=需要('Firebase-函数'); 下面是我的包中的依赖项。json: PS:我在星火计划上