5 способов аутентификации и вызова функций Google Cloud в Golang

В этой статье блога мы рассмотрим пять различных методов аутентификации и вызова облачных функций Google с использованием языка программирования Go. Мы углубимся в практические примеры кода и объясним каждый метод в разговорной форме. К концу вы получите хорошее представление о различных методах аутентификации и о том, как запускать облачные функции с надлежащей авторизацией.

Метод 1. Использование учетных данных сервисной учетной записи

Первый метод предполагает создание и использование сервисной учетной записи, которая предоставляет учетные данные аутентификации вашему приложению для доступа к ресурсам Google Cloud. Вот пошаговое руководство:

Шаг 1. Создайте сервисный аккаунт в Google Cloud Console.
Шаг 2. Создайте файл ключа JSON для сервисного аккаунта.
Шаг 3. Надежно сохраните файл ключа на своем сервере.
Шаг 4. Используйте файл ключа для аутентификации вашего приложения Golang и вызовите API облачных функций.

Пример кода:

package main
import (
    "context"
    "fmt"
    "log"
    "cloud.google.com/go/functions"
    "google.golang.org/api/option"
)
func main() {
    ctx := context.Background()
    serviceAccountKey := "/path/to/service-account-key.json"
    client, err := functions.NewClient(ctx, option.WithCredentialsFile(serviceAccountKey))
    if err != nil {
        log.Fatal(err)
    }
// Invoke the Cloud Function using the client
    resp, err := client.Call(ctx, &functions.CallRequest{
        // Set function name and payload
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(resp)
}

Метод 2. Использование учетных данных приложения по умолчанию

Второй метод использует учетные данные приложения по умолчанию (ADC), которые автоматически извлекают соответствующие учетные данные в зависимости от среды, в которой выполняется ваш код. Это упрощает процесс аутентификации, устраняя необходимость в явном управлении файлами ключей.

Пример кода:

package main
import (
    "context"
    "fmt"
    "log"
    "cloud.google.com/go/functions"
)
func main() {
    ctx := context.Background()
    client, err := functions.NewClient(ctx)
    if err != nil {
        log.Fatal(err)
    }
// Invoke the Cloud Function using the client
    resp, err := client.Call(ctx, &functions.CallRequest{
        // Set function name and payload
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(resp)
}

Метод 3. Использование учетных данных приложения по умолчанию с олицетворением

Если вы хотите вызвать функцию от имени другого пользователя или учетной записи службы, вы можете использовать олицетворение. Этот метод позволяет вам аутентифицировать ваше приложение с помощью учетной записи службы, а затем выдавать себя за другого пользователя или учетную запись службы для доступа к облачным функциям.

Пример кода:

package main
import (
    "context"
    "fmt"
    "log"
    "cloud.google.com/go/functions"
    "google.golang.org/api/option"
)
func main() {
    ctx := context.Background()
    serviceAccountKey := "/path/to/service-account-key.json"
    impersonatedUser := "user@example.com"
    client, err := functions.NewClient(ctx, option.WithCredentialsFile(serviceAccountKey), option.ImpersonateCredentials(impersonatedUser))
    if err != nil {
        log.Fatal(err)
    }
// Invoke the Cloud Function using the client
    resp, err := client.Call(ctx, &functions.CallRequest{
        // Set function name and payload
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(resp)
}

Метод 4. Использование учетной записи пользователя

Если вы хотите пройти аутентификацию и вызвать облачную функцию с использованием учетной записи пользователя, вы можете использовать поток OAuth 2.0 для получения токена доступа и включения его в свои запросы API.

Пример кода:

package main
import (
    "context"
    "fmt"
    "log"
    "os"
    "golang.org/x/oauth2"
    "google.golang.org/api/functions/v1"
)
func main() {
    ctx := context.Background()
    functionsService, err := functions.NewService(ctx)
    if err != nil {
        log.Fatal(err)
    }
// Use OAuth 2.0 flow to obtain an access token
    config := &oauth2.Config{
        ClientID:     "your-client-id",
        ClientSecret: "your-client-secret",
        Endpoint:     oauth2.Endpoint{
            TokenURL: "https://accounts.google.com/o/oauth2/token",
        },
    }
// Get the access token
    token, err := config.PasswordCredentialsToken(ctx, "your-username", "your-password")
    if err != nil {
        log.Fatal(err)
    }
// Set the access token in the client
    functionsService.Client = config.Client(ctx, token)
    // Invoke the Cloud Function using the service
    resp, err := functionsService.Projects.Locations.Functions.Call("projects/your-project/locations/your-location/functions/your-function", &functions.CallRequest{
        // Set function name and payload
    }).Context(ctx).Do()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(resp)
}

Метод 5. Использование ключа API

Если вы включили аутентификацию по ключу API для своих облачных функций, вы можете вызывать их, включая ключ API в свои запросы.

Пример кода:

package main
import (
    "context"
    "fmt"
    "log"
    "net/http"
)
func main() {
    ctx := context.Background()
    client := &http.Client{}
    req, err := http.NewRequestWithContext(ctx, "POST", "https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME", nil)
    if err != nil {
        log.Fatal(err)
    }
    req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    // Process the response
    // ...
    fmt.Println(resp)
}

В этой статье блога мы рассмотрели пять различных методов аутентификации и вызова облачных функций Google в Golang. Каждый метод обеспечивает уникальный подход к аутентификации, что дает вам возможность выбрать тот, который лучше всего соответствует требованиям вашего приложения. Следуя предоставленным примерам кода, вы можете легко интегрировать механизмы аутентификации и авторизации в свои приложения Golang, обеспечивая безопасную и эффективную связь с вашими облачными функциями.