2015-08-14 14 views
19

Sto provando a passare un messaggio JSON quando l'autenticazione fallisce, usando callback fatto in LocalStrategy, ma tutto ciò che ottengo è 401 e stringa "non autorizzata" nella risposta.Passport local strategy done callback non passa errore json message

var express = require('express'); 
var bodyParser = require('body-parser'); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

var app = express(); 
app.use(bodyParser.json()); 
app.use(passport.initialize()); 

passport.serializeUser(function(user, done) { 
    done(null, user.email); 
}); 

var strategy = new LocalStrategy({ usernameField: 'email' }, 
    function (email, password, done) { 
     if (email === '[email protected]' && password === 'pass') { 
      return done(null, { email: '[email protected]' }); 
     } else { 
      // never get this json object on the client side when posting invalid credentials 
      return done(null, false, { message: 'invalid email or password' }); 
     } 
    } 
); 

passport.use(strategy); 

app.post('/login', passport.authenticate('local'), function(req, res) { 
    console.log(req.user); 
    res.json(req.user); 
}); 


app.get('/', function(req, res) { 
    res.json({ message: 'hello!' }); 
}); 

var server = app.listen(3000, function() { 
    console.log('api is listening on ', server.address().port); 
}); 

package.json

{ 
    "name": "passport_example", 
    "version": "1.0.0", 
    "description": "", 
    "main": "app.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "dependencies": { 
    "body-parser": "^1.13.3", 
    "express": "^4.13.3", 
    "passport": "^0.2.2", 
    "passport-local": "^1.0.0" 
    } 
} 

Che cosa sto facendo di sbagliato?

risposta

17

Il valore message è impostato in sessione e flash. Non credo che il passaporto abbia qualche possibilità di inviare messaggi di errore JSON. Ma puoi passare una richiamata nel metodo authenticate e inviare il messaggio da lì:

app.post('/login', function(req, res, next){ 
    passport.authenticate('local', function(err, user, info) { 
     if (err) { return next(err) } 
     if (!user) { return res.json({ message: info.message }) } 
     res.json(user); 
    })(req, res, next); 
}); 
+0

grazie! questo funziona – milagvoniduak

+5

Utilizzare 'res.status (403) .json (informazioni)' per rispondere correttamente con lo stato non autorizzato. Inoltre, dovrai chiamare "req.logIn (utente, funzione (err) {next (err)};" per accedere effettivamente all'utente. –

+7

Spiacente, 401 Non autorizzato è il codice di stato corretto. –