passport req.isAuthenticated在使用angular $ http请求时始终返回false

时间:2015-07-10 07:53:14

标签: angularjs node.js cors session-cookies passport.js

我使用passportjs进行用户身份验证。

通过使用邮递员,我可以成功登录并且req.isAuthenticated在登录后的子序列请求中始终返回true。

使用angular $ http ,但是,登录工作正常,但req.isAuthenticated在子序列请求中始终返回false。我的角度应用(localhost:3000)节点应用(heroku)位于不同的域中。我的想法是它可能与CORS或会话cookie有关,因为我在浏览器中没有看到任何cookie。

我做了什么

  1. 我尝试将请求标头设置为允许CORS。
  2. 我还尝试在角度$ http和节点应用中设置 Access-Control-Allow-Credentials
  3. 不幸的是,所有尝试都失败了T_T

    Nodejs设置

        app.use(function(req, res, next) {
            res.header('Access-Control-Allow-Credentials', true);
            res.header('Access-Control-Allow-Origin', req.headers.origin);
            res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
            res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
            if ('OPTIONS' == req.method) {
                res.send(200);
            } else {
                next();
            }
        });
    
        passport.serializeUser(function(account, done) {
            done(null, account.id);
        });
    
        // used to deserialize the user
        passport.deserializeUser(function(id, done) {
            Account.findById(id, function(err, account) {
                done(err, account);
            });
        });
    
        passport.use('local-signup', new LocalStrategy({
            usernameField: 'email'
        }, function(email, password, done) {
            ....
        }));
    
        passport.use('local-login', new LocalStrategy({
            usernameField: 'email'
        }, function(email, password, done) {
            ....
        }));
    
        app.use(morgan('dev')); // log every request to the console
    
        app.use(bodyParser.urlencoded({ extended: false }));
    
        app.use(bodyParser.json());
    
        app.use(cookieParser(config.app.sessionSecret));
    
        app.use(session({
            secret: config.app.sessionSecret,
            resave: false,
            saveUninitialized: true,
            cookie: { httpOnly: true, maxAge: 2419200000 }
        }));
    
        // Passport for account authentication
        app.use(passport.initialize());
        app.use(passport.session()); // persistent login sessions
    
        ///////////////////////////////////////////////////////////////////route controller function
        authenticate: function(req, res) {
            if (!req.isAuthenticated()) {
                res.redirect('/login');
            } else {
                res.status(200).send('successful');
            }
        }
    

        $http.post('http://xxxxx/login', 
          {  email: $scope.user.email,
             password: $scope.user.password
          })
        .then(function(response) {
            ...
        }, function(response) {
            ...
        });
    
        $http.get('http://xxxxx/authenticate',
            { withCredentials: true }).success(function() {
                ...
            })
            .error(function() {
                ... // always get here with 302 redirect
            });
    

    我的问题/事情我不明白

    1. 是因为会话cookie未在浏览器中设置导致问题
    2. 如果它与CORS有关,我是否错过了任何设置?
    3. 还有什么????

2 个答案:

答案 0 :(得分:3)

我根据@robertklep评论自己解决了这个问题。基本上,passportjs设置没有任何问题。这是关于如何以角度发送withCredentials标志的全部内容。而不是调用$ http的get或post方法。我使用以下格式,它适用于我

def send_first_message(self):
    self.send_message(b'hello \n', self.receive_first_response)

def receive_first_response(self, data):
    print(data)
    self.send_message(b'world \n', self.receive_second_response)

def receive_second_response(self, data):
    print(data)

def read_message(self, callback):
    self._stream.read_until(b'\n', callback)

def send_message(self, data, callback):
    self._stream.write(data)
    self.read_message(callback)

参考: https://docs.angularjs.org/api/ng/service/ $ http#usage

答案 1 :(得分:1)

如果您的登录服务请求包含'withCredentials'配置选项,如果您提供正确的登录详细信息,passport.js会将凭据附加到请求。

$http({
method: 'POST',
url: 'http://xxxxx/login',
data: {...},
withCredentials: true})