Guía de integración de EMM

Esta guía ayuda a los proveedores de administración de movilidad empresarial (EMM) a integrar la inscripción automática en su consola. Sigue leyendo para obtener más información sobre la inscripción y ver consejos sobre prácticas recomendadas que te ayudarán a aprovisionar dispositivos con tu DPC (controlador de políticas de dispositivos). Si tienes un DPC, conocerás las prácticas recomendadas para aprovisionar dispositivos y recibirás asesoramiento para ayudarte con el desarrollo y las pruebas.

Funciones para administradores de TI

Usa la API de clientes para ayudar a los administradores de TI a configurar la inscripción automática directamente desde tu consola. Estas son algunas tareas que un administrador de TI puede completar en tu consola:

  • Crear, editar y borrar configuraciones de inscripción automática según tus políticas para dispositivos móviles
  • Establece una configuración predeterminada para que el DPC aprovisione los dispositivos futuros que compre la organización.
  • Aplicar parámetros de configuración individuales a los dispositivos o quitarlos de la inscripción automática

Para obtener más información sobre la inscripción automática, consulta la descripción general.

Requisitos previos

Antes de agregar la inscripción sin intervención a tu consola de EMM, confirma que tu solución admite lo siguiente:

  • Tu solución de EMM debe aprovisionar un dispositivo empresarial con Android 8.0 o versiones posteriores (Pixel 7.1 o versiones posteriores) en modo completamente administrado. Los dispositivos empresariales con Android 10 o versiones posteriores se pueden aprovisionar como completamente administrados o con un perfil de trabajo.
  • Dado que la inscripción automática descarga e instala un DPC automáticamente, tu DPC debe estar disponible en Google Play. Mantenemos una lista de DPC compatibles que los administradores de TI pueden configurar con la API del cliente o el portal. Envía una solicitud de modificación del producto a través de la comunidad de proveedores de EMM para agregar tu DPC a la lista.
  • Tus clientes necesitan una cuenta de inscripción automática para llamar a la API de clientes. Un socio revendedor configura la cuenta para la organización de un administrador de TI cuando la organización compra sus dispositivos.
  • El dispositivo debe ser compatible con los Servicios de Google para dispositivos móviles (GMS), y los Servicios de Google Play deben estar habilitados en todo momento para que la inscripción automática funcione correctamente.

Llama a la API

Los usuarios de tu consola (con su Cuenta de Google) autorizan tus solicitudes a la API del cliente. Este flujo es diferente de la autorización que realizas para otras APIs de EMM. Lee Autorización para obtener información sobre cómo hacerlo en tu app.

Condiciones del Servicio de identificadores

Tus usuarios deben aceptar las Condiciones del Servicio (CdS) más recientes antes de llamar a la API. Si la llamada a la API devuelve un código de estado HTTP 403 Forbidden y el cuerpo de la respuesta contiene un TosError, solicita al usuario que acepte las C.S.A. accediendo al portal de inscripción sin intervención. En el siguiente ejemplo, se muestra una de las formas en que puedes hacerlo:

Java

// Authorize this method call as a user that hasn't yet accepted the ToS.
final String googleApiFormatHttpHeader = "X-GOOG-API-FORMAT-VERSION";
final String googleApiFormatVersion = "2";
final String tosErrorType =
      "type.googleapis.com/google.android.device.provisioning.v1.TosError";

try {
  // Send an API request to list all the DPCs available including the HTTP header
  // X-GOOG-API-FORMAT-VERSION with the value 2. Import the  exception:
  // from googleapiclient.errors import HttpError
  AndroidProvisioningPartner.Customers.Dpcs.List request =
        service.customers().dpcs().list(customerAccount);
  request.getRequestHeaders().put(googleApiFormatHttpHeader, googleApiFormatVersion);
  CustomerListDpcsResponse response = request.execute();
  return response.getDpcs();

} catch (GoogleJsonResponseException e) {
  // Get the error details. In your app, check details exists first.
  ArrayList<Map> details = (ArrayList<Map>) e.getDetails().get("details");
  for (Map detail : details) {
    if (detail.get("@type").equals(tosErrorType)
          && (boolean) detail.get("latestTosAccepted") != true) {
      // Ask the user to accept the ToS. If they agree, open the portal in a browser.
      // ...
    }
  }
  return null;
}

