Descripción general

Iniciar sesión a través de la interfaz de usuario de su aplicación al comienzo de cada prueba de aplicación móvil añade duración e inestabilidad no relacionadas con la prueba. Esta guía muestra cómo omitir ese paso de inicio de sesión inyectando un token de autenticación activo para que la prueba comience ya autenticada.

El flujo tiene tres partes:

  1. Una prueba de API inicia sesión en su proveedor de autenticación según un horario y extrae un token de acceso.
  2. Una variable global que tiene como fuente esa prueba contiene el valor del token.
  3. Su prueba de aplicación móvil pasa la variable global a la aplicación como un argumento de inicio o un extra de intent. Su aplicación lo lee al iniciarse y omite su flujo de inicio de sesión normal.

Debido a que la prueba de API actualiza el token según un horario, el valor de la variable global se actualiza por sí solo, sin ningún trabajo manual ni llamadas a la API de Datadog.

Paso 1: Cree la prueba de API de obtención de tokens

Si su proveedor de autenticación requiere un secreto de cliente, guárdelo primero como una variable global segura, en lugar de codificarlo de forma rígida en la solicitud. Ingrese un nombre como AUTH_CLIENT_SECRET y seleccione Hide and obfuscate variable value cuando la cree.

Cree una prueba HTTP que solicite un token al punto de conexión de tokens de su proveedor:

  • Solicitud: POST a su punto de conexión de tokens, como https://auth.yourdomain.com/oauth/token.
  • Encabezado: Content-Type: application/json.
  • Cuerpo: una carga útil JSON con sus credenciales de cliente, haciendo referencia a la variable global AUTH_CLIENT_SECRET:
{
  "client_id": "synthetic_bot",
  "client_secret": "{{ AUTH_CLIENT_SECRET }}",
  "grant_type": "client_credentials"
}
  • Aserción: el código de estado es 200.
  • Variable extraída: extraiga una variable llamada EXTRACTED_TOKEN del cuerpo de la respuesta, utilizando una expresión jsonpath que coincida con su campo de token, como $.access_token. Seleccione Hide and obfuscate variable value para que el token no aparezca en los resultados de la prueba.

Establezca la frecuencia de la prueba en un tiempo menor al de la ventana de expiración de su token, para que el token no caduque entre ejecuciones. Por ejemplo, ejecute la prueba cada 30 minutos para un token que expira después de una hora. También puede adjuntar una alerta a la prueba para saber si deja de actualizar el token.

Paso 2: Cree una variable global a partir de la prueba

Cree una variable global a partir de la prueba de obtención de token para que su prueba de aplicación móvil pueda hacer referencia a su valor:

  1. Navegue a la pestaña Global Variables en la página Settings. Haga clic en + New Global Variable.
  2. Seleccione la pestaña Create From Test y seleccione su prueba de obtención de token.
  3. Ingrese un Variable Name, como MOBILE_AUTH_TOKEN.
  4. Seleccione Hide and obfuscate variable value para que el token no aparezca en los resultados de la prueba.
  5. Seleccione de dónde recopilar el valor:
    • Si su prueba de obtención de token es una única solicitud HTTP, seleccione Response Body y reutilice la expresión jsonpath de su aserción de prueba, por ejemplo $.access_token.
    • Si su prueba de obtención de token tiene varios pasos, seleccione la variable local EXTRACTED_TOKEN que extrajo en el Paso 1.

El valor de esta variable se actualiza automáticamente cada vez que se ejecuta la prueba de obtención de token.

Paso 3: Pase el token a su prueba de aplicación móvil

Las pruebas de aplicaciones móviles admiten el paso de pares key:value a su aplicación al iniciar a través de opciones avanzadas. Haga referencia a su variable global escribiendo “{{` en el campo, por lo que su valor actual se sustituye en tiempo de ejecución:

{
  "auth_token": "{{ MOBILE_AUTH_TOKEN }}"
}
Página de creación de pruebas de aplicaciones móviles, que muestra un ejemplo de una opción avanzada para un dispositivo Android.
{
  "auth_token": "{{ MOBILE_AUTH_TOKEN }}"
}
Página de creación de pruebas de aplicaciones móviles, que muestra un ejemplo de una opción avanzada para un dispositivo iOS.

Paso 4: Maneje el token en su aplicación

Su aplicación debe leer el valor inyectado al inicio, almacenarlo de forma segura y usarlo para omitir su flujo de inicio de sesión. Proteja este comportamiento detrás de una bandera de compilación para que la ruta del código solo exista en sus compilaciones de prueba o automatización.

if (BuildConfig.AUTOMATION) {
    String authToken = getIntent().getStringExtra("auth_token");
    if (authToken != null) {
        SecureTokenStore.getInstance(this).save(authToken);
        SessionManager.getInstance().restoreSession(authToken);
    }
}

Respalde SecureTokenStore con EncryptedSharedPreferences y un MasterKey, en lugar de almacenar el token en SharedPreferences sin formato.

#if AUTOMATION
if let index = ProcessInfo.processInfo.arguments.firstIndex(of: "-auth_token"),
   index + 1 < ProcessInfo.processInfo.arguments.count {
    let authToken = ProcessInfo.processInfo.arguments[index + 1]
    KeychainManager.shared.save(token: authToken)
    SessionManager.shared.restoreSession(with: authToken)
}
#endif

Almacene el token en el Keychain en lugar de UserDefaults, para que esté protegido en reposo como un token que su aplicación recibe de un inicio de sesión real.

import { LaunchArguments } from 'react-native-launch-arguments';
import * as Keychain from 'react-native-keychain';

if (__DEV__ || Config.AUTOMATION) {
  const { auth_token: authToken } = LaunchArguments.value();
  if (authToken) {
    await Keychain.setGenericPassword('auth_token', authToken);
    SessionManager.restoreSession(authToken);
  }
}

react-native-launch-arguments lee los argumentos de proceso en iOS y los extras de intent en Android a través de una API. react-native-keychain almacena el token en el Keychain o Keystore de la plataforma en lugar de AsyncStorage.

Security considerations

Aceptar un token de autenticación inyectado solo en compilaciones de prueba o automatización, nunca en producción. Verifique un flag de compilación antes de leer el argumento, y asegúrese de que dicho flag no esté configurado en las compilaciones que se envían a las tiendas de aplicaciones.

Esto es lo más importante en Android. Un extra de intent enviado a un Activity de inicio exportado puede provenir de cualquier aplicación en el dispositivo, no solo del runner de prueba de Datadog. Sin una verificación de flag de compilación, una aplicación de producción que lee y confía en auth_token desde su intent de inicio permite que cualquier aplicación local se autentique como la cuenta de prueba.

Lecturas adicionales