Codelab: Mengotomatiskan verifikasi domain untuk Google Workspace

Mengapa mengotomatiskan verifikasi domain?

Meskipun Cloud Channel API memungkinkan Anda untuk menyediakan hak Google Workspace dalam skala besar, pelanggan masih harus melakukan tindakan berikut untuk mengaktifkan layanan.

  1. Menyetujui Persyaratan Layanan
  2. Memverifikasi kepemilikan domain
  3. Siapkan data MX

Pelanggan yang baru dibuat akan mengikuti proses persyaratan terpandu saat mereka mengakses konsol admin (di admin.google.com) untuk pertama kalinya.

Jika memiliki akses terprogram ke data DNS domain (misalnya, jika Anda menjual kembali domain kepada pelanggan), Anda dapat mengotomatiskan langkah 2 dan 3 untuk meningkatkan tingkat aktivasi karena langkah tersebut biasanya memerlukan pengetahuan teknis dari pelanggan reseller.

Codelab ini menjelaskan cara menggunakan Site Verification API untuk menerapkan otomatisasi ini.

Sebelum memulai

  • Pastikan Anda menyelesaikan codelab penyiapan API untuk menyiapkan project Google Cloud dan membuat akun layanan untuk memanggil Cloud Channel API.

  • Baca operasi Layanan Saluran.

  • Sebaiknya gunakan Test Partner Sales Console untuk codelab ini.

Anda juga diharapkan telah menyelesaikan codelab penyediaan Workspace secara menyeluruh.

Ringkasan

Verifikasi domain untuk hak Google Workspace melibatkan beberapa panggilan API.

Langkah-langkah untuk mengotomatiskan verifikasi domain

Site Verification API tidak khusus untuk reseller. Verifikasi domain adalah sinyal yang digunakan di berbagai produk Google (Search Console, Google Ads, dll.). Proses yang dijelaskan di sini bergantung pada penetapan admin super domain reseller sebagai "pemilik" domain dan penetapan admin pertama pelanggan sebagai rekan pemilik. Anda dapat mempelajari konsep tersebut lebih lanjut di halaman Mulai menggunakan Site Verification API.

Langkah 1: Bersiap untuk Site Verification API

Langkah 2: Dapatkan token verifikasi

Codelab ini akan berfokus pada cara paling umum untuk memverifikasi domain: menggunakan data DNS TXT. Site Verification API mendukung metode verifikasi lain.

Untuk mengambil token yang akan ditempatkan sebagai data TXT, Anda perlu mendapatkan token untuk type=INET_DOMAIN dan verificationMethod=DNS_TXT.

Pada kode berikut, isi variabel ini menggunakan informasi Anda.

  • jsonKeyFile: Jalur ke file kunci JSON yang dibuat saat Anda membuat akun layanan.
  • resellerAdminUser: Alamat email admin super domain reseller.
  • customerDomain: Domain pelanggan akhir. Jika Anda menjalankan codelab ini di Partner Sales Console Pengujian, pastikan domainnya mengikuti konvensi penamaan domain.

C#

Menggunakan impor berikut:

using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.SiteVerification.v1;
using Google.Apis.SiteVerification.v1.Data;

Buat klien API dan ambil token:

// Set up credentials with user impersonation
ICredential credential = GoogleCredential.FromFile(jsonKeyFile)
                             .CreateScoped("https://www.googleapis.com/auth/siteverification")
                             .CreateWithUser(resellerAdminUser);

// Create the API service
var verificationService = new SiteVerificationService(new BaseClientService.Initializer{
    HttpClientInitializer = credential,
});

// Fetch the token
var request = new SiteVerificationWebResourceGettokenRequest {
  VerificationMethod = "DNS_TXT",
  Site = new SiteVerificationWebResourceGettokenRequest.SiteData {
    Type = "INET_DOMAIN",
    Identifier = customerDomain
  }
};
var response = verificationService.WebResource.GetToken(request).Execute();
string token = response.Token;
Console.WriteLine("Site Verification token: " + token);

Go

Menggunakan impor berikut:

import (
  "context"
  "fmt"
  "os"

  "golang.org/x/oauth2/google"
  "google.golang.org/api/option"
  "google.golang.org/api/siteverification/v1"
)

Buat klien API dan ambil token:

ctx := context.Background()

// Set up credentials with user impersonation
jsonKey, _ := os.ReadFile(jsonKeyFile)
jwt, _ := google.JWTConfigFromJSON(jsonKey, "https://www.googleapis.com/auth/siteverification")
jwt.Subject = resellerAdminUser
tokenSource := jwt.TokenSource(ctx)

