Codelab: Mengotomatiskan verifikasi domain untuk Google Workspace

Mengapa harus mengotomatiskan verifikasi domain?

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

  1. Setujui Persyaratan Layanan
  2. Verifikasi 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 Anda memiliki akses terprogram ke data DNS domain (misalnya, jika Anda menjual kembali domain ke pelanggan), Anda dapat mengotomatiskan langkah 2 dan 3 untuk meningkatkan rasio aktivasi karena langkah tersebut biasanya memerlukan pengetahuan teknis dari pelanggan yang dijual kembali.

Codelab ini menjelaskan cara menggunakan API Verifikasi Situs 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 tentang operasi Layanan Saluran.

  • Sebaiknya gunakan Konsol Layanan Saluran Uji Coba untuk codelab ini.

Codelab ini juga mengharapkan Anda telah menyelesaikan codelab penyediaan end-to-end Workspace.

Ringkasan

Memverifikasi domain untuk kepemilikan Google Workspace melibatkan beberapa panggilan API.

Langkah-langkah untuk mengotomatiskan verifikasi domain

API Verifikasi Situs tidak khusus untuk pengecer. Verifikasi domain adalah sinyal yang digunakan di berbagai produk Google (konsol penelusuran, Iklan, dll.). Proses yang dijelaskan di sini bergantung pada penetapan admin super domain pengecer Anda sebagai "pemilik" domain dan menetapkan admin pertama pelanggan Anda sebagai rekan pemilik. Anda dapat mempelajari lebih lanjut konsep tersebut di laman Memulai API Verifikasi Situs.

Langkah 1: Persiapkan API Verifikasi Situs

Langkah 2: Dapatkan token verifikasi

Codelab ini akan berfokus pada cara yang paling umum untuk memverifikasi domain: menggunakan data DNS TXT. API Verifikasi Situs mendukung metode verifikasi lainnya.

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 pengecer.
  • customerDomain: Domain pelanggan akhir. Jika Anda menjalankan codelab ini di Test Channel Services Console, pastikan domain 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"
  "io/ioutil"

  "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, _ := ioutil.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 pada data DNS domain pelanggan.

Untuk domain baru, ini adalah waktu yang tepat untuk menyiapkan MX data yang diperlukan untuk Gmail.

Langkah 4: Picu verifikasi domain

Setelah token ditempatkan sebagai data TXT, Anda dapat memanggil API Verifikasi Situs untuk memicu verifikasi. Ini dicapai dengan memanggil webResource.insert().

Panggilan gagal dengan error 400 jika token yang diharapkan tidak ditemukan. Anda dapat menerapkan strategi percobaan backoff eksponensial sampai panggilan berhasil mengimbangi penundaan penyebaran DNS.

Jika panggilan kembali tanpa kesalahan, API Verifikasi Situs menganggap domain tersebut telah diverifikasi, dan setiap email di bidang owners pada webResource adalah pemilik terverifikasi.

Diperlukan waktu sekitar 3 jam agar status verifikasi diterapkan ke akun Google Workspace pelanggan Anda. Anda dapat memaksa status untuk disebarkan secara instan dengan menetapkan admin pelanggan (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")