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
Voici mon code:
const validateFirebaseIdToken = async (req: any, res: any, next: any)
3 Réponses :
Votre demande comprend un corps
qui contient votre utilisateur
. Vous devez donc le faire comme ceci:
example.get('/', async (req, res) => { req.body.user }
Quelque chose à ajouter à la réponse acceptée donnée par @Constantin:
Idéalement:
Outre la réponse donnée par Constantin, j'avais besoin d'ajouter un type à la requête.
req: express.Request
J'ai fini par avoir cette méthode:
const validateFirebaseIdToken = async (req: express.Request, res: express.Response, next: any) => {}
Je pense que la méthode recommandée pour y parvenir consiste à utiliser la Fusion de déclarations comme indiqué ici .
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.
express.Request
, procédez comme suit: import { auth } from "firebase-admin"; declare global { namespace Express { export interface Request { user: auth.DecodedIdToken; } } }
À 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.