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