2017-01-16 10 views
8

Каков наилучший способ отправки информации о паспортном паспорте из задней части интерфейса?Данные сеанса паспорта JS в Angular2

Мое приложение, которое работает на порте 3000. Первые два запроса для входа в Facebook и перенаправления. Затем один, чтобы получить данные пользователя из базы данных (идентификатор пользователя должен быть сохранен в req.user)

routes.js:

app.get('/auth/facebook', passport.authenticate('facebook', { scope : 'email' })); 

app.get('/auth/facebook/callback', 
     passport.authenticate('facebook', { 
      successRedirect : 'http://localhost:8000/', 
      failureRedirect : '/fail' 
     }) 
); 

app.get('/auth/userdata', isLoggedIn, function(req, res) { 
    Donator.findById(req.user, function(err, fulluser) { 
     if (err) throw err; 
     res.json(fulluser); 
    }) 
}); 

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) { 
     next(); 
    } else { 
     res.json(false); 
    } 
}; 

паспорт config.js

'facebookAuth' : { 
     'clientID'  : 'secret', 
     'clientSecret' : 'secret', 
     'callbackURL' : 'http://localhost:3000/auth/facebook/callback' 
    }, 

Так что в моем приложении Angular2 Я могу перейти на http://localhost:3000/auth/facebook, перенаправить на страницу входа в FB и, если успех перенаправлен на http://localhost:3000/auth/login/callback, который приведет меня к http://localhost:8000/.

И в моем приложении Angular2, который работает на порту 8000

getUser(){ 
    this.http.get('http://localhost:3000/auth/userdata') 
    .map(res => return res.json()) 
} 

EVERYTIME getUser() называется, она возвращает 'ложь'. Есть ли простой и безопасный способ «вставить» данные сеанса в мой интерфейс на другом порту? Также, когда я иду http://localhost:3000/auth/userdata в браузере, я вижу этот профиль, отображаемый как JSON.

Когда я устанавливаю backend и интерфейс на том же порту, он работает, facebook, твиттер, google, локальный, все в порядке, а getUser возвращает полный профиль пользователя.

Надеюсь, это ясно.

+0

Почему вы не обслуживаете приложение angular2 на порту '3000'? –

+1

Я бы хотел, чтобы на конец хоста был включен внешний интерфейс на отдельных хостах. – dmh126

+0

Я предлагаю запустить все на одном порту. Вы можете иметь два сервера на разных портах, но прокси-сервер один из них, используя [express-http-proxy] (https://www.npmjs.com/package/express-http-proxy). –

ответ

4

Это была проблема с запросами в Angular2. Я добавил учетные данные для каждого запроса:

getUser(){ 
    this.http.get('http://localhost:3000/auth/userdata', {withCredentials: true}) 
    .map(res => return res.json()) 
} 

И теперь это нормально.

+0

Привет, я добавил также {withCredentials: true} в моей просьбе, но проблема с frist cors, но затем добавление res.header («Access-Control-Allow-Origin», «http: // localhost: 4200»); на сервере я получаю req.isAuthenticated() false. Как решить эту проблему? –

+0

У меня есть также 'res.header ('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS'),' в моих опциях cors. И он работает, также для запроса POST вы должны включить такие опции, как 'options = new RequestOptions ({headers: headers, withCredentials: true})' – dmh126