Passport.js: стратегия паспорт-фейсбук-токен, вход через JS SDK и ЗАТЕМ аутентифицировать паспорт?

Я искал способ разрешить моему клиенту авторизоваться с помощью facebook JS SDK, а затем каким-то образом передать эту авторизацию на мой сервер узла (чтобы он мог проверять запросы с помощью api графика fb)

Я наткнулся на: https://github.com/jaredhanson/passport-facebook/issues/26

&

https://github.com/drudge/passport-facebook-token

что кажется совершенно иной стратегией, чем паспорт-фейсбук.

Правильно ли я предполагаю, что:

Вы входите в систему с помощью fb JS SDK, а затем стратегия facebook-token каким-то образом извлекает токен и идентификатор fb из объекта документа или тела?

Или есть какой-нибудь другой достойный способ добиться этого? Я пытаюсь избежать перенаправлений, налагаемых серверными SDK


person matthiasdv    schedule 05.01.2014    source источник
comment
После некоторого рытья я думаю, что клиент должен установить req.body.accessToken, а затем его можно будет забрать с помощью паспорта-фейсбука-токена?   -  person matthiasdv    schedule 05.01.2014


Ответы (1)


Я потратил пару дней на этой неделе, пытаясь выяснить, как лучше всего использовать аутентификацию Facebook для частного API, используя password.js - паспорт-facebook-token идеально подходит для этого.

Вы правы, предполагая, что это две отдельные стратегии аутентификации. Вам не нужно устанавливать паспорт-facebook, чтобы использовать паспорт-facebook-токен.

Если у вас есть аутентификация Facebook, реализованная в клиентском JS (или iOS и т. Д.), И вы ищете способ затем аутентифицировать запросы API с помощью вашего пользовательского Facebook authToken, паспорт-facebook-токен - действительно элегантное решение.

Passport-facebook-token работает полностью независимо от паспорта-facebook и в основном обрабатывает перенаправления, требуемые Facebook, перед передачей запроса вашему контроллеру.

Итак, чтобы аутентифицировать маршрут API с помощью паспорта-facebook-токена, вам необходимо настроить стратегию паспорта следующим образом:

passport.use('facebook-token', new FacebookTokenStrategy({
    clientID        : "123-your-app-id",
    clientSecret    : "ssshhhhhhhhh"
  },
  function(accessToken, refreshToken, profile, done) {
    // console.log(profile);

    var user = {
        'email': profile.emails[0].value,
        'name' : profile.name.givenName + ' ' + profile.name.familyName,
        'id'   : profile.id,
        'token': accessToken
    }

    // You can perform any necessary actions with your user at this point,
    // e.g. internal verification against a users table,
    // creating new user entries, etc.

    return done(null, user); // the user object we just made gets passed to the route's controller as `req.user`
  }
));

Стоит отметить, что метод User.findOrCreate, используемый в файле Readme паспорт-фейсбук-токен, не является методом mongo / mongoose по умолчанию, а является плагином, который вам придется установить, если вы этого хотите.

Чтобы использовать эту стратегию аутентификации в качестве промежуточного программного обеспечения для любого из ваших маршрутов, вам необходимо передать ему объект access_token либо как параметр URL-адреса, либо как свойство тела запроса.

app.get('/my/api/:access_token/endpoint', 
        passport.authenticate(['facebook-token','other-strategies']), 
        function (req, res) {

            if (req.user){
                //you're authenticated! return sensitive secret information here.
                res.send(200, {'secrets':['array','of','top','secret','information']});
            } else {
                // not authenticated. go away.
                res.send(401)
            }

        }

NB. свойство access_token чувствительно к регистру и использует подчеркивание. Документация для паспорта-фейсбука-токена не обширна, но источник действительно хорошо прокомментирован и довольно легко читается, поэтому я бы посоветовал вам заглянуть туда под капотом. Это, безусловно, помогло мне осмыслить некоторые более общие способы работы паспорта.

person Community    schedule 29.06.2014
comment
Знаете ли вы, поддерживает ли паспорт-фейсбук-токен сеансы (или аналогичную стратегию)? Или он отправляет запрос на проверку access_token на серверы Facebook при каждом запросе? - person electronix384128; 22.07.2014
comment
Он поддерживает сеансы. Прошло пару месяцев с тех пор, как я его установил, но я считаю, что у меня все работает, вы можете настроить его для хранения проверенного access_token, сначала проверять его, а затем проверять с помощью Facebook, если это не совпадает. Если вы хотите проверять с помощью Facebook каждый раз, вы можете отключить сеансы. - person Orangetronic; 30.07.2014
comment
Привет, Орангетроник. Знаете ли вы, как работает refreshToken - я просмотрел документацию, но там не так много информации. Я хочу запросить новый токен, когда срок действия старого токена истек ... есть идеи, как это сделать? Спасибо! - person jeh; 10.02.2015
comment
Вне зависимости от того, как я закончил обработку истекших токенов аутентификации, я попросил сервер запросить новый токен аутентификации (FB.login()), если срок действия токена истек. Хотя я давно не занимался этим ... - person Orangetronic; 11.02.2015
comment
Разве '/ my / api /: auth_token / endpoint' не должно быть '/ my / api /: access_token / endpoint'? - person smukov; 21.04.2015
comment
@smukov, ты совершенно прав! - Я отредактировал ответ, чтобы отразить это исправление, спасибо! - person Orangetronic; 22.04.2015
comment
@Orangetronic Я использовал это промежуточное ПО и обнаружил кое-что странное. Несмотря на то, что я использую неправильный идентификатор клиента и секрет клиента, я могу получить сведения о клиенте. Дополнительная информация на github.com/drudge/passport-facebook-token/issues/65 - person rakesh kashyap; 10.12.2016
comment
@rakeshkashyap да - это определенно не идеально! - person Orangetronic; 12.12.2016
comment
Я получаю несанкционированный доступ при звонке от почтальона. Ссылка stackoverflow.com/q/43557408/1939163 - person Luzan Baral; 28.04.2017
comment
Разве не лучше передать токен доступа в качестве заголовка вместо параметра GET? - person Abhishek Saini; 21.01.2018
comment
@AbhishekSaini, наверное, будет! - person Orangetronic; 22.01.2018