2015-07-10 3 views
1

Я использую passjs для аутентификации пользователя.

Используя postman, я могу успешно войти в систему и req.isAuthenticated всегда возвращает мне true в запросах подпоследовательности после входа в систему.

Использование углового $ http. Однако вход в систему работает нормально, но req.isAuthenticated всегда возвращает мне false в запросе подпоследовательности. My угловое приложение (localhost: 3000) и приложение (heroku) находятся в другом домене. Мои мысли заключались в том, что это может относиться либо к CORS, либо к cookie сеанса, поскольку я не вижу куки в моем браузере.

То, что я сделал

  1. Я попытался установить заголовок запроса, чтобы разрешить CORS.
  2. Я также попытался установить Access-Control-Allow-Credentials как в угловом $ http, так и в узле.

К сожалению, все попытки оказались неудачными 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. Это потому, что куки сессии не установлен в браузере вызывает проблему
  2. Если он относится к CORS, я не пропустить какие-либо настройки?
  3. Что еще ????
+0

ЗАКАНЧИВАТЬ [ 'withCredentials'] параметр конфигурации (https://docs.angularjs.org/api/ng/service/$http). – robertklep

+1

@robertklep Я включил эту опцию в свой угловой код. Проверьте мою угловую часть $ http.get ('xxxx', {withCredentials: true}). Успех ..... – eded

+0

Простите, пропустил это :-( – robertklep

ответ

1

Я решаю вопрос самостоятельно на основе комментария @robertklep. В принципе, нет ничего плохого в настройках паспорта. Это все о том, как вы отправляете флаг withCredentials в угловом. Вместо вызова метода get или post $ http. Я использую следующий формат, и это работает для меня

$http({ 
    method: 'GET', 
    url: 'xxxx', 
    data: {...}, 
    withCredentials: true 
}).success .... 

Ссылка:https://docs.angularjs.org/api/ng/service/ $ HTTP # использование

1

Если ваш запрос для входа службы содержит конфигурационные опции passport.js «withCredentials» присоединит верительные грамоты запросить, если вы предоставите правильные данные для входа.

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