¿Por qué automatizar la verificación de dominios?
Aunque la API Cloud Channel te permite aprovisionar derechos de Google Workspace a gran escala, el cliente debe realizar las siguientes acciones para habilitar los servicios.
- Aceptar los Términos del Servicio
- Verificar la propiedad del dominio
- Configurar los registros MX
Los clientes que se creen recientemente deberán seguir un proceso guiado de requisitos cuando accedan a la consola de administración (en admin.google.com) por primera vez.
Si tienes acceso programático a los registros DNS del dominio (por ejemplo, si has revendido el dominio al cliente), puedes automatizar los pasos 2 y 3 para aumentar las tasas de activación, ya que normalmente requieren conocimientos técnicos por parte del cliente al que se le ha revendido el dominio.
En este codelab se explica cómo usar la API Site Verification para implementar esta automatización.
Antes de empezar
Completa el codelab de configuración de la API para configurar un proyectoGoogle Cloud y crear una cuenta de servicio para llamar a la API Cloud Channel.
Consulta información sobre las operaciones de Channel Services.
Te recomendamos que uses tu consola de Partner Sales de prueba para este codelab.
Este codelab también espera que termines el codelab completo de aprovisionamiento del espacio de trabajo.
Información general
Para verificar el dominio de la autorización de Google Workspace, se deben hacer varias llamadas a la API.
La API Site Verification no es específica para revendedores. La verificación de dominio es una señal que se usa en varios productos de Google (Search Console, Google Ads, etc.). El proceso que se describe aquí se basa en asignar el rol de superadministrador del dominio de tu distribuidor como "propietario" del dominio y el rol de administrador como copropietario al primer administrador de tu cliente. Puede consultar más información sobre estos conceptos en la página Empezar a usar la API Site Verification.
Paso 1: Prepararse para la API Site Verification
- Ve a la sección Biblioteca de APIs de la Google Cloud consola y habilita la API Site Verification.
- Ve a la página Delegación en todo el dominio con la cuenta de superadministrador de tu dominio de distribuidor.
- En la fila de tu cuenta de servicio, haz clic en Editar.
- Introduce
https://www.googleapis.com/auth/siteverification
en el campo Permisos de OAuth. - Haz clic en Autorizar.
- Instala la biblioteca de cliente de la API Site Verification.
Paso 2: Obtener el token de verificación
En este codelab, nos centraremos en la forma más habitual de verificar un dominio: mediante TXT
registros DNS. La API Site Verification admite otros métodos de verificación.
Para obtener el token que colocarás como registro TXT
, debes obtener tokens para type=INET_DOMAIN
y verificationMethod=DNS_TXT
.
En el siguiente código, rellena estas variables con tu información.
jsonKeyFile
: Ruta al archivo JSON de la clave generada al crear una cuenta de servicio.resellerAdminUser
: La dirección de correo electrónico del superadministrador de un dominio de distribuidor.customerDomain
: el dominio del cliente final. Si ejecutas este codelab en tu consola de Partner Sales de prueba, asegúrate de que el dominio siga las convenciones de nomenclatura de dominios.
C#
Con las siguientes importaciones:
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.SiteVerification.v1;
using Google.Apis.SiteVerification.v1.Data;
Crea el cliente de la API y obtén el 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
Con las siguientes importaciones:
import (
"context"
"fmt"
"os"
"golang.org/x/oauth2/google"
"google.golang.org/api/option"
"google.golang.org/api/siteverification/v1"
)
Crea el cliente de la API y obtén el 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
Con las siguientes importaciones:
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;
Crea el cliente de la API y obtén el 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
Con la siguiente importación:
const {google} = require('googleapis');
Crea el cliente de la API y obtén el 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
Crea el cliente de la API y obtén el 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
Con las siguientes importaciones:
from google.oauth2 import service_account
from apiclient.discovery import build
Crea el cliente de la API y obtén el 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)
Paso 3: Coloca el token de verificación
Escribe el código para añadir el token como un registro TXT
en los registros DNS del dominio del cliente.
Si se trata de un dominio nuevo, es un buen momento para configurar los registros MX
necesarios para Gmail.
Paso 4: Activa la verificación del dominio
Una vez que el token se haya colocado como registro TXT
, puedes llamar a la API Site Verification para activar la verificación. Para ello, llama a webResource.insert()
.
La llamada falla y devuelve un error 400 si no se encuentra el token esperado. Puedes implementar una estrategia de reintento con retroceso exponencial hasta que la llamada se realice correctamente para compensar los retrasos de propagación del DNS.
Si la llamada no devuelve ningún error, la API Site Verification considera que el dominio está verificado y que cualquier correo del campo owners
de webResource
es un propietario verificado.
El estado de verificación puede tardar unas 3 horas en propagarse a la cuenta de Google Workspace del cliente. Para forzar que el estado se propague al instante, puedes definir el administrador del cliente (creado al llamar a provisionCloudIdentity
) como owner
de 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")