Passport.js: стратегия passport-facebook-token, войдите через JS SDK и ТОГДА подтвердите паспорт?

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

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

&

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

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

Я прав, если предположить, что:

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

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

1 ответ

Решение

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

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

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

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

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

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-facebook-token-паспорте, - это не метод 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 свойство учитывает регистр и использует подчеркивание. Документация для passport-facebook-token не обширна, но источник действительно хорошо прокомментирован и довольно легко читается, поэтому я рекомендую вам заглянуть туда под капот. Это, безусловно, помогло мне обдумать некоторые из более общих способов работы паспорта.

Другие вопросы по тегам