Mendapatkan token ID

Halaman ini menjelaskan beberapa cara untuk memperoleh token ID OpenID Connect (OIDC) yang ditandatangani Google. Anda memerlukan token ID yang ditandatangani Google untuk kasus penggunaan autentikasi berikut:

Untuk informasi tentang masa berlaku dan konten token ID, lihat token ID.

Token ID memiliki layanan atau aplikasi tertentu yang dapat digunakan, yang ditentukan berdasarkan nilai klaim aud-nya. Halaman ini menggunakan istilah layanan target untuk merujuk pada layanan atau aplikasi tempat token ID dapat digunakan untuk autentikasi.

Setelah mendapatkan token ID, Anda dapat menyertakannya ke header Authorization dalam permintaan ke layanan target.

Metode untuk mendapatkan token ID

Ada berbagai cara untuk mendapatkan token ID. Halaman ini menjelaskan metode berikut:

Cloud Run dan Cloud Functions menyediakan cara khusus layanan untuk mendapatkan token ID. Untuk informasi selengkapnya, lihat Autentikasi ke aplikasi yang dihosting di Cloud Run atau Cloud Functions.

Jika ingin agar token ID dapat diterima oleh aplikasi yang tidak dihosting di Google Cloud, Anda mungkin dapat menggunakan metode ini. Namun, Anda harus mengetahui apa yang menurut token ID diperlukan aplikasi.

Mendapatkan token ID dari server metadata

Saat kode Anda dijalankan pada resource yang dapat memiliki akun layanan yang terpasang padanya, server metadata untuk layanan terkait biasanya dapat memberikan token ID. Server metadata membuat token ID untuk akun layanan yang terpasang. Anda tidak bisa mendapatkan token ID berdasarkan kredensial pengguna dari server metadata.

Anda bisa mendapatkan token ID dari server metadata ketika kode Anda dijalankan di layanan Google Cloud berikut:

Untuk mengambil token ID dari server metadata, Anda harus mengkueri endpoint identitas untuk akun layanan, seperti yang ditunjukkan dalam contoh ini.

curl

Ganti AUDIENCE dengan URI untuk layanan target, misalnya http://www.example.com.

curl -H "Metadata-Flavor: Google" \
  'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE'

PowerShell

Ganti AUDIENCE dengan URI untuk layanan target, misalnya http://www.example.com.

$value = (Invoke-RestMethod `
  -Headers @{'Metadata-Flavor' = 'Google'} `
  -Uri "http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE")
$value

Java

Untuk menjalankan contoh kode ini, Anda harus menginstal Library Klien Google API untuk Java.


import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.IdTokenCredentials;
import com.google.auth.oauth2.IdTokenProvider;
import com.google.auth.oauth2.IdTokenProvider.Option;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;

public class IdTokenFromMetadataServer {

  public static void main(String[] args) throws IOException, GeneralSecurityException {
    // TODO(Developer): Replace the below variables before running the code.

    // The url or target audience to obtain the ID token for.
    String url = "https://example.com";

    getIdTokenFromMetadataServer(url);
  }

  // Use the Google Cloud metadata server to create an identity token and add it to the
  // HTTP request as part of an Authorization header.
  public static void getIdTokenFromMetadataServer(String url) throws IOException {
    // Construct the GoogleCredentials object which obtains the default configuration from your
    // working environment.
    GoogleCredentials googleCredentials = GoogleCredentials.getApplicationDefault();

    IdTokenCredentials idTokenCredentials =
        IdTokenCredentials.newBuilder()
            .setIdTokenProvider((IdTokenProvider) googleCredentials)
            .setTargetAudience(url)
            // Setting the ID token options.
            .setOptions(Arrays.asList(Option.FORMAT_FULL, Option.LICENSES_TRUE))
            .build();

    // Get the ID token.
    // Once you've obtained the ID token, you can use it to make an authenticated call to the
    // target audience.
    String idToken = idTokenCredentials.refreshAccessToken().getTokenValue();
    System.out.println("Generated ID token.");
  }
}

Go

import (
	"context"
	"fmt"
	"io"

	"golang.org/x/oauth2/google"
	"google.golang.org/api/idtoken"
	"google.golang.org/api/option"
)

// getIdTokenFromMetadataServer uses the Google Cloud metadata server environment
// to create an identity token and add it to the HTTP request as part of an Authorization header.
func getIdTokenFromMetadataServer(w io.Writer, url string) error {
	// url := "http://www.example.com"

	ctx := context.Background()

	// Construct the GoogleCredentials object which obtains the default configuration from your
	// working environment.
	credentials, err := google.FindDefaultCredentials(ctx)
	if err != nil {
		return fmt.Errorf("failed to generate default credentials: %w", err)
	}

	ts, err := idtoken.NewTokenSource(ctx, url, option.WithCredentials(credentials))
	if err != nil {
		return fmt.Errorf("failed to create NewTokenSource: %w", err)
	}

	// Get the ID token.
	// Once you've obtained the ID token, you can use it to make an authenticated call
	// to the target audience.
	_, err = ts.Token()
	if err != nil {
		return fmt.Errorf("failed to receive token: %w", err)
	}
	fmt.Fprintf(w, "Generated ID token.\n")

	return nil
}

