Google cloud platform 正在获取服务帐户的Google IdToken?

Google cloud platform 正在获取服务帐户的Google IdToken?,google-cloud-platform,google-login,Google Cloud Platform,Google Login,我有一个后端服务于android客户端,通过android应用程序发送的IdToken对它们进行身份验证。 现在,我需要对正在使用我的API的aws上运行的服务进行身份验证。所以我认为服务帐户可以做到这一点,使用私有pem文件创建一个IdToken,并像android客户端一样发送它。但是我找不到用这些凭证获得IdToken的方法。这是可能的(最好是在nodejs中)。 还是我走错了路?您不能使用为Google Cloud API生成的服务帐户直接对您自己的API进行身份验证。您如何知道哪些服务

我有一个后端服务于android客户端,通过android应用程序发送的IdToken对它们进行身份验证。 现在,我需要对正在使用我的API的aws上运行的服务进行身份验证。所以我认为服务帐户可以做到这一点,使用私有pem文件创建一个IdToken,并像android客户端一样发送它。但是我找不到用这些凭证获得IdToken的方法。这是可能的(最好是在nodejs中)。
还是我走错了路?

您不能使用为Google Cloud API生成的服务帐户直接对您自己的API进行身份验证。您如何知道哪些服务帐户私钥有效,哪些已被吊销?谷歌不会公开这些信息

服务帐户是用来委派凭证的。当您访问Google云平台服务时,您将使用您的Google帐户凭据进行身份验证。您不会希望在运行代码访问任何Google云服务(即云API)所需的任何地方提供完全相同的凭据。相反,您可以创建服务帐户,其范围可以缩小为您的google帐户凭据范围的子集。通过这种方式,一段特定的代码可以仅限于几组API

服务帐户是可由服务使用的特殊帐户 以及运行在Google计算引擎实例上的应用程序 与其他Google云平台API交互。应用程序可以使用 用于向一组API授权自己的服务帐户凭据 并在授予服务的权限内执行操作 帐户和虚拟机实例

什么是服务帐户?

服务帐户对虚拟机上运行的应用程序进行身份验证 将计算机实例连接到其他Google云平台服务。对于 例如,如果您编写的应用程序在上读取和写入文件 谷歌云存储,它必须首先向谷歌云认证 存储API。您可以创建服务帐户并授予该服务 对云存储API的帐户访问。然后,您将更新您的 将服务帐户凭据传递到云的应用程序代码 存储API。通过这种方式,您的应用程序可以无缝地进行身份验证 API,而不将任何密钥或用户凭据嵌入到 实例、映像或应用程序代码

我知道你们的困惑是从哪里来的,这是因为服务帐户也有你们习惯的OAuth模型

您可以使用服务帐户获取访问令牌并根据需要刷新它们,但身份验证的范围最大限度地限制在Google Cloud API的表面。您将无法将API与之混合和匹配

另一种方法是构建自己的身份验证模型(当你说用android应用程序发送的IdToken对他们进行身份验证时,
这个问题不太清楚),或者依靠类似的方法创建和管理API以及API密钥进行身份验证

正如您在其中一条评论中所提到的,您可以按照指南进行操作,该指南描述了如何使用Google云服务帐户通过在Google云端点上运行的API进行身份验证


它支持使用
googleidjwt
令牌。调用者必须将JWT发送到Google令牌端点以获取
Google ID
令牌,然后在所有请求中使用此
Google ID
令牌。这种方法还有一个优点,就是您只需在API配置中将
谷歌ID
令牌服务器列入白名单。

我知道这是一个比较老的问题,但我发现了这个问题,它并没有引导我找到最终的答案

我遵循了指南中的一些混合,其中提到,关键是在生成的JWT中包含一个
目标受众
声明

所以,基本上我制作了一个JWT,看起来像:

{
  "exp": 1547576771,
  "iat": 1547575906,
  "aud":"https://www.googleapis.com/oauth2/v4/token",
  "target_audience": "https://example.com/",
  "iss": EMAIL OF SERVICE ACCOUNT
}
并将其发布到
https://www.googleapis.com/oauth2/v4/token
带参数
grant\u type=urn:ietf:params:oauth:grant-type:jwt-bearer
断言=

没有
目标受众
,端点给了我一个访问令牌,但有了它,我得到了一个
id\u令牌

Grettings自2020年以来

我在Java中使用Google服务帐户的take ID_令牌时遇到问题。我的项目有两年的时间,我使用的是GoogleCredentials、fromStream方法和一个JSON凭证,但这个类没有给我ID_令牌,只有非JWT格式的access_令牌

我解决了这个问题,因为在这几年谷歌更新了java代码用于身份验证,对于take ID_令牌,您必须使用这个库

当您创建这个类时,它本身将通过google的身份验证,并拥有一个访问令牌refreshToken

对于提取ID_令牌,您必须使用此函数:

String audience = "http://localhost"; //Your server domain
IdToken idToken = credential.idTokenWithAudience(audience, new ArrayList<IdTokenProvider.Option>());
String id_token =  idToken.getTokenValue();
String访问群体=”http://localhost"; //您的服务器域
IdToken IdToken=credential.idTokenWithAudience(audience,new ArrayList());
字符串id_token=idToken.getTokenValue();
有了这个,你就有了JWT代币


我希望这能帮助像我这样尝试获取ID_令牌的人。

问题-这些是哪些API-您自己的API还是谷歌云API?服务帐户仅用于授权Google云API。例如,如果您希望您的服务或第三方只调用API的一个子集,则可以使用服务帐户。对于您的用例,我认为您应该研究云端点和API密钥。是的,这是为了验证我自己的API。然而,从一个外部服务器,这也是“我的”。我的想法是根本不给serviceaccount任何权利,只是用来维护身份。CloudEndpoints将(?)强加另一个实现,我正在使用spring。但是,有没有办法从serviceaccount及其私人文件中获取IdToken?感谢@Tuxdude提供的丰富信息
String credPath = "/path/to/svc_account.json";
ServiceAccountCredentials sourceCredentials = ServiceAccountCredentials
     .fromStream(new FileInputStream(credPath));
String audience = "http://localhost"; //Your server domain
IdToken idToken = credential.idTokenWithAudience(audience, new ArrayList<IdTokenProvider.Option>());
String id_token =  idToken.getTokenValue();