我有一个服务于Android客户端的后端,使用从Android应用程序发送的IdToken对它们进行身份验证。 现在,我需要验证在使用我的api的aws上运行的服务。所以我认为一个服务帐户可以做到这一点,使用私有pem文件创建一个IdToken并像Android客户端一样发送它。但我发现无法获得具有这些凭据的IdToken。这是可能的(最好是在nodejs中)。 或者我在错误的道路上?
答案 0 :(得分:1)
自2020年以来的担忧
我在Java中无法使用Google服务帐户的ID_TOKEN。我的项目有两年时间,我使用的是GoogleCredentials,fromStream方法和JSON凭证,但是该类没有给我ID_TOKEN,而只有非JWT格式的access_token。
我解决了问题,因为在这一年Google在这里更新了用于身份验证的Java代码,对于ID_TOKEN,您必须使用此库https://github.com/googleapis/google-auth-library-java
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-credentials</artifactId>
<version>0.20.0</version>
</dependency>
然后使用ServiceAccountCredential
String credPath = "/path/to/svc_account.json";
ServiceAccountCredentials sourceCredentials = ServiceAccountCredentials
.fromStream(new FileInputStream(credPath));
创建此类时,其本身将通过google进行身份验证,并具有access_token,refreshToken ...
要提取ID_TOKEN,必须使用此功能:
String audience = "http://localhost"; //Your server domain
IdToken idToken = credential.idTokenWithAudience(audience, new ArrayList<IdTokenProvider.Option>());
String id_token = idToken.getTokenValue();
有了这个,您就有了JWT令牌。
我希望这对尝试获得ID_TOKEN的人像我一样有帮助。
答案 1 :(得分:0)
您无法使用为Google Cloud API生成的服务帐户直接针对您自己的API进行身份验证。您如何知道哪些服务帐户私钥有效以及哪些已被撤销? Google不会公开此信息。
服务帐户更适用于凭据授权。当您访问Google Cloud平台服务时,您将使用您的Google帐户凭据进行身份验证。您不希望在运行代码访问任何Google云服务(即云API)的任何位置配置相同的凭据。相反,您可以创建服务帐户,其范围可以缩小到Google帐户凭据范围的一部分。这样,特定的代码片段可以仅限于几组API。
服务帐户是可供服务使用的特殊帐户 以及在您的Google Compute Engine实例上运行的应用程序 与其他Google Cloud Platform API互动。应用可以使用 服务帐户凭据以授权自己使用一组API 并在授予服务的权限内执行操作 帐户和虚拟机实例。
什么是服务帐户?
服务帐户验证虚拟机上运行的应用程序 机器实例与其他Google Cloud Platform服务。对于 例如,如果您编写一个读取和写入文件的应用程序 Google云端存储必须首先向Google Cloud进行身份验证 存储API。您可以创建服务帐户并授予服务 帐户访问Cloud Storage API。然后,你会更新你的 应用程序代码,用于将服务帐户凭据传递给Cloud 存储API。这样,您的应用程序可以无缝地进行身份验证 API没有在您的帐户中嵌入任何密钥或用户凭据 实例,图像或应用程序代码。
我知道您的困惑在哪里,这是因为服务帐户也具有您习惯的相同OAuth模型。
您可以使用服务帐户获取访问令牌并根据需要刷新它们,但身份验证的范围最大限于Google Cloud API的表面。您将无法将API与API混合搭配。
替代方法是构建您自己的身份验证模型(当您说authenticating them with IdToken sent from the android app
时,问题不是那么清楚)或依赖于您创建和管理API以及API密钥的Cloud endpoints之类的内容用于身份验证。
正如您在其中一条评论中提到的那样,您可以按照Service-to-Service authentication指南进行操作,该指南介绍了如何使用Google Cloud Service帐户对在Google Cloud Endpoint上运行的API进行身份验证。
它支持使用Google ID JWT
令牌。调用者必须将JWT发送到Google令牌端点以获取Google ID
令牌,然后在所有请求中使用此Google ID
令牌。此方法还具有以下优势:您只需将API配置中的Google ID
令牌服务器列入白名单。
答案 2 :(得分:0)
我知道这个年龄更大,但是我发现了这个问题,但并没有把我带到最后得到的答案。
我遵循https://cloud.google.com/endpoints/docs/openapi/service-account-authentication#using_a_google_id_token中的指南,并结合了https://cloud.google.com/iap/docs/authentication-howto,其中提到,这样做的关键是在生成的JWT中包含target_audience
声明。
因此,从本质上讲,我制作了一个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_type=urn:ietf:params:oauth:grant-type:jwt-bearer
将其发布到assertion=<THE JWT>
在没有target_audience
的情况下,端点给了我一个访问令牌,但是有了它,我却得到了id_token
。