Node.js

/**
 * TODO(developer):
 *  1. Uncomment and replace these variables before running the sample.
 */
// const targetAudience = 'http://www.example.com';

const {GoogleAuth} = require('google-auth-library');

async function getIdTokenFromMetadataServer() {
  const googleAuth = new GoogleAuth();

  const client = await googleAuth.getIdTokenClient(targetAudience);

  // Get the ID token.
  // Once you've obtained the ID token, you can use it to make an authenticated call
  // to the target audience.
  await client.idTokenProvider.fetchIdToken(targetAudience);
  console.log('Generated ID token.');
}

getIdTokenFromMetadataServer();

Python

Untuk menjalankan contoh kode ini, Anda harus menginstal Library Python Google Auth.


import google
import google.oauth2.credentials
from google.auth import compute_engine
import google.auth.transport.requests

def idtoken_from_metadata_server(url: str):
    """
    Use the Google Cloud metadata server in the Cloud Run (or AppEngine or Kubernetes etc.,)
    environment to create an identity token and add it to the HTTP request as part of an
    Authorization header.

    Args:
        url: The url or target audience to obtain the ID token for.
            Examples: http://www.example.com
    """

    request = google.auth.transport.requests.Request()
    # Set the target audience.
    # Setting "use_metadata_identity_endpoint" to "True" will make the request use the default application
    # credentials. Optionally, you can also specify a specific service account to use by mentioning
    # the service_account_email.
    credentials = compute_engine.IDTokenCredentials(
        request=request, target_audience=url, use_metadata_identity_endpoint=True
    )

    # Get the ID token.
    # Once you've obtained the ID token, use it to make an authenticated call
    # to the target audience.
    credentials.refresh(request)
    # print(credentials.token)
    print("Generated ID token.")

Ruby

Untuk menjalankan contoh kode ini, Anda harus menginstal Library Google Auth untuk Ruby.

require "googleauth"

##
# Uses the Google Cloud metadata server environment to create an identity token
# and add it to the HTTP request as part of an Authorization header.
#
# @param url [String] The url or target audience to obtain the ID token for
#   (e.g. "http://www.example.com")
#
def auth_cloud_idtoken_metadata_server url:
  # Create the GCECredentials client.
  id_client = Google::Auth::GCECredentials.new target_audience: url

  # Get the ID token.
  # Once you've obtained the ID token, you can use it to make an authenticated call
  # to the target audience.
  id_client.fetch_access_token
  puts "Generated ID token."

  id_client.refresh!
end

Menggunakan layanan penghubung untuk membuat token ID

Beberapa layanan Google Cloud membantu Anda memanggil layanan lainnya. Layanan penghubung ini dapat membantu menentukan kapan panggilan dilakukan, atau mengelola alur kerja yang mencakup pemanggilan layanan. Layanan berikut dapat otomatis menyertakan token ID, dengan nilai yang sesuai untuk klaim aud, saat memulai panggilan ke layanan yang memerlukan token ID:

Cloud Scheduler
Cloud Scheduler adalah scheduler cron job tingkat perusahaan yang terkelola sepenuhnya. Anda dapat mengonfigurasi Cloud Scheduler untuk menyertakan token ID atau token akses saat layanan lain dipanggil. Untuk mengetahui informasi selengkapnya, lihat Menggunakan autentikasi dengan Target HTTP.
Cloud Tasks
Dengan Cloud Tasks, Anda dapat mengelola eksekusi tugas terdistribusi. Anda dapat mengonfigurasi tugas untuk menyertakan token ID atau token akses saat memanggil layanan. Untuk informasi selengkapnya, lihat Menggunakan tugas Target HTTP dengan token autentikasi.
Pub/Sub
Pub/Sub memungkinkan komunikasi asinkron antara layanan. Anda dapat mengonfigurasi Pub/Sub untuk menyertakan token ID dengan pesan. Untuk informasi selengkapnya, lihat Autentikasi untuk langganan push.
Workflows
Alur kerja adalah platform orkestrasi terkelola sepenuhnya yang mengeksekusi layanan dalam urutan yang Anda tentukan: alur kerja. Anda dapat menentukan alur kerja untuk menyertakan token ID atau token akses saat layanan lain memanggil layanan lain. Untuk informasi lebih lanjut, lihat Membuat permintaan terautentikasi dari alur kerja.

Membuat token ID dengan meniru identitas akun layanan

Peniruan akun layanan memungkinkan akun utama membuat kredensial berjangka pendek untuk akun layanan tepercaya. Akun utama kemudian dapat menggunakan kredensial ini untuk melakukan autentikasi sebagai akun layanan.

Sebelum akun utama dapat meniru identitas akun layanan, akun utama harus memiliki peran IAM di akun layanan tersebut yang memungkinkan peniruan identitas. Jika akun utama itu sendiri adalah akun layanan lain, akan tampak lebih mudah untuk memberikan izin yang diperlukan secara langsung ke akun layanan tersebut, dan memungkinkannya meniru identitasnya sendiri. Konfigurasi ini, yang dikenal sebagai peniruan identitas diri, menciptakan kerentanan keamanan, karena memungkinkan akun layanan membuat token akses yang dapat diperbarui seterusnya.

