2015-10-20 2 views
2

Итак, у нас есть «веб-сервер» и сервер API - веб-сервер обслуживает HTML, а сервер API обслуживает JSON.Node.js Express - совместное использование сессий паспорта на разных серверах

Мы используем стратегию Twitter в Passport для аутентификации на сервере .

Мой вопрос: что является лучшим способом проверить на сервере API, что пользователь, прошедший аутентификацию с веб-сервера, также аутентифицирован с помощью API?

Мое предположение, что мы должны поставить большую часть кода паспорта на веб-сервере, есть пользователь аутентификации с ним, как обычно, с паспортом, и использование промежуточного ПО в API сервера, как так, чтобы проверить, является ли пользователь (имеет сеанс):

app.use(passport.initialize()); 
app.use(passport.session()); 

app.use(expressSession({ 
    secret: 'keyboard cat', 
    store: new MongoStore({mongooseConnection: mongoose.connection}) 
})); 


app.use(function(req,res,next){ 


    if(req.isAuthenticated()){ 
     next(); 
    } 
    else{ 
     console.log('unauthenticated request'); 
     res.status(403).json({error:'unauthorized request'}); 
    } 

}); 

Однако вышеизложенного недостаточно. Я совершенно смущен точно, какой код мне нужен на сервере API. Я считаю, что мне нужно прочитать из того же хранилища сеансов, на который пишет веб-сервер, и посмотреть маркер в запросе на сервер API и сравнить его с токен в хранилище сеансов?

Я не уверен, что я понимаю, что делает функция req.isAuthenticated()? Кажется, мне теперь нужно написать свою собственную функцию req.isAuthenaticated(), которая асинхронно читает из хранилища сеансов ...

Есть ли у кого-нибудь пример того, как это сделать правильно?

ответ

1

Возможно, вы сможете сделать так, как вы сказали - выполните аутентификацию с помощью веб-сервера и просто убедитесь, что они аутентифицированы с использованием API.

При условии, что оба сервера одни и те же удаленного сеанса магазин, и обе конечные точки имеют доступ к экспресс-куки сессии, вы должны быть в состоянии осуществить что-то подобное для API:

function ensureAuthenticated(req, res, next) { 
    if (req.isAuthenticated()) 
    return next(); 
    else 
    // Not authenticated 
} 

Или

if (req.user) { 
    // logged in 
    } else { 
    // not logged in 
} 

В качестве промежуточного программного обеспечения (как показано в вашем примере) или на per-route basis.

Это может быть небезопасно, если вы не можете получить доступ к одному и тому же совместно используемому сеансовому файлу. Другие варианты могут быть доступны в зависимости от того, в какой структуре встроено ваше приложение. - если веб-сервер говорит напрямую с API.

Вы можете прочитать функцию req.isAuthenticated из паспорта github.

Смежные вопросы