2017-01-15 20 views
0

我正在使用带护照的节点,并试图用'LocalStrategy'执行登录过程。req.isAuthenticated在angular2应用中总是返回false并使用observable

当使用REST客户端执行登录请求,然后请求另一个REST路径来提取数据时,req.isAuthenticated()将按预期返回true。

但是,当我在我的angular2应用程序中这样做时,它总是错误的。

这里是server.js的代码:

var express = require('express'); 
var session = require('express-session'); 
var app = express(); 
var passport = require('passport'); 
var bodyParser = require('body-parser'); 

app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

app.use(session({ 
    secret: 'secret', 
    saveUninitialized: true, 
    resave: true 
})); 

app.use(passport.initialize()); 
app.use(passport.session()); 


var sections = require('./sections/routes/sections'); 
var users = require('./users/routes/users'); 

app.use('/api/v1/sections', sections); 
app.use('/api/v1/users', users); 

app.listen(9090, function() { 
    console.log('Example app listening on port 9090') 
}); 

Users.js:

var express = require('express'); 
var router = express.Router(); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

var User = require('../models/users'); 


passport.use(new LocalStrategy({ 
     usernameField: 'email', 
     passwordField: 'password' 
    }, 
    function(email, password, done) { 
     User.findOne({ $or: [ { userName: email },{ email: email} ] }, function(err, user) { 
      if (err) { return done(err); } 
      if (!user) { 
       return done(null, false, { message: 'Incorrect username.' }); 
      } 
      if (!User.verifyPassword(user.password,password)) { 
       return done(null, false, { message: 'Incorrect password.' }); 
      } 
      console.log('User found: ' + user); 
      return done(null, user); 
     }); 
    } 
)); 


passport.serializeUser(function(user, done) { 
    console.log('serialize user id: ' + user.id); 
    done(null, user._id); 
}); 

passport.deserializeUser(function(id, done) { 

    console.log('deserialize user id: ' + id); 

    User.findById(id, function (err, user) { 

     if (err){ 
      console.error('User not found. ' + err); 
     } 

     done(err, user); 
    }); 
}); 


router.post('/login', passport.authenticate('local'),function (req, res) { 
    console.log('User authenticated'); 
    res.status(200).json({result: {}}); 
}); 


module.exports = router; 

Sections.js:

var express = require('express'); 
var router = express.Router(); 

var Sections = require('../models/sections'); 

router.get('/', function (req, res,next) { 

    if (!req.isAuthenticated()) { // Works with REST client only! 
     res.status(401).json({result: 'UnAuthorized'}); 
    } else { 

     console.log('User ' + req.user + " isAuth: " + req.isAuthenticated()); 

     Sections.findOne({userName: req.user.userName}, function (err, sections) { 
      if (err) { 
       // return done(err); 
       res.status(500).json({result: err}); 
      } else if (!sections) { 
       // return done(null, false, { message: 'Incorrect username.' }); 
       res.status(200).json({result: {}}); 
      } else { 
       // return done(null, sections); 
       res.status(200).json({result: sections}); 
      } 
     }); 
    } 

    // next(); 
}); 

module.exports = router; 

Login.component.ts:

this._loginServer.login(user).subscribe(() => { 
        console.log('Login passed'); // Get's here 
        this._router.navigate(['sections']); // Get's 401 from server :(
       }, 
       error => { 
        console.log('Login failed'); 
       }); 

回答

0

Hy,你肯定有一个服务(_loginServer)在你的角度的应用程序。在{withCredentials:true}的标头中设置coock。我有同样的问题,它帮助我

功能登录(用户)应如下所示。

login(user: string): Observable<any> { 
 
    
 
    let headers = new Headers({ 'Content-Type': 'application/json' }); 
 
    let options = new RequestOptions({ headers: headers, withCredentials: true}); 
 
    let body = JSON.stringify({ 
 
       user: user   
 
      }) 
 
    return this.http.post('link to your server', body, options) 
 
      .map(res => res.json()) 
 
      .map(res =>{ 
 
        if(res.success){ 
 
         //.... 
 
        } 
 
       }) 
 
    }