// Create the API Service
verificationService, _ := siteverification.NewService(ctx, option.WithTokenSource(tokenSource))

// Fetch the token
req := &siteverification.SiteVerificationWebResourceGettokenRequest{
  Site: &siteverification.SiteVerificationWebResourceGettokenRequestSite{
    Type:       "INET_DOMAIN",
    Identifier: customerDomain,
  },
  VerificationMethod: "DNS_TXT",
}
res, _ := verificationService.WebResource.GetToken(req).Do()
token := res.Token
fmt.Println("Site verification token: " + token)

Java

Menggunakan impor berikut:

import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.ServiceAccountCredentials;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.siteVerification.SiteVerification;
import com.google.api.services.siteVerification.SiteVerificationScopes;
import com.google.api.services.siteVerification.model.SiteVerificationWebResourceGettokenRequest;
import com.google.api.services.siteVerification.model.SiteVerificationWebResourceGettokenResponse;
import com.google.api.services.siteVerification.model.SiteVerificationWebResourceResource;
import java.io.FileInputStream;
import java.util.Arrays;

Buat klien API dan ambil token:

// Set up credentials with user impersonation
FileInputStream jsonKeyFileSteam = new FileInputStream(JSON_KEY_FILE);
GoogleCredentials credentials = ServiceAccountCredentials.fromStream(jsonKeyFileSteam)
                                    .createScoped("https://www.googleapis.com/auth/siteverification")
                                    .createDelegated(RESELLER_ADMIN_USER);

// Create the API service
SiteVerification verificationService = new SiteVerification.Builder(
    GoogleNetHttpTransport.newTrustedTransport(),
    JacksonFactory.getDefaultInstance(),
    new HttpCredentialsAdapter(credentials)).build();

// Fetch the token
SiteVerificationWebResourceGettokenRequest request =
    new SiteVerificationWebResourceGettokenRequest()
        .setVerificationMethod("DNS_TXT")
        .setSite(new SiteVerificationWebResourceGettokenRequest.Site()
            .setType("INET_DOMAIN")
            .setIdentifier(CUSTOMER_DOMAIN));
SiteVerificationWebResourceGettokenResponse response =
    verificationService.webResource().getToken(request).execute();
String token = response.getToken();
System.out.println("Site Verification token: " + token);

Node.js

Menggunakan impor berikut:

const {google} = require('googleapis');

Buat klien API dan ambil token:

// Set up credentials with user impersonation
const authJWT = new JWT({
  keyFile: jsonKeyFile,
  scopes: ['https://www.googleapis.com/auth/siteverification'],
  subject: resellerAdminUser,
});

// Create the API service
const verificationService = google.siteVerification({version: 'v1', auth: authJWT});

// Fetch the token
const { data } = await verificationService.webResource.getToken({
  requestBody: {
    site: {
      type: 'INET_DOMAIN',
      identifier: customerDomain,
    },
    verificationMethod: 'DNS_TXT',
  }
});
const token = data.token;
console.log(`Site Verification token: ${token}`);

PHP

Buat klien API dan ambil token:

// Set up credentials with user impersonation
$client = new Google_Client();
$client->setAuthConfig($JSON_KEY_FILE);
$client->setSubject($RESELLER_ADMIN_USER);
$client->setScopes('https://www.googleapis.com/auth/siteverification');

// Create the API service
$verificationService = new Google_Service_SiteVerification($client);

// Fetch the token
$request = new Google_Service_SiteVerification_SiteVerificationWebResourceGettokenRequest([
  'verificationMethod' => 'DNS_TXT',
  'site' => [
    'type' => 'INET_DOMAIN',
    'identifier' => $CUSTOMER_DOMAIN
  ]
]);
$response = $verificationService->webResource->getToken($request);
$token = $response->token;
print 'Site Verification token: ' . $token . PHP_EOL;

Python

Menggunakan impor berikut:

from google.oauth2 import service_account
from apiclient.discovery import build

Buat klien API dan ambil token:

# Set up credentials with user impersonation
credentials = service_account.Credentials.from_service_account_file(
    JSON_KEY_FILE, scopes=["https://www.googleapis.com/auth/siteverification"])
credentials_delegated = credentials.with_subject(RESELLER_ADMIN_USER)

# Create the API service
verification_service = build(serviceName="siteVerification", version="v1",
    credentials=credentials_delegated)