.NET

// Authorize this method call as a user that hasn't yet accepted the ToS.
try
{
    var request = service.Customers.Dpcs.List(customerAccount);
    CustomerListDpcsResponse response = request.Execute();
    return response.Dpcs;
}
catch (GoogleApiException e)
{
    foreach (SingleError error in e.Error?.Errors)
    {
        if (error.Message.StartsWith("The user must agree the terms of service"))
        {
            // Ask the user to accept the ToS. If they agree, open the portal in a browser.
            // ...
        }
    }
}

Python

# Authorize this method call as a user that hasn't yet accepted the ToS.
tos_error_type = ('type.googleapis.com/'
                  'google.android.device.provisioning.v1.TosError')
portal_url = 'https://enterprise.google.com/android/zero-touch/customers'

# Send an API request to list all the DPCs available including the HTTP
# header X-GOOG-API-FORMAT-VERSION with the value 2. Import the exception:
# from googleapiclient.errors import HttpError
try:
  request = service.customers().dpcs().list(parent=customer_account)
  request.headers['X-GOOG-API-FORMAT-VERSION'] = '2'
  response = request.execute()
  return response['dpcs']

except HttpError as err:
  # Parse the JSON content of the error. In your app, check ToS exists first.
  error = json.loads(err.content)
  tos_error = error['error']['details'][0]

  # Ask the user to accept the ToS (not shown here). If they agree, then open
  # the portal in a browser.
  if (tos_error['@type'] == tos_error_type
      and tos_error['latestTosAccepted'] is not True):
    if raw_input('Accept the ToS in the zero-touch portal? y|n ') == 'y':
      webbrowser.open(portal_url)

Si tu cliente de la API de Google admite errores detallados (solicitudes de Java, Python o HTTP), incluye el encabezado HTTP X-GOOG-API-FORMAT-VERSION con el valor 2 en tus solicitudes. Si tu cliente no admite errores detallados (.NET y otros), haz coincidir el mensaje de error.

Cuando actualicemos las Condiciones del Servicio en el futuro, si sigues este enfoque, tu app dirigirá al usuario para que vuelva a aceptar las nuevas Condiciones del Servicio.

Los administradores de TI usan el portal de inscripción automática para administrar los usuarios de su organización. No puedes ofrecer esta opción a través de la API de clientes. Los administradores de TI también pueden administrar dispositivos y configuraciones a través del portal. Si necesitas vincularte al portal desde tu consola o en tu documentación, usa esta URL:

https://enterprise.google.com/android/zero-touch/customers

Es posible que desees informar a los administradores de TI que se les solicitará que accedan con su Cuenta de Google.

Inscripción del dispositivo

La inscripción automática es un mecanismo para inscribir dispositivos y es similar a la inscripción por NFC o por código QR. Tu consola debe admitir dispositivos administrados, y tu DPC debe poder ejecutarse en el modo de dispositivo completamente administrado.

La inscripción automática está disponible en dispositivos compatibles con Android 8.0 o versiones posteriores. Los administradores de TI deben comprar dispositivos compatibles a un revendedor socio. Tu consola puede hacer un seguimiento de cuáles de los dispositivos del administrador de TI están disponibles para la inscripción automática llamando a customers.devices.list.

A continuación, se muestra un esquema de cómo funciona la inscripción:

  1. Un dispositivo se registra en un servidor de Google en el primer inicio (o después de restablecer la configuración de fábrica) para la inscripción automática.
  2. Si el administrador de TI aplicó una configuración al dispositivo, la inscripción automática ejecuta el asistente de configuración de Android para dispositivos completamente administrados y personaliza las pantallas con metadatos de la configuración.
  3. La inscripción automática descarga e instala tu DPC desde Google Play.
  4. Tu DPC recibe el intent ACTION_PROVISION_MANAGED_DEVICE y aprovisiona el dispositivo.

