Configuración de la autenticación SDK
La Autenticación del SDK te permite proporcionar una prueba criptográfica (generada en el servidor) a las solicitudes del SDK realizadas en nombre de usuarios que han iniciado sesión.
Cómo funciona
Después de habilitar esta característica en tu aplicación, puedes configurar el panel de Braze para que rechace cualquier solicitud con una firma JSON Web Token (JWT) no válida o que falte, lo que incluye:
- Envío de eventos personalizados, atributos, compras y datos de sesión
- Crear nuevos usuarios en tu espacio de trabajo Braze
- Actualización de los atributos estándar del perfil de usuario
- Recibir o desencadenar mensajes
Ahora puedes impedir que los usuarios no autentificados que hayan iniciado sesión utilicen la clave de API de SDK de tu aplicación para realizar acciones maliciosas, como suplantar la identidad de otros usuarios.
Configuración de la autenticación
Paso 1: Configura tu servidor
Paso 1.1: Generar un par de claves pública/privada
Genera un par de claves públicas/privadas RSA256. La clave pública se añadirá finalmente al panel de Braze, mientras que la clave privada debe almacenarse de forma segura en tu servidor.
Recomendamos usar una clave RSA con 2048 bits con el algoritmo RS256 JWT.
Recuerda mantener la privacidad de tus claves privadas. Nunca expongas o codifiques tu clave privada en tu aplicación o sitio web. Cualquiera que conozca tu clave privada puede suplantar o crear usuarios en nombre de tu aplicación.
Paso 1.2: Crear un Token Web JSON para el usuario actual
Una vez que tengas tu clave privada, tu aplicación del lado del servidor debe utilizarla para devolver un JWT a tu aplicación o sitio web para el usuario conectado en ese momento.
Normalmente, esta lógica podría ir allí donde tu aplicación solicitaría normalmente el perfil del usuario actual; como un punto final de inicio de sesión o donde tu aplicación actualice el perfil del usuario actual.
Al generar el JWT, se esperan los siguientes campos:
Encabezado JWT
Campo | Obligatoria | Descripción |
---|---|---|
alg |
Sí | El algoritmo admitido es RS256 . |
typ |
Sí | El tipo debe ser igual a JWT . |
Carga útil JWT
Campo | Obligatoria | Descripción |
---|---|---|
sub |
Sí | El “asunto” debe ser igual al ID de usuario que proporcionas al SDK de Braze cuando llamas a changeUser |
exp |
Sí | La “caducidad” de cuándo quieres que caduque este token. |
Para saber más sobre los tokens Web JSON, o para echar un vistazo a las muchas bibliotecas de código abierto que simplifican este proceso de firma, consulta https://jwt.io.
Paso 2: Configura el SDK
Esta característica está disponible a partir de las siguientes versiones del SDK:
Para las integraciones de iOS, en esta página se detallan los pasos para el SDK Swift de Braze. Para ver ejemplos de uso en el SDK heredado de AppboyKit para iOS, consulta este archivo y este archivo.
Paso 2.1: Habilita la autenticación en el SDK de Braze.
Cuando esta característica está habilitada, el SDK de Braze añadirá el último JWT conocido del usuario actual a las solicitudes de red realizadas a los servidores Braze.
No te preocupes, inicializar sólo con esta opción no afectará a la recopilación de datos en modo alguno, hasta que empieces a aplicar la autenticación dentro del panel Braze.
Cuando llames a initialize
, establece la propiedad opcional enableSdkAuthentication
en true
.
1
2
3
4
5
import * as braze from"@braze/web-sdk";
braze.initialize("YOUR-API-KEY-HERE", {
baseUrl: "YOUR-SDK-ENDPOINT-HERE",
enableSdkAuthentication: true,
});
Cuando configures la instancia de Appboy, llama a setIsSdkAuthenticationEnabled
a true
.
1
2
3
BrazeConfig.Builder brazeConfigBuilder = new BrazeConfig.Builder()
.setIsSdkAuthenticationEnabled(true);
Braze.configure(this, brazeConfigBuilder.build());
Alternativamente, puedes añadir <bool name="com_braze_sdk_authentication_enabled">true</bool>
a tu braze.xml.
Cuando configures la instancia de Appboy, llama a setIsSdkAuthenticationEnabled
a true
.
1
2
3
BrazeConfig.Builder brazeConfigBuilder = BrazeConfig.Builder()
.setIsSdkAuthenticationEnabled(true)
Braze.configure(this, brazeConfigBuilder.build())
Alternativamente, puedes añadir <bool name="com_braze_sdk_authentication_enabled">true</bool>
a tu braze.xml.
Para habilitar la Autenticación SDK, establece la propiedad configuration.api.sdkAuthentication
de tu objeto BRZConfiguration
en YES
antes de inicializar la instancia de Braze:
1
2
3
4
5
6
BRZConfiguration *configuration =
[[BRZConfiguration alloc] initWithApiKey:@"{BRAZE_API_KEY}"
endpoint:@"{BRAZE_ENDPOINT}"];
configuration.api.sdkAuthentication = YES;
Braze *braze = [[Braze alloc] initWithConfiguration:configuration];
AppDelegate.braze = braze;
Para habilitar la Autenticación SDK, establece la propiedad configuration.api.sdkAuthentication
de tu objeto Braze.Configuration
en true
al inicializar el SDK:
1
2
3
4
5
let configuration = Braze.Configuration(apiKey: "{YOUR-BRAZE-API-KEY}",
endpoint: "{YOUR-BRAZE-ENDPOINT}")
configuration.api.sdkAuthentication = true
let braze = Braze(configuration: configuration)
AppDelegate.braze = braze
Actualmente, la autenticación del SDK debe habilitarse como parte de la inicialización del SDK en el código nativo de iOS y Android. Para habilitar la Autenticación SDK en el SDK de Flutter, sigue las integraciones para iOS y Android desde las otras pestañas. Una vez habilitada la Autenticación SDK, el resto de la característica puede integrarse en Dart.
Paso 2.2: Configura el token JWT del usuario actual
Siempre que tu aplicación llame al método Braze changeUser
, proporciona también el token JWT que se generó en el servidor.
También puedes configurar el token para que se actualice a mitad de sesión para el usuario actual.
Ten en cuenta que changeUser
solo debe invocarse cuando el ID de usuario haya cambiado realmente. No debes utilizar este método para actualizar la firma si el ID de usuario no ha cambiado.
Proporciona el token JWT al llamar a changeUser
:
1
2
import * as braze from "@braze/web-sdk";
braze.changeUser("NEW-USER-ID", "JWT-TOKEN-FROM-SERVER");
O, cuando hayas refrescado el token del usuario en mitad de la sesión:
1
2
import * as braze from"@braze/web-sdk";
braze.setSdkAuthenticationSignature("NEW-JWT-TOKEN-FROM-SERVER");
Proporciona el token JWT al llamar a appboy.changeUser
:
1
Braze.getInstance(this).changeUser("NEW-USER-ID", "JWT-TOKEN-FROM-SERVER");
O, cuando hayas refrescado el token del usuario en mitad de la sesión:
1
Braze.getInstance(this).setSdkAuthenticationSignature("NEW-JWT-TOKEN-FROM-SERVER");
Proporciona el token JWT al llamar a appboy.changeUser
:
1
Braze.getInstance(this).changeUser("NEW-USER-ID", "JWT-TOKEN-FROM-SERVER")
O, cuando hayas refrescado el token del usuario en mitad de la sesión:
1
Braze.getInstance(this).setSdkAuthenticationSignature("NEW-JWT-TOKEN-FROM-SERVER")
Proporciona el token JWT al llamar a changeUser
:
1
[AppDelegate.braze changeUser:@"userId" sdkAuthSignature:@"signature"];
O, cuando hayas refrescado el token del usuario en mitad de la sesión:
1
[AppDelegate.braze setSDKAuthenticationSignature:@"signature"];
Proporciona el token JWT al llamar a changeUser
:
1
AppDelegate.braze?.changeUser(userId: "userId", sdkAuthSignature: "signature")
O, cuando hayas refrescado el token del usuario en mitad de la sesión:
1
AppDelegate.braze?.set(sdkAuthenticationSignature: "signature")
Proporciona el token JWT al llamar a changeUser
:
1
braze.changeUser("userId", sdkAuthSignature: "signature")
O, cuando hayas refrescado el token del usuario en mitad de la sesión:
1
braze.setSdkAuthenticationSignature("signature")
Paso 2.3: Registra una función de devolución de llamada para tokens no válidos
Cuando esta característica se establece como Requerido, los siguientes escenarios harán que las solicitudes SDK sean rechazadas por Braze:
- El JWT había caducado en el momento en que lo recibió la API de Braze
- El JWT estaba vacío o faltaba
- No se ha podido verificar JWT para las claves públicas que has cargado en el panel de Braze
Puedes utilizar subscribeToSdkAuthenticationFailures
para suscribirte y recibir una notificación cuando las solicitudes del SDK fallen por uno de estos motivos. Una función de devolución de llamada contiene un objeto con la información relevante errorCode
, reason
para el error, el userId
de la solicitud (si el usuario no es anónimo), y la autenticación signature
que causó el error.
Las solicitudes fallidas se reintentarán periódicamente hasta que tu aplicación proporcione un nuevo JWT válido. Si ese usuario sigue conectado, puedes utilizar esta devolución de llamada como una oportunidad para solicitar un nuevo JWT a tu servidor y suministrar al SDK de Braze este nuevo token válido.
Estos métodos de devolución de llamada son un buen lugar para añadir tu propio servicio de seguimiento o registro de errores para controlar la frecuencia con la que se rechazan tus solicitudes Braze.
1
2
3
4
5
6
7
import * as braze from"@braze/web-sdk";
braze.subscribeToSdkAuthenticationFailures((error) => {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
const updated_jwt = await getNewTokenSomehow(error);
braze.setSdkAuthenticationSignature(updated_jwt);
});
1
2
3
4
5
6
Braze.getInstance(this).subscribeToSdkAuthenticationFailures(error -> {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the error user matches the currently logged-in user
String newToken = getNewTokenSomehow(error);
Braze.getInstance(getContext()).setSdkAuthenticationSignature(newToken);
});
1
2
3
4
5
6
Braze.getInstance(this).subscribeToSdkAuthenticationFailures({ error: BrazeSdkAuthenticationErrorEvent ->
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
val newToken: String = getNewTokenSomehow(error)
Braze.getInstance(getContext()).setSdkAuthenticationSignature(newToken)
})
1
2
3
4
5
6
7
8
9
10
11
12
Braze *braze = [[Braze alloc] initWithConfiguration:configuration];
braze.sdkAuthDelegate = delegate;
AppDelegate.braze = braze;
// Method to implement in delegate
- (void)braze:(Braze *)braze sdkAuthenticationFailedWithError:(BRZSDKAuthenticationError *)error {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
NSLog(@"Invalid SDK Authentication signature.");
NSString *newSignature = getNewSignatureSomehow(error);
[AppDelegate.braze setSDKAuthenticationSignature:newSignature];
}
1
2
3
4
5
6
7
8
9
10
11
12
let braze = Braze(configuration: configuration)
braze.sdkAuthDelegate = delegate
AppDelegate.braze = braze
// Method to implement in delegate
func braze(_ braze: Braze, sdkAuthenticationFailedWithError error: Braze.SDKAuthenticationError) {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
print("Invalid SDK Authentication signature.")
let newSignature = getNewSignatureSomehow(error)
AppDelegate.braze?.set(sdkAuthenticationSignature: newSignature)
}
1
2
3
4
5
6
7
braze.setBrazeSdkAuthenticationErrorCallback((BrazeSdkAuthenticationError error) async {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
print("Invalid SDK Authentication signature.")
let newSignature = getNewSignatureSomehow(error)
braze.setSdkAuthenticationSignature(newSignature);
});
Paso 3: Habilitar la autenticación en el panel de control
A continuación, puedes habilitar la autenticación en el panel de Braze para las aplicaciones que configuraste anteriormente.
Ten en cuenta que las solicitudes de SDK seguirán fluyendo como de costumbre sin autenticación, a menos que la configuración de Autenticación de SDK de la aplicación se establezca en Obligatorio en el panel de Braze.
Si algo va mal con tu integración (por ejemplo, tu aplicación está pasando tokens incorrectamente al SDK, o tu servidor está generando tokens no válidos), desactiva esta característica en el panel de Braze, y los datos volverán a fluir como de costumbre sin verificación.
Opciones de aplicación
En la página Administrar configuración del panel, cada aplicación tiene tres estados de Autenticación SDK que controlan cómo verifica Braze las solicitudes.
Configuración | Descripción |
---|---|
Deshabilitada | Braze no verificará el JWT suministrado para un usuario. (Configuración predeterminada) |
Opcional | Braze verificará las solicitudes de los usuarios registrados, pero no rechazará las solicitudes no válidas. |
Obligatoria | Braze verificará las solicitudes de los usuarios registrados y rechazará los JWT no válidos. |
La configuración Opcional es una forma útil de controlar el impacto potencial que esta característica tendrá en el tráfico SDK de tu aplicación.
Las firmas JWT no válidas se notificarán tanto en el estado Opcional como en el Requerido, aunque sólo el estado Requerido rechazará las solicitudes SDK haciendo que las aplicaciones vuelvan a intentarlo y soliciten nuevas firmas.
Administrador de claves públicas
Añadir una clave pública
Puedes añadir hasta tres claves públicas para cada aplicación: una principal, una secundaria y una terciaria. También puedes añadir la misma clave a más de una aplicación si es necesario. Para añadir una clave pública:
- Ve al panel de Braze y selecciona Configuración > Configuración de la aplicación .
- Elige una aplicación de tu lista de aplicaciones disponibles.
- En Autenticación SDK, selecciona Añadir clave pública.
- Introduce una descripción opcional, pega tu clave pública y selecciona Añadir clave pública.
Asignar una nueva clave primaria
Para asignar una clave secundaria o terciaria como nueva clave primaria:
- Ve al panel de Braze y selecciona Configuración > Configuración de la aplicación .
- Elige una aplicación de tu lista de aplicaciones disponibles.
- En Autenticación SDK, elige una clave y selecciona Gestionar > Convertir en clave principal.
Borrar una clave
Para eliminar una clave primaria, asigna primero una nueva primaria y luego elimina tu clave. Para borrar una clave no primaria:
- Ve al panel de Braze y selecciona Configuración > Configuración de la aplicación .
- Elige una aplicación de tu lista de aplicaciones disponibles.
- En Autenticación SDK, elige una clave no primaria y selecciona Gestionar > Eliminar clave pública.
Análisis
Cada aplicación mostrará un desglose de los errores de Autenticación SDK recopilados mientras esta característica está en estado Opcional y Obligatorio.
Los datos están disponibles en tiempo real, y puedes pasar el ratón por encima de los puntos del gráfico para ver un desglose de los errores de una fecha determinada.
Códigos de error
Código de error | Motivo del error | Descripción |
---|---|---|
10 | EXPIRATION_REQUIRED |
La caducidad es un campo obligatorio para el uso de Braze. |
20 | DECODING_ERROR |
Clave pública no coincidente o error general no detectado. |
21 | SUBJECT_MISMATCH |
Los sujetos esperados y los reales no son los mismos. |
22 | EXPIRED |
El token proporcionado ha caducado. |
23 | INVALID_PAYLOAD |
La carga útil del token no es válida. |
24 | INCORRECT_ALGORITHM |
No se admite el algoritmo del token. |
25 | PUBLIC_KEY_ERROR |
No se ha podido convertir la clave pública al formato adecuado. |
26 | MISSING_TOKEN |
No se ha proporcionado ningún token en la solicitud. |
27 | NO_MATCHING_PUBLIC_KEYS |
Ninguna clave pública coincide con el token proporcionado. |
28 | PAYLOAD_USER_ID_MISMATCH |
No todos los ID de usuario de la carga útil de la solicitud coinciden como es debido. |
Preguntas más frecuentes (FAQ)
¿Es necesario habilitar esta característica en todas mis aplicaciones al mismo tiempo?
No, esta característica puede habilitarse para aplicaciones concretas y no es necesario utilizarla en todas tus aplicaciones a la vez.
¿Qué ocurre con los usuarios que siguen utilizando versiones anteriores de mi aplicación?
Cuando empieces a aplicar esta característica, las solicitudes realizadas por versiones anteriores de la aplicación serán rechazadas por Braze y reintentadas por el SDK. Después de que los usuarios actualicen su aplicación a una versión compatible, esas solicitudes en cola empezarán a aceptarse de nuevo.
Si es posible, debes empujar a los usuarios a actualizarse como harías con cualquier otra actualización obligatoria. Alternativamente, puedes mantener la característica Opcional hasta que veas que un porcentaje aceptable de usuarios se ha actualizado.
¿Qué caducidad debo utilizar al generar tokens JWT?
Te recomendamos que utilices el valor más alto de la duración media de la sesión, la caducidad de la cookie/token de sesión o la frecuencia con la que tu aplicación actualizaría el perfil del usuario actual.
¿Qué ocurre si un JWT caduca en mitad de la sesión de un usuario?
Si el token de un usuario caduca a mitad de sesión, el SDK tiene una función de devolución de llamada que invocará para informar a tu aplicación de que se necesita un nuevo token JWT para seguir enviando datos a Braze.
¿Qué ocurre si mi integración en servidor se rompe y ya no puedo crear un JWT?
Si tu servidor no puede proporcionar tokens JWT o detectas algún problema de integración, siempre puedes desactivar la característica en el panel de Braze.
Una vez desactivado, el SDK reintentará cualquier solicitud fallida pendiente, y Braze la aceptará.
¿Por qué esta característica utiliza claves públicas/privadas en lugar de secretos compartidos?
Al utilizar secretos compartidos, cualquiera con acceso a ese secreto compartido, como la página del panel de Braze, podría generar tokens y suplantar la identidad de tus usuarios finales.
En su lugar, utilizamos claves públicas/privadas para que ni siquiera los Empleados de Braze (y mucho menos los usuarios de tu panel) tengan acceso a tus claves privadas.
¿Cómo se reintentarán las solicitudes rechazadas?
Cuando se rechaza una solicitud debido a un error de autenticación, el SDK invocará su devolución de llamada utilizada para actualizar la firma JWT del usuario.
Las solicitudes se reintentarán periódicamente utilizando un método de retirada exponencial. Después de 50 intentos fallidos consecutivos, los reintentos se pausarán hasta el siguiente inicio de sesión. Cada SDK también tiene un método para solicitar manualmente una descarga de datos.