# Fetch the token
response = verification_service.webResource().getToken(
  body={
    "site": {
      "type": "INET_DOMAIN",
      "identifier": CUSTOMER_DOMAIN
    },
    "verificationMethod": "DNS_TXT"
  }).execute()
token = response["token"]
print("Site Verification token: " + token)

Langkah 3: Tempatkan token verifikasi

Tulis kode untuk menambahkan token sebagai data TXT di data DNS domain pelanggan.

Untuk domain baru, inilah saat yang tepat untuk menyiapkan data MX yang diperlukan untuk Gmail.

Langkah 4: Picu verifikasi domain

Setelah token ditempatkan sebagai data TXT, Anda dapat memanggil Site Verification API untuk memicu verifikasi. Hal ini dilakukan dengan memanggil webResource.insert().

Panggilan akan gagal dengan error 400 jika token yang diharapkan tidak ditemukan. Anda dapat menerapkan strategi percobaan ulang backoff eksponensial hingga panggilan berhasil menggantikan penundaan propagasi DNS.

Jika panggilan tidak ditampilkan tanpa error, Site Verification API akan mempertimbangkan domain untuk diverifikasi, dan semua email di kolom owners pada webResource adalah pemilik terverifikasi.

Mungkin perlu waktu sekitar 3 jam agar status verifikasi diterapkan ke akun Google Workspace pelanggan Anda. Anda dapat memaksa status agar diterapkan secara instan dengan menyetel admin pelanggan (yang dibuat saat Anda memanggil provisionCloudIdentity) sebagai owner dari webResource.

C#

// Set the customer's admin user as an owner to make sure the domain
// verification status is instantly propagated to the Workspace account
string[] owners = { "admin@" + customerDomain };

var resource = new SiteVerificationWebResourceResource {
  Site = new SiteVerificationWebResourceResource.SiteData {
    Type = "INET_DOMAIN",
    Identifier = customerDomain
  },
  Owners = owners
};

resource = verificationService.WebResource.Insert(resource, "DNS_TXT").Execute();
Console.WriteLine("=== Domain has been verified");

Go

// Set the customer's admin user as an owner to make sure the domain
// verification status is instantly propagated to the Workspace account
resource := &siteverification.SiteVerificationWebResourceResource{
  Site: &siteverification.SiteVerificationWebResourceResourceSite{
    Type:       "INET_DOMAIN",
    Identifier: customerDomain,
  },
  Owners: []string{"admin@" + customerDomain},
}
resource, err := verificationService.WebResource.Insert("DNS_TXT", resource).Do()
if err != nil {
  fmt.Println(err)
} else {
  fmt.Println("=== Domain has been verified")
}

Java

// Set the customer's admin user as an owner to make sure the domain
// verification status is instantly propagated to the Workspace account
SiteVerificationWebResourceResource resource =
    new SiteVerificationWebResourceResource()
        .setSite(new SiteVerificationWebResourceResource.Site()
            .setIdentifier(CUSTOMER_DOMAIN)
            .setType("INET_DOMAIN"))
        .setOwners(Arrays.asList("admin@" + CUSTOMER_DOMAIN));

resource = verificationService.webResource().insert("DNS_TXT", resource).execute();
System.out.println("=== Domain has been verified");

Node.js

// Set the customer's admin user as an owner to make sure the domain
// verification status is instantly propagated to the Workspace account
await verificationService.webResource.insert({
  verificationMethod: 'DNS_TXT',
  requestBody: {
    site: {
      type: 'INET_DOMAIN',
      identifier: customerDomain,
    },
    owners: [`admin@${customerDomain}`],
  }
});
console.log('=== Domain has been verified');

PHP

// Set the customer's admin user as an owner to make sure the domain
// verification status is instantly propagated to the Workspace account
$resource = new Google_Service_SiteVerification_SiteVerificationWebResourceResource([
  'site' => [
    'type' => 'INET_DOMAIN',
    'identifier' => $CUSTOMER_DOMAIN,
  ],
  'owners' => ['admin@' . $CUSTOMER_DOMAIN]
]);

$resource = $verificationService->webResource->insert('DNS_TXT', $resource);
print '=== Domain has been verified' . PHP_EOL;

Python

# Set the customer's admin user as an owner to make sure the domain
# verification status is instantly propagated to the Workspace account
resource = verification_service.webResource().insert(
  verificationMethod="DNS_TXT",
  body={
    "site": {
      "type": "INET_DOMAIN",
      "identifier": CUSTOMER_DOMAIN
    },
    "owners": ["admin@" + CUSTOMER_DOMAIN]
  }).execute()
print("=== Domain has been verified")