Si no hay conexión a Internet, la verificación se realiza cuando hay una disponible. Para obtener más información sobre el aprovisionamiento de dispositivos con la inscripción automática, consulta Aprovisionamiento a continuación.

Configuración predeterminada.

La inscripción automática es más útil para los administradores de TI cuando establecen una configuración predeterminada que se aplica a cualquier dispositivo nuevo que compre su organización. Promueve la configuración predeterminada desde la consola si no se estableció una. Puedes verificar el valor de customers.configurations.isDefault para saber si una organización estableció una configuración predeterminada.

En el siguiente ejemplo, se muestra cómo puedes establecer una configuración existente como predeterminada:

Java

// Send minimal data with the request. Just the 2 required fields.
// targetConfiguration is an existing configuration that we want to make the default.
Configuration configuration = new Configuration();
configuration.setIsDefault(true);
configuration.setConfigurationId(targetConfiguration.getConfigurationId());

// Call the API, including the FieldMask to avoid setting other fields to null.
AndroidProvisioningPartner.Customers.Configurations.Patch request = service
      .customers()
      .configurations()
      .patch(targetConfiguration.getName(), configuration);
request.setUpdateMask("isDefault");
Configuration results = request.execute();

.NET

// Send minimal data with the request. Just the 2 required fields.
// targetConfiguration is an existing configuration that we want to make the default.
Configuration configuration = new Configuration
{
    IsDefault = true,
    ConfigurationId = targetConfiguration.ConfigurationId,
};

// Call the API, including the FieldMask to avoid setting other fields to null.
var request = service.Customers.Configurations.Patch(configuration,
                                                     targetConfiguration.Name);
request.UpdateMask = "IsDefault";
Configuration results = request.Execute();

Python

# Send minimal data with the request. Just the 2 required fields.
# target_configuration is an existing configuration we'll make the default.
configuration = {
    'isDefault': True,
    'configurationId': target_configuration['configurationId']}

# Call the API, including the FieldMask to avoid setting other fields to null.
response = service.customers().configurations().patch(
    name=target_configuration['name'],
    body=configuration, updateMask='isDefault').execute()

Cómo hacer referencia a tu DPC

Te recomendamos que uses el nombre del recurso de la API customers.dpcs.name para identificar tu DPC y usarlo en las configuraciones. El nombre del recurso contiene un identificador único e invariable para el DPC. Llama a customers.dpcs.list para obtener la lista de todos los DPC compatibles. Dado que el nombre del recurso también incluye el ID de cliente, filtra la lista con el último componente de la ruta de acceso para encontrar una instancia de Dpc coincidente. En el siguiente ejemplo, se muestra cómo hacer coincidir tu DPC y conservarlo para usarlo más adelante en una configuración:

Java

// Return a customer Dpc instance for the specified DPC ID.
String myDpcIdentifier = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...xMSWCiYiuHRWeBbu86Yjq";
final int dpcIdIndex = 3;
final String dpcComponentSeparator = "/";
// ...
for (Dpc dpcApp : dpcs) {
    // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the
    // fourth component matches the DPC ID.
    String dpcId = dpcApp.getName().split(dpcComponentSeparator)[dpcIdIndex];
    if (dpcId.equals(myDpcIdentifier)) {
        System.out.format("My DPC is: %s\n", dpcApp.getDpcName());
        return dpcApp;
    }
}
// Handle the case when the DPC isn't found...

.NET

// Return a customer Dpc instance for the specified DPC ID.
var myDpcIdentifer = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...fE9WdHcxMSWCiYiuHRWeBbu86Yjq";
const int dpcIdIndex = 3;
const String dpcComponentSeparator = "/";
// ...
foreach (Dpc dpcApp in dpcs)
{
    // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the
    // fourth component matches the DPC ID.
    String dpcId = dpcApp.Name.Split(dpcComponentSeparator)[dpcIdIndex];
    if (dpcId.Equals(myDpcIdentifer))
    {
        Console.WriteLine("Matched DPC is: {0}", dpcApp.DpcName);
        return dpcApp;
    }
}
// Handle the case when the DPC isn't found...

