TL; DR Le problème est de savoir comment obtenir les informations utilisateur à partir d'un jwt
J'essaie d'obtenir les informations d'un utilisateur
à partir du jwt
si un est envoyé sur la demande mais je ne veux pas fermer le point de terminaison uniquement utilisateurs connectés.
Je ne veux pas fermer le point de terminaison avec le hook authenticate
mais je ne sais pas comment obtenir les informations user
sans cela.
J'utilise une stratégie locale avec jwt
.
4 Réponses :
Même si vous n'utilisez pas le hook d'authentification, les informations d'authentification de la requête (le cas échéant) seront disponibles dans params.authentication . Vous pouvez faire ce que vous voulez avec dans votre propre hook:
module.exports = () => async context => { const { authentication } = context.params; // authentication will e.g. be { strategy: 'jwt', accessToken } // do whatever you like here including throwing errors }
Pour obtenir les informations utilisateur ou autoriser l'accès anonyme, consultez le Recette du livre de recettes d'authentification anonyme .
cela inclura le jeton et la stratégie, mais pas l'utilisateur décodé, etc. correct? cela devrait être manuel?
Oui, mais la stratégie anonyme gérerait tout cela.
La façon dont je l'ai fait depuis que je faisais un deuxième appel sur le backend était que je venais de vérifier sur le params.header
si le jeton avait été envoyé. if (params.headers && params.headers.authorization) attendent this.app.service ('reservation'). create (dataReserv, params) else attend this.app.service ('reservation'). create (dataReserv)
Vous pouvez également effectuer un try
/ catch
autour du hook d'authentification pour tenter d'authentifier une route mais sans échouer à cause de cela, par ex.
auquel cas, s'il y avait un jeton valide, vous aurez params.user
et authenticated = true
sinon pas.
La méthode avec "try / catch" est bonne, mais il existe une autre méthode basée sur les hooks .
1) Créez des hooks personnalisés isAuth.js
:
const { iff } = require('feathers-hooks-common'); const { authenticate } = require('@feathersjs/authentication').hooks; const isAuth = require('isAuth'); module.exports = { before: { find: [iff(isAuth, authenticate('jwt'))], }, after: {} };
2) Correction du service hooks.js
( app.service ('/ my-url'). hooks (hooks) ) dans laquelle l'autorisation de méthode sera facultative.
NOTE: si l'utilisateur n'est pas autorisé, alors dans l'objet "params.user" "user" sera absent.
module.exports = (context) => { return !!(context.params.headers.authorization && context.params.headers.authorization !== 'null' && context.params.headers.authorization !== ''); };
C'est la seule méthode qui a fonctionné pour moi.
const { iff } = require('feathers-hooks-common'); const { authenticate } = require('@feathersjs/authentication').hooks; module.exports = { before: { all: [iff( (({ params: { headers: { authorization }}}) => authorization), authenticate('jwt') )], find: [], get: [], create: [], update: [], patch: [], remove: [] }, after: { all: [], find: [], get: [], create: [], update: [], patch: [], remove: [] }, error: { all: [], find: [], get: [], create: [], update: [], patch: [], remove: [] } };
Je viens de vérifier que le jeton d'autorisation a été envoyé.
pouvez-vous décrire un problème spécifique pour lequel vous avez besoin d'informations utilisateur sans connexion de l'utilisateur.