我正在尝试从SAP CPI向Google Cloud Functions进行身份验证,以从数据库中获取一些数据。为了推送数据,我们使用带有服务帐户访问令牌的pub/sub,它非常有效。但对于函数,它需要一个身份令牌,而不是访问令牌。我们使用一个groovy脚本(No Jenkins(获得前面的令牌。
是否可以使用访问令牌对功能进行身份验证?或者在不构建整个IAP层的情况下获得身份令牌?
您必须使用签名的身份令牌调用您的云函数(或云运行,相同(。
因此,您可以使用groovy脚本来生成签名的身份令牌。这里有一个的例子
import com.google.api.client.http.GenericUrl
import com.google.api.client.http.HttpRequest
import com.google.api.client.http.HttpRequestFactory
import com.google.api.client.http.HttpResponse
import com.google.api.client.http.javanet.NetHttpTransport
import com.google.auth.Credentials
import com.google.auth.http.HttpCredentialsAdapter
import com.google.auth.oauth2.IdTokenCredentials
import com.google.auth.oauth2.IdTokenProvider
import com.google.auth.oauth2.ServiceAccountCredentials
import com.google.common.base.Charsets
import com.google.common.io.CharStreams
String myUri = "YOUR_URL";
Credentials credentials = ServiceAccountCredentials
.fromStream(new FileInputStream(new File("YOUR_SERVICE_ACCOUNT_KEY_FILE"))).createScoped("https://www.googleapis.com/auth/cloud-platform");
String token = ((IdTokenProvider) credentials).idTokenWithAudience(myUri, Collections.EMPTY_LIST).getTokenValue();
System.out.println(token);
IdTokenCredentials idTokenCredentials = IdTokenCredentials.newBuilder()
.setIdTokenProvider((ServiceAccountCredentials) credentials)
.setTargetAudience(myUri).build();
HttpRequestFactory factory = new NetHttpTransport().createRequestFactory(new HttpCredentialsAdapter(idTokenCredentials));
HttpRequest request = factory.buildGetRequest(new GenericUrl(myUri));
HttpResponse httpResponse = request.execute();
System.out.println(CharStreams.toString(new InputStreamReader(httpResponse.getContent(), Charsets.UTF_8)));
只有当您在GCP之外时,才需要服务帐户密钥文件。否则,默认服务帐户就足够了,但必须是服务帐户。您的个人用户帐户无法工作
添加此依赖项(在Maven中(
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-oauth2-http</artifactId>
<version>0.20.0</version>
</dependency>
或者你可以使用我编写的开源工具。我还写了一篇Medium文章来解释的用例
您只能使用Identity令牌访问您的安全云功能。
1.使用roles/cloudfunctions.invoker
创建服务帐户
2.创建一个只允许经过身份验证的请求的云功能
https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
target_audience = 'https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME'
creds = service_account.IDTokenCredentials.from_service_account_file(
'/path/to/svc.json', target_audience=target_audience)
authed_session = AuthorizedSession(creds)
# make authenticated request and print the response, status_code
resp = authed_session.get(target_audience)
print(resp.status_code)
print(resp.text)