2017-01-08 5 views
1

Как использовать авторизацию (привязку к существующей учетной записи), если сеанс не используется? Я не могу найти способ узнать, какой пользователь хочет авторизовать в первую очередь после ответа на авторизацию от facebook. Без сеанса невозможно сказать, что ... токен больше не присутствует в запросе (ни пользователь). Обычно они берут эту информацию с сеанса. Пробовал продолжение локального хранилища, но он не будет работать, поскольку паспорт выполняет несколько внутренних обратных вызовов, которые я не могу привязать к текущему контексту.Passport.JS - авторизация без сеанса?

http://passportjs.org/docs/authorize

ответ

0

, как вы указали вы используете Passport.JS стратегии Facebook, вы можете использовать состояние поля. вам нужно будет создать 2 middlewares, один из которых будет использоваться до того, как вы вызовете аутентификацию для URI входа в систему, а другой будет использоваться до URI loginCallback.

Имейте в виду, что вам также необходимо будет обновить стратегию для правильного управления пользователями. помните, вы не можете использовать 'req.user,

Мне лично тоже не нравятся сеансы, но это очень часто, чтобы найти информацию о том, как использовать auth с ними.

Проверьте, как этот метод вызывает метод «authenticate »passpassing, отключая сеанс, а также является промежуточным способом, вы можете, конечно, сделать это с вашим маршрутизатором router.get (...), но я нашел это хорошая практика, так как в моем приложении я использую локальную, facebook и JWT-аутентификацию одновременно, и мне нравится иметь последовательный шаблон. Кроме того, если вы планируете создавать и сохранять токен. вы можете столкнуться с проблемами, связанными с обратным вызовом, если вы используете асинхронное хранилище, например mongoDB.

В соответствии с документацией вы должны использовать авторизацию, если вы будете использовать этот endopoint для подключения к локальной учетной записи, но поскольку у вас вообще нет сеансов, нет смысла использовать, тем не менее, я думаю, что у вас должно быть 2 пути, один для регистрации в facebook, а другой, если вы планируете объединить локальную учетную запись с facebook, в случае, когда токен, переданный в facebook, может определить, был ли его первый раз или подключиться)

Не забудьте отключить сеанс в оба аутентифицируют вызовы.

function facebookTempTokenCreate(req, res, next) { 
// create the token the way you think is best, 
// I personally prefer to create a JWT and save it somewhere in the DB. 
// also you need to pass it to the next middleware by saving the value 
// in the req. name can be anything you want. 
// but make sure is quite unique as you do not want to break other libraries. 

    req.facebookConnectToken = 'that_sweet_token'; 
    next(); // dont forget to continue to next middleware. 
} 

function facebookAuthenticate(req, res, next) {   
    passport.authenticate('facebook', { 
     scope : 'email', 
     callbackURL : 'your_app_callback_uri', 
     state : req.facebookConnectToken, 
     session : false 
    })(req,res,next); 
} 

function facebookAuthenticateCallback(req, res, next) { 

    passport.authenticate('facebook', { 
     scope : 'email', 
     session : false 
    })(req,res,next); 
} 

function facebookTempTokenValidate(req, res, next) {  
    console.log('here we validate the token: ' + req.query.state); 
    next();//dont forget to pass execution to next middleware. 
} 

app.get('/facebook/login', facebookTempTokenCreate, facebookAuthenticate); 

app.get('/facebook/login/callback', facebookTempTokenValidate, facebookAuthenticateCallback); 

Дополнительную информацию можно найти здесь: https://github.com/jaredhanson/passport-facebook/issues/14

Надеюсь, это может вам помочь.

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