Peniruan akun layanan harus selalu melibatkan dua akun utama: akun utama yang mewakili pemanggil, dan akun layanan yang ditiru identitasnya, yang disebut akun layanan yang memiliki hak istimewa.

Untuk membuat token ID dengan meniru akun layanan, gunakan proses umum berikut.

Untuk petunjuk langkah demi langkah, lihat Membuat token ID.

  1. Identifikasi atau buat akun layanan untuk menjadi akun layanan yang memiliki hak istimewa. Beri akun layanan tersebut peran IAM yang diperlukan, pada layanan target:

    • Untuk layanan Cloud Run, berikan peran Cloud Run Invoker (roles/run.invoker).
    • Untuk Cloud Functions, berikan peran Cloud Functions Invoker (roles/cloudfunctions.invoker).
    • Untuk layanan target lainnya, lihat dokumentasi produk untuk layanan tersebut.
  2. Identifikasi akun utama yang akan melakukan peniruan identitas, dan siapkan Kredensial Default Aplikasi (ADC) agar dapat menggunakan kredensial untuk akun utama ini.

    Untuk lingkungan pengembangan, akun utama biasanya adalah akun pengguna yang Anda berikan ke ADC dengan menggunakan gcloud CLI. Namun, jika Anda menjalankannya di resource yang terpasang dengan akun layanan, akun layanan yang terpasang adalah akun utama.

  3. Beri akun utama peran Service Account OpenID Connect Identity Token Creator (roles/iam.serviceAccountOpenIdTokenCreator).

  4. Gunakan IAM Credentials API untuk membuat token ID untuk akun layanan yang diotorisasi.

Membuat token ID generik untuk pengembangan dengan Cloud Run dan Cloud Functions

Anda dapat menggunakan gcloud CLI guna mendapatkan token ID untuk kredensial pengguna Anda yang dapat digunakan dengan layanan Cloud Run atau Cloud Function yang pemanggilnya memiliki izin IAM yang diperlukan untuk memanggil. Token ini tidak akan berfungsi untuk aplikasi lain.

Membuat token ID menggunakan penyedia identitas eksternal

Pembuatan token ID dengan penyedia identitas eksternal akan menggunakan workload identity federation, yang memungkinkan Anda menyiapkan hubungan antara Google Cloud dan penyedia identitas eksternal Anda. Selanjutnya, Anda dapat menggunakan kredensial yang disediakan oleh penyedia identitas eksternal untuk membuat token ID atau token akses yang dapat digunakan di Google Cloud.

Guna membuat token ID untuk kredensial yang disediakan dari penyedia identitas eksternal, ikuti langkah-langkah berikut:

  1. Identifikasi atau buat akun layanan untuk menyediakan peran IAM yang diperlukan untuk memanggil layanan target.

    Praktik terbaiknya adalah membuat akun layanan khusus untuk tujuan ini, dan hanya memberinya peran yang diperlukan. Pendekatan ini mengikuti prinsip hak istimewa terendah.

  2. Identifikasi peran yang diperlukan untuk memanggil layanan target. Berikan peran ini ke akun layanan di layanan target:

    • Untuk layanan Cloud Run, berikan peran Cloud Run Invoker (roles/run.invoker).
    • Untuk Cloud Functions, berikan peran Cloud Functions Invoker (roles/cloudfunctions.invoker).
    • Untuk layanan target lainnya, lihat dokumentasi produk untuk layanan tersebut.
  3. Konfigurasikan workload identity federation untuk penyedia identitas seperti yang dijelaskan dalam Mengonfigurasi workload identity federation.

  4. Ikuti petunjuk di Memberikan izin identitas eksternal untuk meniru identitas akun layanan. Gunakan akun layanan yang Anda siapkan di langkah sebelumnya sebagai akun layanan yang akan ditiru.

  5. Gunakan REST API untuk mendapatkan token berjangka pendek, tetapi untuk langkah terakhir, gunakan metode generateIdToken sebagai gantinya, untuk mendapatkan token ID:

    Bash

    ID_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateIdToken \
        -H "Content-Type: text/json; charset=utf-8" \
        -H "Authorization: Bearer $STS_TOKEN" \
        -d @- <<EOF | jq -r .token
        {
            "audience": "AUDIENCE"
        }
    EOF
    )
    echo $ID_TOKEN
    

    PowerShell

    $IdToken = (Invoke-RestMethod `
        -Method POST `
        -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateIdToken" `
        -Headers @{ "Authorization" = "Bearer $StsToken" } `
        -ContentType "application/json" `
        -Body (@{
            "audience" = "AUDIENCE"
        } | ConvertTo-Json)).token
    Write-Host $IdToken
    

    Ganti kode berikut:

    • SERVICE_ACCOUNT_EMAIL: alamat email akun layanan
    • AUDIENCE: audiens untuk token, seperti aplikasi atau layanan yang tokennya akan digunakan untuk mengakses

Langkah selanjutnya