Passer au contenu principal

Aperçu

OneSignal offre une fonctionnalité de sécurité améliorée appelée vérification d’identité pour aider à prévenir l’usurpation d’identité des utilisateurs. Cette fonctionnalité utilise des jetons Web JSON – ou JWT, générés de manière sécurisée sur votre serveur. Pour vérifier les informations d’abonnement, ces jetons sont transmis à votre application et à l’API de OneSignal. Activez la vérification d’identité pour sécuriser :
  • Connecter les utilisateurs
  • Ajouter des abonnements email
  • Ajouter des abonnements SMS
  • Modifier les identités des utilisateurs
La vérification d’identité est actuellement en version bêta. Contactez support@onesignal.com pour l’activer sur votre compte. Une fois que le support l’a activée, vous l’activez dans votre tableau de bord (voir Étape 5).

Prérequis

La prise en charge des SDK wrapper (Flutter, React Native, Unity, etc.) arrive bientôt.

Configuration

1

Générer de nouvelles clés

Connectez-vous à votre compte OneSignal et accédez à Paramètres > Clés et ID > Vérification d’identité.
Settings page showing Keys and IDs with Identity Verification section
Cliquez sur Générer de nouvelles clés pour créer une nouvelle paire de clés.
Generate New Keys button in the Identity Verification section
Téléchargez le fichier PEM ou copiez la clé privée, en veillant à stocker la clé privée en toute sécurité.
Identity Verification key pair with private key and PEM download
Stockez toujours vos clés privées dans un environnement sécurisé, tel qu’un système de gestion de clés. N’exposez jamais les clés privées dans le code côté client, les dépôts publics ou les journaux.
2

Générer un JWT de vérification sur votre backend

La vérification d’identité nécessite d’authentifier l’utilisateur final avec votre serveur d’authentification avant de le connecter à OneSignal. Lorsque l’utilisateur final s’authentifie auprès de votre backend, générez le jeton et incluez-le dans la réponse d’authentification à l’appareil. Si votre application n’exécute pas de serveur backend, envisagez de mettre en place un serveur léger pour vérifier les utilisateurs et générer ces jetons.

Charge utile JWT

Le JWT peut avoir les propriétés suivantes :
iss
requis
Votre ID d’application OneSignal
exp
requis
La date d’expiration du jeton.
identity
requis
L’alias de l’utilisateur.
subscriptions
Requis uniquement lors de l’ajout d’abonnements email et SMS à un utilisateur.

Signature du JWT

Signez le JWT en utilisant l’algorithme ES256. Assurez-vous que votre backend est configuré pour utiliser cette méthode de signature afin d’éviter les problèmes de vérification lors de l’envoi du JWT à OneSignal. Nous recommandons une bibliothèque JWT pour ce faire.Exemple utilisant 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 ID
function signOneSignalJWT(externalId, subscriptions) {
return jwt.sign({
iss: APP_ID,
exp: Math.floor(Date.now() / 1000) + 3600, // 1-hour expiration
identity: {
'external_id': externalId,
},
subscriptions
},
IDENTITY_VERIFICATION_SECRET,
{ algorithm: 'ES256' });
}

// Pass this token to your mobile app to use with the `login` SDK method
const onesignalJWT = signOneSignalJWT('EXTERNAL_ID');

La clé privée se trouve dans le fichier de l’étape précédente que nous avons téléchargé depuis le tableau de bord.

Vérifier votre JWT

Avant d’intégrer avec le SDK, vérifiez que votre JWT est correctement généré en démarrant votre serveur et en appelant l’endpoint :
  node server.js
  curl http://localhost:3000/generate-jwt/your-external-id
