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