Por que automatizar a verificação de domínio?
Embora a API Cloud Channel permita provisionar o direito do Google Workspace em grande escala, o cliente ainda precisa realizar as seguintes ações para ativar os serviços.
- Aceitar os Termos de Serviço
- Verificar a propriedade do domínio
- Configurar registros MX
Um cliente recém-criado vai seguir um processo de requisitos guiado ao acessar o Admin Console (em admin.google.com) pela primeira vez.
Se você tiver acesso programático aos registros DNS do domínio (por exemplo, se você tiver revendido o domínio para o cliente), poderá automatizar as etapas 2 e 3 para aumentar as taxas de ativação, já que essas etapas geralmente exigem conhecimento técnico de um cliente revendido.
Este codelab explica como usar a API Site Verification para implementar essa automação.
Antes de começar
Conclua o codelab de configuração da API para configurar um projetoGoogle Cloud e criar uma conta de serviço para chamar a API Cloud Channel.
Leia sobre as operações do Channel Services.
Recomendamos usar o Partner Sales Console de teste para este codelab.
Este codelab também espera que você tenha concluído o codelab de provisionamento de ponta a ponta do Workspace.
Visão geral
A verificação do domínio para o direito do Google Workspace envolve várias chamadas de API.
A API Site Verification não é específica para revendedores. A verificação de domínio é um indicador usado em vários produtos do Google (Search Console, Ads etc.). O processo descrito aqui depende da configuração do superadministrador do domínio do revendedor como "proprietário" do domínio e da configuração do primeiro administrador do cliente como coproprietário. Saiba mais sobre esses conceitos na página Primeiros passos com a API Site Verification.
Etapa 1: se preparar para a API Site Verification
- Acesse a seção Biblioteca de APIs no Google Cloud console e ative a API Site Verification.
- Acesse a
página de delegação em todo o domínio
usando a conta de superadmin do domínio do revendedor.
- Na linha com sua conta de serviço, clique em Editar.
- Insira
https://www.googleapis.com/auth/siteverification
no campo Escopos do OAuth. - Clique em Autorizar.
- Instale a biblioteca de cliente da API Site Verification.
Etapa 2: receber o token de verificação
Este codelab vai se concentrar na maneira mais comum de verificar um domínio: usando registros DNS TXT
. A API Site Verification oferece suporte a
outros métodos de verificação.
Para extrair o token que você vai colocar como um registro TXT
, é necessário
receber tokens para type=INET_DOMAIN
e verificationMethod=DNS_TXT
.
No código abaixo, preencha essas variáveis com suas informações.
jsonKeyFile
: o caminho para o arquivo de chave JSON gerado quando você criou uma conta de serviço.resellerAdminUser
: o endereço de e-mail de um superadministrador de domínio de revendedor.customerDomain
: o domínio do cliente final. Se você executar este codelab no Partner Sales Console de teste, verifique se o domínio segue as convenções de nomeação de domínio.
C#
Usando as seguintes importações:
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.SiteVerification.v1;
using Google.Apis.SiteVerification.v1.Data;
Crie o cliente da API e extraia o 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
Usando as seguintes importações:
import (
"context"
"fmt"
"os"
"golang.org/x/oauth2/google"
"google.golang.org/api/option"
"google.golang.org/api/siteverification/v1"
)
Crie o cliente da API e extraia o 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
Usando as seguintes importações:
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;
Crie o cliente da API e extraia o 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
Usando a seguinte importação:
const {google} = require('googleapis');
Crie o cliente da API e extraia o 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
Crie o cliente da API e extraia o 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
Usando as seguintes importações:
from google.oauth2 import service_account
from apiclient.discovery import build
Crie o cliente da API e extraia o 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)
Etapa 3: colocar o token de verificação
Escreva o código para adicionar o token como um registro TXT
nos registros DNS do domínio do cliente.
Para novos domínios, é uma ótima oportunidade de configurar
os registros MX
necessários
para o Gmail.
Etapa 4: acionar a verificação de domínio
Depois que o token for colocado como um registro TXT
, você poderá chamar a
API Site Verification para acionar a verificação. Para isso, chame
webResource.insert()
.
A chamada falha com um erro 400 se o token esperado não for encontrado. É possível implementar uma estratégia de repetição de espera exponencial até que a chamada seja bem-sucedida para compensar os atrasos na propagação do DNS.
Se a chamada retornar sem erros, a API de verificação de site vai considerar
que o domínio foi verificado, e todos os e-mails no campo owners
do
webResource
serão considerados proprietários verificados.
Pode levar cerca de três horas para que o status de verificação seja propagado
para a conta do Google Workspace do cliente. É possível forçar a propagação do status
instantaneamente definindo o administrador do cliente (criado quando você chamou
provisionCloudIdentity
)
como um owner
do 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")