Previene la suplantación de usuarios requiriendo JWTs generados en el servidor para verificar IDs de Usuario Externos, correos electrónicos y suscripciones de SMS enviados a OneSignal.
OneSignal ofrece una función de seguridad mejorada llamada Verificación de Identidad para ayudar a prevenir la suplantación de usuarios. Esta función utiliza JSON Web Tokens, o JWTs, generados de forma segura en tu servidor. Para verificar la información de suscripción, estos tokens se pasan a tu aplicación y a la API de OneSignal.Habilita la Verificación de Identidad para proteger:
Iniciar sesión de usuarios
Agregar suscripciones de correo electrónico
Agregar suscripciones de SMS
Modificar identidades de usuarios
La Verificación de Identidad está actualmente en beta. Contacta a support@onesignal.com para habilitarla en tu cuenta. Una vez que el soporte la habilite, la activas en tu panel (ver Paso 5).
Inicia sesión en tu cuenta de OneSignal y navega a Configuración > Claves e IDs > Verificación de Identidad.
Configuración de Verificación de Identidad
Haz clic en Generar Nuevas Claves para crear un nuevo par de claves.
Creación de nuevo par de claves
Descarga el archivo PEM o copia la clave privada, asegurándote de almacenar la clave privada de forma segura.
Par de claves de Verificación de Identidad
Siempre almacena tus claves privadas en un entorno seguro, como un sistema de gestión de claves. Nunca expongas claves privadas en código del lado del cliente, repositorios públicos o registros.
2
Generar JWT de verificación en tu backend
La verificación de identidad requiere autenticar al usuario final con tu servidor de autenticación antes de iniciar sesión en OneSignal. Cuando el usuario final se autentica con tu backend, genera el token e inclúyelo en la respuesta de autenticación al dispositivo. Si tu aplicación no ejecuta un servidor backend, considera configurar un servidor ligero para verificar usuarios y generar estos tokens.
Firma el JWT usando el algoritmo ES256. Asegúrate de que tu backend esté configurado para usar este método de firma para evitar problemas de verificación al enviar el JWT a OneSignal. Recomendamos una Biblioteca JWT para hacer esto.Ejemplo usando jsonwebtoken:
import jwt from 'jsonwebtoken';const APP_ID = process.env['ONESIGNAL_APP_ID']const IDENTITY_VERIFICATION_SECRET = process.env['ONESIGNAL_IDENTITY_VERIFICATION_SECRET_KEY']// Generates JWT, potentially with subscription claims, for the user identified by the External IDfunction signOneSignalJWT(externalId, subscriptions) {return jwt.sign({iss: APP_ID,exp: Math.floor(Date.now() / 1000) + 3600, // 1-hour expirationidentity: {'external_id': externalId,},subscriptions},IDENTITY_VERIFICATION_SECRET,{ algorithm: 'ES256' });}// Pass this token to your mobile app to use with the `login` SDK methodconst onesignalJWT = signOneSignalJWT('EXTERNAL_ID');
La clave privada está en el archivo del paso anterior que descargamos del Panel.
Idealmente, los detalles de suscripción, como correo electrónico o número de teléfono, se incluyen en la carga útil JWT al iniciar sesión de un usuario. Si estos detalles no están disponibles por adelantado, tu servidor de verificación debe proporcionar un endpoint para generar tokens dinámicamente a medida que la información de suscripción esté disponible.Ejemplo: Generar JWT para agregar suscripciones
Una vez que tu backend genera el JWT, llama al método login con él. Este token asegura que la identidad del usuario sea verificada antes de que se puedan hacer cambios, como agregar una suscripción de correo electrónico o SMS.Ejemplo de inicio de sesión:
Necesitarás implementar un endpoint dedicado en tu backend para manejar escenarios como la invalidación de tokens. Este endpoint debe proporcionar un JWT actualizado cuando OneSignal solicite una actualización.Ejemplo de manejo de invalidación de token y actualización del JWT:
OneSignal.addUserJwtInvalidatedListener(event -> { // Get the expired user's External ID String externalId = event.getExternalId(); // Fetch a new JWT from your backend for the user String onesignalJWT = "yourUpdatedToken"; // Provide the new JWT to the SDK OneSignal.updateUserJwt(externalId, onesignalJWT);});
OneSignal.addUserJwtInvalidatedListener( object : IUserJwtInvalidatedListener { override fun onUserJwtInvalidated(event: UserJwtInvalidatedEvent) { val externalId = event.externalId val onesignalJWT = "" updateUserJwt(externalId, onesignalJWT) } },)
class AppDelegate: UIResponder, UIApplicationDelegate, OSUserJwtInvalidatedListener { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { // Set self to listen for JWT invalidated events OneSignal.addUserJwtInvalidatedListener(self) // Remove the JWT listener as needed by calling: // `OneSignal.removeUserJwtInvalidatedListener(self)` } // Required to conform to `OSUserJwtInvalidatedListener` protocol func onUserJwtInvalidated(event: OneSignalUser.OSUserJwtInvalidatedEvent) { // Get the expired user's External ID let externalId = event.externalId // Fetch a new JWT from your backend for the user let onesignalJWT = "yourUpdatedToken" // Provide the new JWT to the SDK OneSignal.updateUserJwt(externalId: externalId, token: onesignalJWT) }}
@interface MyListener: NSObject<OSUserJwtInvalidatedListener>@end@implementation MyListener- (void)onUserJwtInvalidatedWithEvent:(OSUserJwtInvalidatedEvent * _Nonnull)event { // Get the expired user's External ID NSString *externalId = event.externalId; // Fetch a new JWT from your backend for the user NSString *onesignalJWT = @"yourUpdatedToken"; // Provide the new JWT to the SDK [OneSignal updateUserJwt:externalId withToken:onesignalJWT];}// Add or remove your User Jwt Invalidated Listener[OneSignal addUserJwtInvalidatedListener:myListener];[OneSignal removeUserJwtInvalidatedListener:myListener];
Esto asegura que cuando el JWT de un usuario se invalide, se pueda obtener uno nuevo de tu backend y pasarlo a OneSignal. También puedes usar esta función para generar un token con un correo electrónico y número de teléfono, permitiéndote gestionar suscripciones de correo electrónico y SMS si el token creado durante la autenticación no los contiene.
5
Habilitar verificación de identidad de token en el panel
Desde Configuración > Claves e IDs, activa Verificación de Identidad de Token para habilitar.
Habilitando Verificación de Identidad de Token
Una vez habilitado, tu aplicación debe enviar JWTs de OneSignal para verificar la autenticidad de la suscripción. Además, tu aplicación debe llamar al método login usando un JWT generado por tu servidor de tokens de verificación de identidad.
No necesitas tomar pasos adicionales para agregar suscripciones desde tu aplicación móvil; llamar al método de inicio de sesión maneja esto automáticamente por ti.
Agregar un correo electrónico
Agregar un número de teléfono
OneSignal.getUser().addEmail(emailAddress);
OneSignal.getUser().addEmail(emailAddress)
// Si aún no lo has incluido en tu token JWT, actualiza el JWT con el correo electrónicolet onesignalJWT = "newTokenThatContainsTheEmailToAdd"OneSignal.updateUserJwt(externalId: externalId, token: onesignalJWT)// Agregar el correo electrónicoOneSignal.User.addEmail(emailAddress)
// Si aún no lo has incluido en tu token JWT, actualiza el JWT con el correo electrónicoNSString *onesignalJWT = @"newTokenThatContainsTheEmailToAdd";[OneSignal updateUserJwt:externalId withToken:onesignalJWT];// Agregar el correo electrónico[OneSignal.User addEmail:emailAddress];
OneSignal.getUser().addSms(smsNumber);
OneSignal.getUser().addSms(smsNumber)
// Si aún no lo has incluido en tu token JWT, actualiza el JWT con el SMSlet onesignalJWT = "newTokenThatContainsTheSmsToAdd"OneSignal.updateUserJwt(externalId: externalId, token: onesignalJWT)// Agregar el número de SMSOneSignal.User.addSms(smsNumber)
// Si aún no lo has incluido en tu token JWT, actualiza el JWT con el SMSNSString *onesignalJWT = @"newTokenThatContainsTheSmsToAdd";[OneSignal updateUserJwt:externalId withToken:onesignalJWT];// Agregar el número de SMS[OneSignal.User addSms:smsNumber];
Cuando la Verificación de Identidad de Token está habilitada, todas las solicitudes a las siguientes APIs deben incluir un JWT generado por el servidor en los encabezados como un token bearer, ej., Authorization: Bearer <JWT>.
No, pero se recomienda ampliamente. Sin ella, cualquier cliente que conozca el ID de Usuario Externo de un usuario puede hacerse pasar por ese usuario y modificar sus suscripciones o datos.
El SDK activa un evento de invalidación de JWT. Implementa addUserJwtInvalidatedListener (ver Manejar eventos del ciclo de vida del JWT) para obtener un token actualizado de tu backend y pasarlo a updateUserJwt.
Actualmente, el SDK nativo de Android (5.2.0+) y el SDK de iOS (5.3.0+). El soporte para SDK wrapper (Flutter, React Native, Unity, etc.) llegará próximamente.
¿Necesito verificación de identidad para la API REST?
Cuando la Verificación de Identidad de Token está habilitada, todas las solicitudes a las APIs admitidas deben incluir un JWT generado por el servidor como token bearer en el encabezado Authorization. El JWT se genera de la misma manera que para el uso del SDK.