42 votes

Est-il toujours possible d'effectuer une vérification des jetons côté serveur dans Firebase 3?

Est-il encore possible de le faire côté serveur de vérification de jetons dans Firebase 3?

Nous générons des jetons (JWT) sur un serveur qui exécute Golang à l'aide de notre système d'authentification existant (à l'aide d'un Compte de Service). Le jeton est utilisé sur un iOS client à l'aide de

FIRAuth.auth()?.signInWithCustomToken(customToken)

Jusqu'à ce que tout fonctionne bien. Mais quand on passe le jeton client vers le serveur extrait de:

FIRUser.getTokenWithCompletion({ token, error in ..})

nous ne sommes pas en mesure de le vérifier. Le JWT jeton est signé à l'aide RS256 et a un en-tête.kid nous ne pouvons pas reconnaître. La clé publique à partir du Compte de Service (qui a été utilisé pour signer le token personnalisé) ne vérifie pas si le jeton client. Est la clé publique, nécessaire pour valider le jeton client disponible?

Je sais que c'est possible de valider client des jetons à l'aide de la "verifyIdToken" appel en Java ou Javascript, mais nous espérons toujours être en mesure de le faire dans Golang à l'aide d'un JWT bibliothèque.

Tout cela a bien fonctionné dans Firebase 2 (à l'aide de HS256 et la Firebase secret).

51voto

Kato Points 12210

La réponse courte est oui. La réponse est que, dans la plupart des cas, nous avons un plus outil approprié maintenant. Donc, cela dépend beaucoup de l'utilisation le cas où vous essayez de résoudre.

La nouvelle version du SDK est un peu plus puissant, et nous n'avons pas fait un grand travail de résumer les capacités. Cela semble être un bon endroit pour le contraste les outils disponibles et leurs utilisations, et puis je vais virer de bord sur certains tiers (c'est à dire Aller) les notes à la fin.

À l'aide d'un outil d'authentification pour l'authentification du client

La principale utilisation de la frappe des jetons personnalisés est de permettre aux utilisateurs de s'authentifier sur un externe/legacy auth mécanisme de contrôle, telles que votre serveur LDAP. Le processus de base pour ce qui est abordé ici: iOS, Android, Web.

Essentiellement, votre service à la menthe le JWT jeton et l'envoie au client. Le client ne la vérification et l'authentification à l'aide de la coutume de jeton que vous fournissez.

Authentification de votre privilégiée des travailleurs

Il n'est plus nécessaire d'utiliser des jetons personnalisés pour authentifier votre processus de serveur. Ceci est fait par la création d'un compte de service, qui est couvert étape-par-étape de l'Ajout de Firebase pour votre Serveur. Lorsque vous avez terminé, vous vous retrouverez avec un fichier JSON qui contient une clé privée.

Ensuite, vous insérez votre compte du service d'identification par référence à cet JSON à l'aide de l' serviceAccount d'attribut en firebase.initializeApp(), et vous êtes dans! C'est documenté ici et ressemble à ceci (voir le lien pour la version Java):

var firebase = require("firebase");

// Initialize the app with a service account, granting admin privileges
firebase.initializeApp({
  databaseURL: "https://databaseName.firebaseio.com",
  serviceAccount: "./serviceAccountCredentials.json"
});

L'émulation des utilisateurs ou la limitation de l'accès à partir d'un serveur de processus

Il est assez trivial pour émuler un utilisateur ou à limiter l'accès (fortement recommandé) à partir d'un processus de serveur. Vous n'avez pas vraiment besoin de menthe un token personnalisé pour ce plus.

Cela nécessite juste l'ajout de l' databaseAuthVariableOverride dans votre appel à l' database.initializeApp():

firebase.initializeApp({
  databaseURL: "https://databaseName.firebaseio.com",
  serviceAccount: "./serviceAccountCredentials.json",
  databaseAuthVariableOverride: {
    uid: "my-service-worker-or-user-uid"
  }
});

La validation de l'identité du client via la sécurité

Tout d'abord, vous pouvez généralement éviter de traiter avec le côté serveur de vérification si vous utilisez Firebase Base de données, en ayant votre client en écriture à la base de données et à l'aide de règles de sécurité pour valider leur identité. Si votre serveur écoute sur un chemin qui requiert une authentification à écrire, alors c'est déjà résolu sans aucune spéciales de sécurité sur le serveur.

Par la modélisation de cette comme un événement de la file d'attente, il crée un simple, modulaire et évolutif serveur travailleur de la stratégie. Voir firebase-file d'attente pour certains grands Node.js outils. Il prend en charge 3.x.

La vérification d'identification de client jetons sur le serveur

