Я хочу аутентифицировать 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 в ответ: