Я совершенно новый при использовании паспорта для аутентификации по узлу, следовательно, множество fragmentов кода
мой сервер настроен как:
var router = require('./app/config/routes'); var googleStrategy = require('./app/config/passport'); var session = require("express-session"); var passport = require('passport'); app.use(session({secret : ''})); app.use(passport.initialize()); app.use(passport.session()); googleStrategy(passport);
мои маршруты настроены как
module.exports = function(app, passport) { app.get('/auth/google', function() { passport.authenticate('google', {scope: ['profile', 'email']}); }); app.get('/auth/google/callback', function() { passport.authenticate('google', { successRedirect: '/profile', failureRedirect: '/fail' }); }); .... ALSO configured /profile and /fail };
мой паспорт настроен как
passport.serializeUser(function(user, callback){ console.log('serializing user.'); callback(null, user); }); passport.deserializeUser(function(user, callback){ console.log('deserialize user.'); callback(null, user); }); var processRequest = function(token, refreshToken, profile, callback){ process.nextTick(function(){ console.log('id : '+ profile.id); console.log('name :'+ profile.displayName); console.log('email :' + profile.emails); console.log('token : '+ token); }); }; passport.use(new GoogleStrategy({ clientID: 'client ID', clientSecret : 'client SECRET', callbackURL : 'http://127.0.0.1:8080/auth/google/callback', realm : 'http://127.0.0.1:8080' }, processRequest));
Проблема: при переходе в /auth/google
я никогда не получаю экран подтверждения. На что я должен смотреть?
изменение маршрутов до конфигурации, показанной ниже, заставило ее работать.
app.get('/auth/google', passport.authenticate('google', {scope: ['profile', 'email']}) ); app.get('/auth/google/callback', passport.authenticate('google', { successRedirect: '/profile', failureRedirect: '/fail' }) );
В настоящее время протокол OAUTH2 для аутентификации и аутентификации хорошо поддерживается google.So. Лучше использовать то же самое. Вот документация Google на нем. Используйте модуль «паспорт-google-oauth» . Вот реализация. Это должна быть конфигурация объектов приложения, а также увидеть, что объект oauth2strategy используется из модуля pass-google-oauth, а также проверить области в регистрации маршрута app.get.
var googleStrategy = require('passport-google-oauth').OAuth2Strategy; app.configure(function() { app.set('views', './views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.session({secret:'MySecret'})); app.use(passport.initialize()); app.use(passport.session()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static('./public')); }); app.get('/auth/google', select.passport.authenticate('google',{scope: 'https://www.googleapis.com/auth/plus.me https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'})); app.get('/auth/google/callback', function() { passport.authenticate('google', { successRedirect: '/profile', failureRedirect: '/fail' }); }); app.get('/logout', function (req, res) { req.logOut(); res.redirect('/'); });
Но прежде чем создавать новую страtagsю, перейдите в консоль разработчика googles и получите идентификатор клиента и секрет. Вот шаги
затем перейдите к учетным данным (ниже API), затем нажмите « Создать новый идентификатор клиента» и зарегистрируйте домены и обратные вызовы для своего приложения (настройте домен как localhost), вот его снимок! 5. Затем вы получите свой новый идентификатор и секрет. Используйте их для создания новой страtagsи
passport.use(new googleStrategy({ clientID: '', clientSecret: '', callbackURL: "http://locahost:8080/auth/google/callback" }, function (accessToken, refreshToken, profile, done) { console.log(profile); //profile contains all the personal data returned done(null, profile) } ));
6.now сериализовать и десериализовать
passport.serializeUser(function(user, callback){ console.log('serializing user.'); callback(null, user.id); }); passport.deserializeUser(function(user, callback){ console.log('deserialize user.'); callback(null, user.id); });
запустите сервер и перейдите на localhost: 8080 / auth / google (не используйте 127.0.0.1:8080 вместо locahost). Это должно заставить его работать 🙂
[Другие полезные ссылки: ознакомьтесь с первым комментарием kvcrawford о репо модуля на этой странице. Passport-google – еще один популярный модуль, который используется для предоставления логина с использованием google, теперь он устарел, вот ссылка на его недавние проблемы]
В большинстве примеров в Интернете код маршрутизации выполняется следующим образом:
app.get('/auth/google', passport.authenticate('google'));
Согласно Express Reference , обратные app.get
метода app.get
даются три аргумента, request
, response
и «следующий». Это означает, что метод аутентификации в приведенном выше примере возвращает объект функции, и он выполняется с тремя аргументами request
, response
и «следующего».
Итак, если вы хотите сделать аутентификацию в функции обратного вызова метода app.get
следующим образом:
app.get('/auth/google', function() { passport.authenticate('google', {scope: ['profile', 'email']}); });
то вы должны написать:
app.get('/auth/google', function(request, response, next) { passport.authenticate('google', {scope: ['profile', 'email']})(request, response, next); });
Я согласен с вами @Seiya, но я бы добавил redirect
app.get( "/auth/google/callback", passport.authenticate('google'), (req, res) => { res.redirect('/whatever') } );