Это немного сложно, но если вы можете сделать это с одним социальным провайдером, вы можете легко сделать это с кем угодно.
Для этой демонстрации я буду использовать ExpressJS, AngularJS во внешнем интерфейсе и токены JWT.
Первое, что вам нужно сделать, это создать свое приложение в Facebook для разработчиков, каждый социальный провайдер требует того же, и после этого они предоставят вам идентификатор и SECRET_KEY (возможно, с другими именами…).
С нашей точки зрения, мы разместим ссылку для входа в Facebook, мы оставим ее там, потому что нам нужно настроить маршрут, который она будет использовать, и некоторые другие вещи в бэкэнде, так что имейте это в виду:
<a href="/login/facebook" target="_self">Facebook Login</a>
Теперь самое интересное. Вам необходимо установить паспорт JS, и каждый провайдер требует определенного расширения паспорта. Ваш package.json должен иметь что-то вроде этого:
"express": "^4.15.2", "jsonwebtoken": "^7.3.0", “passport”: “⁰.3.2”, “passport-facebook”: “².1.1”,
Как только это будет правильно установлено, мы можем перейти к файлу нашего сервера, запросить паспорт и фактически заставить наше приложение использовать стратегию facebook.
var express = require('express'); var passport = require('passport'); var Strategy = require('passport-facebook').Strategy; passport.use(new Strategy({ clientID: '1h321k2g3k12g3k1gkkgweliudh', clientSecret: 'kjfhadfjhadkfjhgaldfhaldkhg', callbackURL: 'http://localhost:3000/login/facebook/return' }, function(accessToken, refreshToken, profile, done) { //here you can perform any DB query for saving the user or getting some information. we have access to his/her data through the 'profile' argument that we are been given. The 'done' argument is a callback function that we need to use with whatever is we want to send to the front end. done(); }));
Следует отметить, что вы НИКОГДА не должны хранить ID и SECRET таким образом, я просто сделал это с целью показать вам, куда все должно идти. Вы можете сохранить эти ключи как переменные среды на вашем компьютере или сервере.
Другое дело — callbackURL, который мы предоставили в facebook. Это маршрут, который они будут использовать, чтобы нанести ответный удар в случае успешной аутентификации!.
Теперь мы можем создать этот маршрут на стороне нашего сервера, чтобы выполнить фактическую аутентификацию, поэтому он будет использовать функцию паспорта. Это маршрут, который мы используем со ссылкой в начале этого поста. Если наша серверная часть настроена, это вызовет серверы facebook для запроса разрешений у пользователя.
app.get('/login/facebook', passport.authenticate('facebook'))
Теперь, как мы упоминали ранее, если все работает нормально, Facebook выберет другой маршрут, который мы предоставили, помните?
callbackURL: 'http://localhost:3000/login/facebook/return'
Итак, давайте определим этот маршрут:
app.get('/login/facebook/return', passport.authenticate('facebook', { failureRedirect: '/' }), function(req, res) { // In the 'req' a we have access to what ever is that we pass to the 'done' function and we can go back to the front end with that information. The way i found to do this is to just pass the data to the url as params in this redirect like this: res.redirect('/?user=' + req.user.name) );
В интерфейсе URL-адрес изменится, и он принесет нам информацию, отправленную обратно. У Angular есть способ воспользоваться этим через $location:
$location.search() // this will break apart the query in the url giving you access to the data
Вот и все!