Аутентифицировать звонки в Google Cloud Functions программно - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь пройти аутентификацию в облачных функциях Google из SAP CPI для получения некоторых данных из базы данных. Для pu sh данных мы используем pub / sub с токеном доступа к учетной записи службы, и он работает отлично. Но для функций ему нужен токен идентификации, а не токен доступа. Мы получаем предыдущий токен со скриптом groovy (без Jenkins). Можно ли выполнить аутентификацию функций также с помощью токена доступа? Или получить идентификационный токен без создания целого уровня IAP?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Вы можете получить доступ к своей функции защищенного облака только с помощью токена 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)
0 голосов
/ 16 апреля 2020

Вам необходимо вызывать облачные функции (или Cloud Run, то же самое) с подписанным токеном идентификации.

Таким образом, вы можете использовать сценарий 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 для объяснения вариантов использования

...