Si vous n'utilisez pas le temps réel de la Base de données et la nécessité de recevoir des clients jetons (par exemple via des appels de REPOS) et vérifiez qu'ils sont valides, vous pouvez le faire en utilisant verifyIdToken() comme décrit ici. Ce serait semblable à la suivante:

auth.verifyIdToken(idToken).then(function(decodedToken) {
  var uid = decodedToken.sub;
});

Ensuite, si vous voulez authentifier en tant qu'utilisateur d'écrire dans la base de données et à renforcer la sécurité, vous devez utiliser l' Émulation des Utilisateurs de la section ci-dessus. En d'autres termes, appelez - initializeApp() avec un databaseAuthVariableOverride à la uid.

Notez que, si vous essayez d'appeler initializeApp() plusieurs fois et de rencontrer un message d'erreur similaire à la suivante: Error: Firebase App named '[DEFAULT]' already exists. Vous pouvez initialiser app multiples contextes par l'ajout d'un deuxième argument à la initializeApp() appel (par exemple, database.initializeApp({...}, 'asUser'+uid)), puis de référence que l'instance de l'application en utilisant firebase.database('asUser'+uid).réf(...). Pour en savoir plus sur l'utilisation de plusieurs app instances, regardez ici.

Code Java disponibles sur les liens ci-dessus. Aller tiers et les solutions ci-dessous.

La création d'un jeton pour une utilisation dans l'API REST

Michael Bleigh couvert ce scénario ici et mérite quelques rep pour travailler cela.

La création de jetons ou d'en vérifier eux par le biais de REPOS

Ce n'est pas pris en charge. Désolé.

Golang et les autres: à venir

Nous travaillons sur un Aller jeton de frappe et de la vérification de la bibliothèque. Nous allons également ajouter des outils Python pour ce dès que bien. Pas de date de sortie ou stades pour cela. Dans le même temps, si vous souhaitez vérifier l'ID client jetons sans l'aide de l'officiel Firebase Node.js ou de bibliothèques Java (qui ont intégré les méthodes de vérification), vous devez vous assurer que l'ID de jeton (ce qui est JWT) est conforme à la suivante:

  • Son décodé en-tête a un alg (algorithme) de revendiquer l'égalité d' "RS256".
  • Son décodé charge utile a un aud (public) de revendiquer l'égalité pour votre Firebase ID de projet.
  • Son décodé charge utile a un iss (émetteur) la revendication de l'égalité à l' "https://securetoken.google.com/<projectId>".
  • Son décodé charge utile a une chaîne non vide sub (sous réserve) de la réclamation. Notez que c'est l' uid pour que Firebase de l'utilisateur.
  • Son décodé en-tête a un kid (key ID) de la réclamation qui correspond à l'une des clés publiques énumérées à l' https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com.
  • Vous devez également utiliser une librairie JWT pour vérifier le jeton de clé publique pour prouver le jeton a été signé avec le public des clés de la clé privée correspondante.

Pour y Aller, il semble que vous pouvez utiliser jwt-go de décoder et de valider le client ID de jeton.

0voto

Richeek Points 1131

Bien firebase ne pas permettre la vérification de la custom tokens de ce qu'ils font est de permettre la vérification de la id tokens ils sont générés une fois la connexion de l'utilisateur à l'aide de jetons personnalisés. Si comme cela a été le cas avec moi, si vous passez firebase jetons personnalisés à d'autres services pour l'authentification avec votre backend puis personnaliser le jeton de vérification du fardeau de la preuve est sur vous! Également le service google compte X509 cert n'est pas au bon format. Il a ces \n (new line) des séparateurs qui ne sont pas remplacés avec de nouvelles lignes dans les éditeurs de texte (j'utilise vim). Donc ce que j'ai fait est ceci:

  val factory = CertificateFactory.getInstance("X.509")
  val certificateFile = this.getClass.getResourceAsStream(Play.current.configuration.getString("firebase.certificate").get)
  val publicKey = factory.generateCertificate(certificateFile).asInstanceOf[X509Certificate].getPublicKey
  val claimBody = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(compactJws).getBody
  1. Obtenir le certificat de service google lien du compte spécifié dans le json téléchargé lors de la configuration de firebase
  2. Remplacer manuellement \n avec une nouvelle ligne
  3. Obtenir JWT bibliothèque. J'ai utilisé cette grande bibliothèque pour effectuer la vérification de Java JWT
  4. Lire le certificat et extraire la clé publique.
  5. Utiliser la clé publique pour vérifier jeton
  6. Assurez-vous que vous avez une autre api pour actualiser les jetons car il ne sont valables que pour une heure

Espérons que ça aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X