2015-11-05 54 views

回答

0

您必須每次對用戶的每次請求進行身份驗證並使用策略設置req.user。我使用令牌的策略。

令牌在標頭中發送。 而不是令牌可能是餅乾或其他策略。

下面殘缺碼,但你可以幫助:

var bodyParser = require('body-parser'); 
var express = require('express'); 
var jwt = require('jsonwebtoken'); 

var LocalStrategy = require('passport-local').Strategy; 
var BearerStrategy = require('passport-http-bearer').Strategy; 

var app = express(); 

app.use(bodyParser.json()); 


//Local Strategy to login user with email and password 

passport.use(new LocalStrategy({ 
     usernameField: 'email', 
     passwordField: 'password' 
    }, 
    function(email, password, done) { 
     usersRepository 
      .getUserByEmail(email) 
      .then(function(user) { 
       if (!!user && passwordHelper.verify(password, user.password, user.salt)) { 
        done(null, user); 
       } else { 
        done(null, false); 
       } 
      }); 
    })); 


//Bearer Strategy to auth user with token - run with every request 

passport.use(new BearerStrategy(function(token, done) { 
    jwt.verify(token, 'secret', function(err, decoded) { 
     if (!err && decoded) { 
      done(null, decoded); // !!! here is set req.user - decode is my user from token 
     } else { 
      done(null, false); 
     } 
    }); 
})); 

app.use(passport.initialize()); 

var bearerAuth = passport.authenticate('bearer', { 
    session: false 
}); 

bearerAuth.unless = require('express-unless'); 

//Adding Bearer Strategy to all routing unless login 

app.use(bearerAuth.unless({ 
    path: [ 
     '/login' 
    ] 
})); 

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

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

//Login - use Local Strategy 

app.post('/login', passport.authenticate('local'), function(req, res) { 
    var accessToken = jwt.sign(req.user, 'secret', { 
     expiresIn: '7d' 
    }); 

    res.send({ 
     id: req.user.id, 
     accessToken: accessToken, 
     email: req.user.email, 
     isAdmin: req.user.is_admin 
    }); 
}); 
相關問題