Google app engine 使用服务帐户进行GCP服务器到服务器身份验证

Google app engine 使用服务帐户进行GCP服务器到服务器身份验证,google-app-engine,google-cloud-platform,oauth-2.0,google-cloud-functions,google-oauth,Google App Engine,Google Cloud Platform,Oauth 2.0,Google Cloud Functions,Google Oauth,我正在尝试验证从我的谷歌云函数到我的应用程序引擎API的请求(标准环境) 我有一些工作,但我是OAuth2的新手,正在寻找一个精神检查 在我的云函数中,我向API发送经过身份验证的请求,执行以下操作: import { GoogleAuth } from 'google-auth-library'; // Send Request Code: const auth = new GoogleAuth(); const tokenClient = await auth.getIdTokenClie

我正在尝试验证从我的谷歌云函数到我的应用程序引擎API的请求(标准环境)

我有一些工作,但我是OAuth2的新手,正在寻找一个精神检查

在我的云函数中,我向API发送经过身份验证的请求,执行以下操作:

import { GoogleAuth } from 'google-auth-library';

// Send Request Code:
const auth = new GoogleAuth();
const tokenClient = await auth.getIdTokenClient(`/protectedEndpoint`);
await tokenClient.request({
    url: `https://${process.env.GCLOUD_PROJECT}.appspot.com/protectedEndpoint`,
    method: 'POST',
});
import { GoogleAuth } from 'google-auth-library';

// Handle Request Code:
const token = <Bearer token parsed from request headers>
const googleAuth = new GoogleAuth();
const tokenClient = await googleAuth.getIdTokenClient('');
const loginTicket = await tokenClient.verifyIdToken({
    idToken: token,
    audience: '/protectedEndpoint',
});

if (loginTicket.getUserId() !== process.env.SERVICE_ACCOUNT_ID)) {
    throw new Error('Unauthenticated Service Account');
}

return 'Successful Authentication'
在API(应用程序引擎上)中,我执行以下操作:

import { GoogleAuth } from 'google-auth-library';

// Send Request Code:
const auth = new GoogleAuth();
const tokenClient = await auth.getIdTokenClient(`/protectedEndpoint`);
await tokenClient.request({
    url: `https://${process.env.GCLOUD_PROJECT}.appspot.com/protectedEndpoint`,
    method: 'POST',
});
import { GoogleAuth } from 'google-auth-library';

// Handle Request Code:
const token = <Bearer token parsed from request headers>
const googleAuth = new GoogleAuth();
const tokenClient = await googleAuth.getIdTokenClient('');
const loginTicket = await tokenClient.verifyIdToken({
    idToken: token,
    audience: '/protectedEndpoint',
});

if (loginTicket.getUserId() !== process.env.SERVICE_ACCOUNT_ID)) {
    throw new Error('Unauthenticated Service Account');
}

return 'Successful Authentication'
从“谷歌认证库”导入{GoogleAuth};
//处理请求代码:
常量令牌=
const googleAuth=新的googleAuth();
const tokenClient=wait googleAuth.getIdTokenClient(“”);
const loginTicket=wait tokenClient.verifyIdToken({
idToken:token,
观众:“/protectedEndpoint”,
});
if(loginTicket.getUserId()!==process.env.SERVICE\u ACCOUNT\u ID)){
抛出新错误(“未经验证的服务帐户”);
}
返回“成功身份验证”
注意:在这两种情况下,我都使用Google的默认应用程序凭据来初始化GoogleAuth客户端。(我的默认应用程序引擎服务帐户)

这一切都有效。我的函数向我的API发送一个请求,我的API能够解析承载令牌并告诉我它来自我批准的服务帐户。。。但我不是100%确信这是安全的。有人可能在没有我的服务帐户凭据的情况下欺骗我的服务帐户吗

提前谢谢

有没有可能有人在没有注册的情况下欺骗我的服务帐户 它的证书

一个精确的答案需要具体的时间。如果有足够的时间和处理能力,任何身份验证/授权/加密/哈希/签名方法都可能被破坏

Google服务帐户包含RSA 2048位私钥。目前的猜测是,破解RSA 2048位加密需要300万亿年。随着计算机的快速发展,让我们假设在RSA被破坏时,您的数据可能没有任何用途/价值

私钥用于对JWT进行签名。签名JWT用于请求OAuth访问/标识令牌

欺骗需要使用相同的私钥进行签名。因此,用今天的技术进行欺骗是不可能的


窃取/泄露私钥或生成的OAuth令牌是目前唯一现实的方法。

谢谢John!我可以肯定的是,我是否使用谷歌的SDK正确地实现了这一点?@sbjluke-向您的API发送请求的代码是正确的。验证标识令牌的代码似乎是正确的(我没有验证运行时行为)。