Python

# Return a customer Dpc instance for the specified DPC ID.
my_dpc_id = 'AH6Gbe4aiS459wlz58L30cqb...fE9WdHcxMSWCiYiuHRWeBbu86Yjq'
# ...
for dpc_app in dpcs:
  # Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID},
  # check the fourth component matches the DPC ID.
  dpc_id = dpc_app['name'].split('/')[3]
  if dpc_id == my_dpc_id:
    return dpc_app

# Handle the case when the DPC isn't found...

Si necesitas mostrar el nombre de un DPC en la interfaz de usuario de tu consola, muestra el valor que se devuelve de customers.dpcs.dpcName.

Aprovisionamiento

Aprovecha la oportunidad para brindar una excelente experiencia del usuario en el aprovisionamiento de dispositivos. Un nombre de usuario y una contraseña deberían ser suficientes para aprovisionar el dispositivo. Recuerda que los revendedores pueden enviar dispositivos directamente a los usuarios remotos. Incluye todos los demás parámetros de configuración, como el servidor de EMM o la unidad organizacional, en customers.configuration.dpcExtras.

En el siguiente fragmento de código JSON, se muestra parte de un ejemplo de configuración:

{
  "android.app.extra.PROVISIONING_LOCALE": "en_GB",
  "android.app.extra.PROVISIONING_TIME_ZONE": "Europe/London",
  "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED": true,
  "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE": {
    "workflow_type": 3,
    "default_password_quality": 327680,
    "default_min_password_length": 6,
    "company_name": "XYZ Corp",
    "organizational_unit": "sales-uk",
    "management_server": "emm.example.com",
    "detail_tos_url": "https://www.example.com/policies/terms/",
    "allowed_user_domains": "[\"example.com\", \"example.org\", \"example.net\"]"
    }
}

La inscripción automática instala y lanza tu DPC con un intent de Android. El sistema envía los valores en la propiedad android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE de JSON a tu DPC como elementos adicionales en la intención. Tu DPC puede leer la configuración de aprovisionamiento desde PersistableBundle con las mismas claves.

Recomendado: Usa los siguientes elementos adicionales de intents para configurar tu DPC:

No se recomienda: No incluyas los siguientes elementos adicionales que podrías usar en otros métodos de inscripción:

Para obtener información sobre cómo extraer y usar estos parámetros de configuración en tu DPC, consulta Aprovisiona dispositivos de clientes.

Desarrollo y pruebas

Para desarrollar y probar las funciones de inscripción automática de tu consola, necesitarás lo siguiente:

  • un dispositivo compatible
  • Una cuenta de inscripción automática para clientes

Desarrolla y prueba con dispositivos que admitan la inscripción automática, como el Google Pixel. No es necesario que compres tus dispositivos de desarrollo a un socio revendedor.

Comunícate con nosotros para obtener una cuenta de cliente de prueba y acceder al portal de inscripción automática. Envíanos un correo electrónico desde tu dirección de correo electrónico corporativa asociada a una Cuenta de Google. Indícanos el fabricante y el número de IMEI de uno o dos dispositivos, y los agregaremos a tu cuenta de desarrollador.

Recuerda que, debido a que la inscripción sin intervención descarga e instala automáticamente un DPC, este debe estar disponible en Google Play antes de que puedas probar el aprovisionamiento. No puedes realizar pruebas con una versión de desarrollo de tu DPC.

Asistencia para administradores de TI

Si necesitas ayudar a los administradores de TI en la interfaz de la consola o en la documentación, consulta la Inscripción sin intervención para administradores de TI para obtener orientación. También puedes dirigir a los usuarios de la consola a ese artículo del Centro de ayuda.

Lecturas adicionales

Lee estos documentos para integrar la inscripción automática en tu consola: