【问题标题】:req.isAuthenticated always returns false with using observable in angular2 appreq.isAuthenticated 在 angular2 应用程序中使用 observable 时总是返回 false
【发布时间】:2017-05-30 11:21:05
【问题描述】:

我正在使用带护照的节点,并且正在尝试使用“LocalStrategy”执行登录过程。

当使用 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');
                });

【问题讨论】:

    标签: node.js angular observable passport.js


    【解决方案1】:

    嘿,您的 Angular 应用程序中肯定有一个服务 (_loginServer)。使用 {withCredentials: true} 在标题中设置 cookie。我有同样的问题,它帮助了我

    函数 login(user) 如下所示。

      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){
                            //....
                        }
                    })
      }

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 2016-04-01
      • 2014-03-24
      • 2020-11-29
      • 2021-04-03
      • 2018-08-06
      • 1970-01-01
      • 2022-07-30
      • 2017-10-03
      相关资源
      最近更新 更多