1
votes

Fonctions Firebase avec dactylographie et authentification

J'essaie d'implémenter des fonctions Firebase en utilisant du typographie. Jusqu'à présent, j'ai pu créer certaines fonctions sans problème jusqu'à ce que je doive m'occuper de l'authentification. C'est la première fois que j'utilise dactylographié, donc je demande peut-être quelque chose qui est évident pour la plupart des développeurs.

Contexte:

J'ai pu implémenter une vérification d'authentification en utilisant ce exemple . Comme nous pouvons le voir dans cet exemple (javascript), le code décode le jeton et transmet les informations utilisateur à la requête, qui sera traitée par la fonction suivante.

Problème:

Mon problème est que je ne sais pas comment faire cela en tapuscrit. Tout d'abord, j'ai dû ajouter des types aux paramètres dans mes fonctions de validation de jetons car le compilateur se plaignait de ne pas avoir de type (comme dans l'exemple javascript), alors j'ai opté pour quelque chose comme ceci:

const validateFirebaseIdToken = async (req: any, res: any, next: any) => {}

const example = express();
example.use(validateFirebaseIdToken);
example.get('/', async (req, res) => {}

Le problème est que dans ma prochaine fonction, je ne parviens pas à obtenir l'utilisateur:

example.get('/', async (req, res) => {
  req.user
}

Je reçois l'erreur: Propriété 'utilisateur' n'existe pas sur le type 'Request >'.

alors, comment feriez-vous dans ce cas? Je ne veux pas décoder à nouveau le jeton dans la deuxième fonction car cela n'aurait pas de sens (je l'ai déjà fait à l'étape précédente (validation du jeton)).

Idéalement:

  • Je voudrais utiliser la même approche que dans l'exemple javascript.

  • Je voudrais ajouter le bon type aux paramètres de la fonction de validation toke. J'ai essayé d'utiliser Request > mais le compilateur se plaint en disant que ce type n'est pas générique (j'ai déduit le type de la deuxième fonction)

Voici mon code:

const validateFirebaseIdToken = async (req: any, res: any, next: any) 


7 commentaires

À quoi ressemble la demande que vous envoyez à votre fonction?


@ConstantinBeer voulez-vous dire la demande du client? si tel est le cas, c'est comme une requête http normale avec le jeton à authentifier. Jusqu'à présent, l'authentification fonctionne sans problème. J'ai juste besoin de faire quelques opérations liées à l'utilisateur qui fait ces demandes. C'est pourquoi j'ai besoin d'obtenir les informations utilisateur dans ma deuxième fonction.


Essayez d'utiliser req.body.user


Typescript est juste une super classe de javascript, donc s'il y a quelque chose dont vous doutez avec 'typographie', vous pouvez toujours écrire et exécuter du javascript (petite astuce)


Salut @chrismclarke. Merci pour le conseil. Je veux juste essayer de continuer à utiliser les fonctionnalités dactylographiées telles que la saisie statique, raison pour laquelle j'ai décidé de passer du javascript à ce langage.


@ConstantinBeer votre suggestion a fonctionné pour moi. Voulez-vous ajouter une réponse correcte afin que je puisse l'accepter?


Heureux que cela ait aidé :) Oui. Je vais le faire dans une seconde.


3 Réponses :


1
votes

Votre demande comprend un corps qui contient votre utilisateur . Vous devez donc le faire comme ceci:

example.get('/', async (req, res) => {
     req.body.user
}


0 commentaires

2
votes

Quelque chose à ajouter à la réponse acceptée donnée par @Constantin:

Idéalement:

  • Je voudrais utiliser la même approche que dans l'exemple javascript.

Outre la réponse donnée par Constantin, j'avais besoin d'ajouter un type à la requête.

req: express.Request

  • Je voudrais ajouter le bon type aux paramètres de la fonction de validation de toke. J'ai essayé d'utiliser Request > mais le compilateur se plaint en disant que ce type n'est pas générique (j'ai déduit le type de la deuxième fonction)

J'ai fini par avoir cette méthode:

const validateFirebaseIdToken = async (req: express.Request, res: express.Response, next: any) => {}


0 commentaires

0
votes

Je pense que la méthode recommandée pour y parvenir consiste à utiliser la Fusion de déclarations comme indiqué ici .

  1. Créez un fichier type.d.ts dans le dossier src avec le code suivant:
import * as expressTypes from "express-serve-static-core";

const validateFirebaseIdToken = async (
  req: expressTypes.Request<expressTypes.Dictionary<string>>,
  res: expressTypes.Response,
  next: expressTypes.NextFunction
) => {};

En utilisant la fusion de déclaration et en spécifiant le type de la prop utilisateur, vous obtiendrez une prise en charge de la saisie semi-automatique.

  1. Éventuellement, si vous voulez être très strict avec les types, au lieu d'utiliser express.Request , procédez comme suit:
import { auth } from "firebase-admin";

declare global {
  namespace Express {
    export interface Request {
      user: auth.DecodedIdToken;
    }
  }
}


0 commentaires