Avec la nouvelle fonction cloud de Firebase, j'ai décidé de déplacer une partie de mon point de terminaison HTTP vers Firebase. Tout fonctionne très bien ... Mais j'ai le problème suivant. J'ai deux points de terminaison créés par des déclencheurs HTTP (Cloud Functions)
- Un point de terminaison d'API pour créer des utilisateurs et renvoyer le jeton personnalisé généré par le SDK Firebase Admin.
- Un point de terminaison d'API pour récupérer certains détails utilisateur.
Bien que le premier point de terminaison convienne, mais pour mon deuxième point de terminaison, je voudrais le protéger uniquement pour les utilisateurs authentifiés. signifiant quelqu'un qui a le jeton que j'ai généré plus tôt.
Comment résoudre ce problème?
Je sais que nous pouvons obtenir les paramètres d'en-tête dans la fonction cloud en utilisant
request.get('x-myheader')
mais existe-t-il un moyen de protéger le point de terminaison tout comme la protection de la base de données en temps réel?
firebase
firebase-realtime-database
firebase-authentication
firebase-security
google-cloud-functions
espaceMonkey
la source
la source
Réponses:
Il existe un exemple de code officiel pour ce que vous essayez de faire. Ce qu'il illustre est comment configurer votre fonction HTTPS pour exiger un en-tête d'autorisation avec le jeton que le client a reçu lors de l'authentification. La fonction utilise la bibliothèque firebase-admin pour vérifier le jeton.
En outre, vous pouvez utiliser des « fonctions appelables » pour simplifier une grande partie de ce passe-partout, si votre application est capable d'utiliser les bibliothèques clientes Firebase.
la source
Comme mentionné par @Doug, vous pouvez utiliser
firebase-admin
pour vérifier un jeton. J'ai mis en place un exemple rapide:Dans l'exemple ci-dessus, j'ai également activé CORS, mais c'est facultatif. Tout d'abord, vous obtenez l'en-
Authorization
tête et découvrez le fichiertoken
.Ensuite, vous pouvez utiliser
firebase-admin
pour vérifier ce jeton. Vous obtiendrez les informations décodées pour cet utilisateur dans la réponse. Sinon, si le jeton n'est pas valide, il générera une erreur.la source
getIdToken()
méthode de côté client (par exemplefirebase.auth().currentUser.getIdToken().then(token => console.log(token))
) Firebase docsComme mentionné également par @Doug, vous pouvez utiliser des fonctions appelables afin d' exclure du code standard de votre client et de votre serveur.
Fonction appelable Exampale:
Il peut être appelé directement depuis votre client comme ceci:
la source
Les méthodes ci-dessus authentifient l'utilisateur à l'aide de la logique à l' intérieur de la fonction, de sorte que la fonction doit toujours être appelée pour effectuer la vérification.
C'est une méthode tout à fait fine, mais par souci d'exhaustivité, il existe une alternative:
Vous pouvez définir une fonction pour qu'elle soit "privée" afin qu'elle ne puisse être invoquée que par des utilisateurs enregistrés (vous décidez des autorisations). Dans ce cas, les demandes non authentifiées sont refusées en dehors du contexte de la fonction et la fonction n'est pas du tout appelée.
Voici des références à (a) la configuration des fonctions en tant que public / privé , puis (b) l' authentification des utilisateurs finaux auprès de vos fonctions .
Notez que les documents ci-dessus sont pour Google Cloud Platform, et en effet, cela fonctionne car chaque projet Firebase est également un projet GCP. Une mise en garde liée à cette méthode est que, au moment de la rédaction, elle ne fonctionne qu'avec l'authentification basée sur un compte Google.
la source
Il y a un bel exemple officiel à ce sujet en utilisant Express - peut être utile à l'avenir: https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js (collé ci-dessous juste pour sûr)
Gardez à l'esprit que
exports.app
vos fonctions sont disponibles sous/app
slug (dans ce cas, il n'y a qu'une seule fonction et est disponible sous<you-firebase-app>/app/hello
. Pour vous en débarrasser, vous devez en fait réécrire un peu la partie Express (la partie middleware pour la validation reste la même - cela fonctionne très bon et est tout à fait compréhensible grâce aux commentaires).Ma réécriture pour me débarrasser de
/app
:la source
J'ai eu du mal à obtenir une authentification Firebase appropriée dans la fonction golang GCP. Il n'y a en fait aucun exemple pour cela, j'ai donc décidé de créer cette petite bibliothèque: https://github.com/Jblew/go-firebase-auth-in-gcp-functions
Vous pouvez désormais authentifier facilement les utilisateurs à l'aide de firebase-auth (qui est distinct des fonctions gcp-authenticated-functions et n'est pas directement pris en charge par le proxy-aware-identity).
Voici un exemple d'utilisation de l'utilitaire:
N'oubliez pas de déployer votre fonction avec un
--allow-unauthenticated
indicateur (car l'authentification Firebase se produit dans l'exécution de la fonction).J'espère que cela vous aidera car cela m'a aidé. J'étais déterminé à utiliser golang pour les fonctions cloud pour des raisons de performances - Jędrzej
la source
Dans Firebase, afin de simplifier votre code et votre travail, ce n'est qu'une question de conception architecturale :
Express
. Pour limiter uniquement le même site ou un site spécifique , utilisezCORS
pour contrôler cet aspect de la sécurité. Cela a du sens car ilExpress
est utile pour le référencement en raison de son contenu de rendu côté serveur.context
paramètre pour éviter tous les tracas. Cela a également du sens, car comme une application à page unique construite avec AngularJS - AngularJS est mauvais pour le référencement, mais comme il s'agit d'une application protégée par mot de passe, vous n'avez pas besoin non plus de beaucoup de référencement. En ce qui concerne les modèles, AngularJS a des modèles intégrés, donc pas besoin de modèle côté serveur avecExpress
. Les fonctions appelables Firebase devraient alors être assez bonnes.Avec ce qui précède à l'esprit, plus de tracas et simplifiez-vous la vie.
la source