Vous devriez recevoir une réponse comme :
{
  "jwt": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Collez la valeur JWT sur jwt.io et confirmez que la charge utile décodée contient les paramètres suivants :
{
  "iss": "your-onesignal-app-id",
  "exp": 1234567890,
  "identity": {
    "external_id": "your-external-id"
  }
}
Confirmez les éléments suivants avant de passer à l’étape suivante :
  • iss correspond à votre ID d’application OneSignal dans Paramètres > Clés et ID
  • identity.external_id est présent et correspond à la valeur que vous passerez à OneSignal.login()
  • exp est un horodatage futur — un jeton expiré sera rejeté par OneSignal

Inclusion des abonnements

Idéalement, les détails d’abonnement, tels que l’email ou le numéro de téléphone, sont inclus dans la charge utile JWT lors de la connexion d’un utilisateur. Si ces détails ne sont pas disponibles au départ, votre serveur de vérification doit fournir un endpoint pour générer des jetons dynamiquement à mesure que les informations d’abonnement deviennent disponibles.Exemple : Génération de JWT pour ajouter des abonnements
const subscriptions = [
  {
      "type": "Email",
      "token": "[email protected]"
  },
  {
      "type": "SMS",
      "token": "+12345678"
  }
]
const onesignalJWT = signOneSignalJWT('EXTERNAL_ID', subscriptions)
3

Transmettre le JWT à la méthode `login`

Une fois que votre backend génère le JWT, appelez la méthode login avec celui-ci. Ce jeton garantit que l’identité de l’utilisateur est vérifiée avant que des modifications, telles que l’ajout d’un abonnement email ou SMS, puissent être effectuées.Exemple de connexion :
String externalId = "YOUR_EXTERNAL_ID";
String onesignalJWT = "YOUR_JWT_TOKEN";

OneSignal.login(externalId, onesignalJWT);
4

Gérer les événements du cycle de vie JWT

Vous devrez implémenter un endpoint dédié sur votre backend pour gérer des scénarios tels que l’invalidation de jetons. Cet endpoint doit fournir un JWT actualisé lorsque OneSignal demande une mise à jour.Exemple de gestion de l’invalidation de jeton et de rafraîchissement du 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);
});
Cela garantit que lorsque le JWT d’un utilisateur est invalidé, un nouveau peut être récupéré depuis votre backend et transmis à OneSignal. Vous pouvez également utiliser cette fonction pour générer un jeton avec un email et un numéro de téléphone, vous permettant de gérer les abonnements email et SMS si le jeton créé lors de l’authentification ne les contient pas.
5

Activer la vérification d'identité par jeton dans le tableau de bord

Dans Paramètres > Clés et ID, activez Vérification d’identité par jeton.
Token Identity Verification toggle enabled in dashboard settings
Une fois activée, votre application doit envoyer des JWT OneSignal pour vérifier l’authenticité de l’abonnement. De plus, votre application est tenue d’appeler la méthode login en utilisant un JWT généré par votre serveur de jetons de vérification d’identité.

Ajout d’abonnements

Vous n’avez pas besoin de prendre de mesures supplémentaires pour ajouter des abonnements depuis votre application mobile ; l’appel de la méthode login le gère automatiquement pour vous.
OneSignal.getUser().addEmail(emailAddress);

API REST

Lorsque la vérification d’identité par jeton est activée, toutes les requêtes vers les API suivantes doivent inclure un JWT généré par le serveur dans les en-têtes en tant que jeton porteur, par exemple, Authorization: Bearer <JWT>.

FAQ

La vérification d’identité est-elle obligatoire ?

Non, mais elle est fortement recommandée. Sans elle, tout client connaissant l’ID d’utilisateur externe d’un utilisateur peut usurper son identité et modifier ses abonnements ou ses données.

Que se passe-t-il si le JWT expire pendant une session ?

Le SDK déclenche un événement d’invalidation de JWT. Implémentez addUserJwtInvalidatedListener (voir Gérer les événements du cycle de vie JWT) pour récupérer un jeton mis à jour depuis votre backend et le transmettre à updateUserJwt.

Quels SDK prennent en charge la vérification d’identité ?

Actuellement, le SDK Android natif (5.2.0+) et le SDK iOS (5.3.0+). La prise en charge des SDK wrapper (Flutter, React Native, Unity, etc.) arrive bientôt.

Ai-je besoin de la vérification d’identité pour l’API REST ?

Lorsque la vérification d’identité par jeton est activée, toutes les requêtes vers les API prises en charge doivent inclure un JWT généré par le serveur en tant que jeton porteur dans l’en-tête Authorization. Le JWT est généré de la même manière que pour l’utilisation du SDK.

Quel algorithme le JWT utilise-t-il ?

La vérification d’identité requiert des JWT signés avec l’algorithme ES256 (ECDSA utilisant P-256 et SHA-256). Les autres algorithmes seront rejetés.