2017-10-08 2 views
0

Je veux authentifier par nom d'utilisateur et mot de passe.J'utilise l'authentification des plumes pour le faire mais je ne comprends pas après la configuration mon application, comment vérifier mes données d'entrée (nom d'utilisateur et mot de passe) dans mon serveur pour permettre l'authentification des plumes? Dans mon client j'ai ce code pour envoyer mes données (nom d'utilisateur et mot de passe)comment vérifier le nom d'utilisateur et mot de passe avec feathersjs?

app.authenticate({ 
    strategy: 'local', 
    username: 'k0',//self.state.username, 
    password:'kk'// self.state.password 
    }).then(response => { 
    console.log('Authenticated!', response); 
    return app.passport.verifyJWT(response.accessToken); 
}) 
.then(payload => { 
    console.log('JWT Payload', payload); 
    return app.service('users').get(payload.userId); 
}) 
.then(user => { 
    app.set('user', user); 
    console.log('User', app.get('user')); 
}) 
.catch(function(error){ 
    console.error('Error authenticating!', error); 
}); 

Mais j'ai une erreur

"POST http://localhost:4200/authentication 400 (Bad Request) 
Error authenticating! 
BadRequest {type: "FeathersError", name: "BadRequest", message: "Missing credentials", code: 400, className: "bad-request", …} 
className 
: 
"bad-request" 
code 
: 
400 
data 
: 
{message: "Missing credentials"} 
errors 
: 
{} 
message 
: 
"Missing credentials" 
name 
: 
"BadRequest" 
type 
: 
"FeathersError" 
stack 
: 
"BadRequest: Missing credentials↵ at new BadRequest 
__proto__ 
: 
Error" 

Et ce server.js mes

var Users=[ {_id:"1",email:"k0",password:"kk"}, {_id:"2",email:"k1",password:"kk"}, {_id:"3",email:"k2",password:"kk"}, {_id:"4",email:"k3",password:"kk"}, {_id:"5",email:"k4",password:"kk"}]; 
const feathers = require('feathers'); 
const bodyParser = require('body-parser'); 
const errors = require('feathers-errors'); 
const errorHandler = require('feathers-errors/handler'); 
const rest = require('feathers-rest'); 
const hooks = require('feathers-hooks'); 
const auth = require('feathers-authentication'); 
const local = require('feathers-authentication-local'); 
const memory = require('feathers-memory'); 
const jwt = require('feathers-authentication-jwt'); 
const app = feathers(); app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: true })); var cors = require('cors'); var port= process.env.PORT ||4200;app.use(cors()); 
` 

.use('/users', { 
find(params) { 
return Promise.resolve(Users); 
} 
}) 
.use(errorHandler()); 
app.service('authentication').hooks({ 
before: { 
create: [ 
auth.hooks.authenticate('local'), 
customizeJWTPayload() 
], 
remove: [ 
auth.hooks.authenticate('jwt') 
] 
} 
}); 
app.service('users').hooks({ 
before: { 

create: [ 
    local.hooks.hashPassword({ passwordField: 'password' }) 
] 
} 
`});app.post('/login', auth.express.authenticate('local', { successRedirect: '/app', failureRedirect: '/login'  })); 

app.get('/app', (req, res, next) => { 
res.json({ success: true }); 
}); 

app.get('/login', (req, res, next) => { 
res.json({ success: "faux" }); 
}); 
app.listen(port);` 
+0

La propriété nom d'utilisateur par défaut est 'email'. L'avez-vous changé en "nom d'utilisateur" dans [votre configuration] (https://docs.feathersjs.com/api/authentication/local.html#default-options)? – Daff

+0

mais si je le fais app.authenticate ({ stratégie: 'local', email: 'K0', // self.state.username, mot de passe: 'kk' // self.state.password }) J'ai une autre erreur "BadRequest: Credentials". – John

Répondre

1

Je vous recommande fortement d'utiliser le générateur de plumes. Cela fonctionne très bien et vous fera gagner beaucoup de temps avec ces problèmes. De cette façon, vous savez que les services de base et l'authentification fonctionneront avant de commencer la personnalisation. https://docs.feathersjs.com/guides/step-by-step/generators/readme.html

Après avoir discuté ci-dessous avec Developper ci-dessous il semble que le problème utilisait username au lieu de la valeur par défaut email pour le champ d'authentification usernameField. Soit mettre à jour le code à utiliser email ou créer un fichier default.json avec quelque chose comme ceci:

{ 
    "authentication": { 
    "strategies": [ 
     "local" 
    ], 
    "local": { 
     "entity": "user", 
     "usernameField": "username", 
     "passwordField": "password" 
    } 
    } 
} 

En second lieu, il est possible que votre service ne soit pas configuré correctement (ce qui est la raison pour laquelle vous obtenez l'erreur the id property must be set on the entity service for authentication

.

Voici mon fichier users.service.js:

// Initializes the `users` service on path `/users` 
const createService = require('feathers-mongodb'); 
const hooks = require('./users.hooks'); 
const filters = require('./users.filters'); 

module.exports = function() { 
    const app = this; 
    const paginate = app.get('paginate'); 
    const mongoClient = app.get('mongoClient'); 
    const options = { paginate }; 

    // Initialize our service with any options it requires 
    app.use('/users', createService(options)); 

    // Get our initialized service so that we can register hooks and filters 
    const service = app.service('users'); 

    mongoClient.then(db => { 
    service.Model = db.collection('users'); 
    }); 

    service.hooks(hooks); 

    if (service.filter) { 
    service.filter(filters); 
    } 
}; 

On dirait que le vôtre est mis en place pour gérer la requête, mais qui est prise en charge dans le service de MongoDB en utilisant des crochets: https://docs.feathersjs.com/api/databases/mongodb.html#querying

Pour la question spécifique de savoir comment l'authentification des plumes vérifie le nom d'utilisateur et le mot de passe L'authentification des plumes utilise des crochets. Si vous avez utilisé feathers generate service et l'authentification sélectionnée, il a automatiquement appelé le authenticate() dans le fichier hook de votre service (généralement SERVICENAME.hooks.js).

Vous pouvez voir ce que la fonction authenticate() est en train de faire ici: https://github.com/feathersjs/feathers-authentication/blob/master/src/hooks/authenticate.js

+0

J'ai modifié mon message. Pouvez-vous m'aider ? – John

+0

Avez-vous déjà créé l'utilisateur avec le nom d'utilisateur et le mot de passe que vous essayez d'authentifier? J'utilise curl: 'curl 'http: // localhost: 3030/users /' -H 'Content-Type: application/json' --data-binary '{" nom d'utilisateur ":" k0 "," mot de passe ": "kk"} '' – sagannotcarl

+0

Non !!! où je dois ajouter ceci? Et dans mon code aucune erreur à éditer? – John