1
votes

Service d'authentification facultatif

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 .


1 commentaires

pouvez-vous décrire un problème spécifique pour lequel vous avez besoin d'informations utilisateur sans connexion de l'utilisateur.


4 Réponses :


1
votes

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 .


3 commentaires

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)



0
votes

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.


0 commentaires

1
votes

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 !== '');
};


0 commentaires

0
votes

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é.


0 commentaires