简体   繁体   English

req.isAuthenticated始终在angular2应用中使用observable返回false

[英]req.isAuthenticated always returns false with using observable in angular2 app

I'm using node with passport and I'm trying to execute a login process with the 'LocalStrategy'. 我正在使用带有通行证的节点,并且正在尝试使用“ LocalStrategy”执行登录过程。

When using a REST client to execute the login request and then ask for another REST path to extract data the req.isAuthenticated() returns true as expected. 当使用REST客户端执行登录请求,然后请求另一个REST路径来提取数据时,req.isAuthenticated()将按预期返回true。

But when I'm doing so in my angular2 application it's always false. 但是,当我在我的angular2应用程序中这样做时,它总是错误的。

Here is the code of server.js: 这是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: 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: 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: 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');
                });

Hy, you have surely a service (_loginServer) in your angular app. 您好,您的角度应用程序中肯定有一项服务(_loginServer)。 Set coockies in your headers with {withCredentials: true}. 使用{withCredentials:true}在标题中设置coockies。 I had the same issue and it helped me 我遇到了同样的问题,它对我有帮助

the function login(user) shall look like as follow. 函数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){ //.... } }) } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM