Estoy tratando de autenticarme en Google Cloud Functions desde SAP CPI para obtener algunos datos de una base de datos. Para enviar datos, utilizamos pub / sub, con un token de acceso a la cuenta de servicio, y funciona perfectamente. Pero para las funciones, necesita un token de identidad en lugar de un token de acceso. Obtenemos el token anterior con un script maravilloso (No Jenkins). ¿Es posible autenticar las funciones también con un token de acceso? ¿O para obtener el token de identidad sin construir una capa IAP completa?

0
Ignacio Van Loy 16 abr. 2020 a las 15:19

2 respuestas

La mejor respuesta

Debe llamar a sus Funciones de nube (o Cloud Run, es lo mismo) con un token de identidad firmado.

Por lo tanto, puede usar un script maravilloso para generar un token de identidad firmado. Aquí un ejemplo


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)));

Se requiere el archivo de clave de la cuenta de servicio solo si está fuera de GCP. De lo contrario, la cuenta de servicio predeterminada es suficiente, pero debe ser una cuenta de servicio. Su cuenta de usuario personal no funcionará

Agregue esta dependencia (aquí en Maven)

        <dependency>
            <groupId>com.google.auth</groupId>
            <artifactId>google-auth-library-oauth2-http</artifactId>
            <version>0.20.0</version>
        </dependency>

O puede usar una herramienta que escribí y abrí de origen. También escribió un artículo medio para explicar los casos de uso

0
guillaume blaquiere 16 abr. 2020 a las 15:14

Solo puede acceder a su función de nube segura utilizando el token de identidad.

1. Cree una cuenta de servicio con roles/cloudfunctions.invoker

2.Cree una función en la nube que permita solo solicitudes autenticadas

  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)
0
marian.vladoi 16 abr. 2020 a las 15:29