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:

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 Auth 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

Untuk menjalankan contoh kode ini, Anda harus menginstal Library Google Auth untuk 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 penjadwal cron job tingkat perusahaan yang terkelola sepenuhnya. Anda dapat mengonfigurasi Cloud Scheduler untuk menyertakan token ID atau token akses saat layanan lain dipanggil. Untuk 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 antarlayanan. Anda dapat mengonfigurasi Pub/Sub untuk menyertakan token ID dengan pesan. Untuk mengetahui informasi selengkapnya, lihat Autentikasi untuk langganan push.
Workflows
Workflows adalah platform orkestrasi terkelola sepenuhnya yang menjalankan layanan dalam urutan yang Anda tentukan: alur kerja. Anda dapat menentukan alur kerja untuk menyertakan token ID atau token akses saat memanggil layanan lain. Untuk mengetahui informasi selengkapnya, lihat Membuat permintaan yang diautentikasi 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.

  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 fungsi Cloud Run, berikan peran Cloud Functions Invoker (roles/cloudfunctions.invoker).
    • Untuk layanan target lainnya, lihat dokumentasi produk untuk layanan tersebut.
  3. 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.

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

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

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

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

Langkah selanjutnya