Я хочу аутентифицировать REST Api с помощью facebook

Резюме

Я хочу, чтобы мое веб-приложение аутентифицировало пользователя с помощью facebook. Как только это будет сделано, WebApp отправит facebookToken в api, и благодаря этому api сможет получить доступ к информации о пользователях facebook. И мы сможем создать JsonWebToken для аутентификации нашего REST api.

Вы можете найти исходный код в github: https://github.com/Tkanos/FacebookRestAuthentication

Код

Вы можете найти исходный код в github: https://github.com/Tkanos/FacebookRestAuthentication

Итак, нам нужно иметь веб-приложение, которое подключается к facebook и получает facebooktoken.

В нашем API нам потребуется конечная точка входа в систему для получения этого токена facebook, отправленного веб-приложением.

var getToken = function(req, res) {
var facebookToken = req.headers['facebooktoken'];
//TODO : check the expirationdate of facebooktoken
if(facebookToken) {
   var path = 'https://graph.facebook.com/me?access_token=' + facebookToken;
request(path, function (error, response, body) {
   var facebookUserData = JSON.parse(body);
if (!error && response && response.statusCode && response.statusCode == 200) {
 if(facebookUserData && facebookUserData.id) {
   var accessToken = jsonWebToken.sign(facebookUserData, jwtSecret, {
                            //Set the expiration
                            expiresIn: 86400
                        });
   res.status(200).send(accessToken);
} else {
  res.status(403);
  res.send('Access Forbidden');
                    }
}
else {
  console.log(facebookUserData.error);
  //console.log(response);
  res.status(500);
  res.send('Access Forbidden');
}
});
  res.status(403);
  res.send('Access Forbidden');
}
};

Как вы можете видеть, получая facebookToken, мы получаем всю информацию, которой пользователь делится с нами по телефону:

'https://graph.facebook.com/me?access_token=' + facebookToken;

Как только мы получим ответ, это вся информация о нашем пользователе на Json. Мы можем «подписать» его на jsonwebtoken (в конечном итоге сохранить в нашей базе данных). и отправим обратно наш новый токен, который будет использоваться для связи с нашим API.

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

Как вы можете видеть в API / apiRouter.js (см. На github), мы будем получать jsonwebtoken при каждом сообщении, мы проверили его, чтобы вернуть информацию о наших пользователях в json.

apiRouter.use('/', function(req, res, next){
            var jwt = req.headers.authorization;
            if(jwt) {
                var jwtManager = require('./Login/loginController')();
jwtManager.verify(accessToken, function(err, decoded){
                   if(err) {
                       res.status(401).send('Invalid Token');
                   }
                   else {
                       req.connectedUser = decoded;
                       next();
                   }
                });
            }
            else {
                next();
            }
        });

Таким образом, во всех методах моего приложения я потенциально буду привязать пользователя к запросу.

req.connectedUser

Как протестировать этот Api

Для тестирования нам понадобится токен facebook. Вы можете получить его для тестирования на https://developers.facebook.com/tools/explorer/?method=GET&path=me&version=v2.7

Затем (после запуска npm) вы можете использовать REST CALL для нашей службы входа в систему. поместите свой facebooktoken в заголовок, вы получите jsonwebtoken в ответ:

Ссылка