Паспорт google oauth на localhost

Я совершенно новый при использовании паспорта для аутентификации через node, следовательно, множество фрагментов кода

мой сервер настроен как:

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 : '<secret-key>'}));
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'
        })
    );

Ответы

Ответ 1

В настоящее время протокол 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('/');
    });

Но прежде чем создавать новую стратегию, перейдите в консоль разработчика googles и получите идентификатор клиента и секрет. Вот шаги

  • перейдите сюда ссылка и создайте проект, вот снимок того же enter image description here
  • укажите новое имя и идентификатор проекта, вот снимок enter image description here
  • При создании нового проекта потребуется около минуты, и после создания нового проекта он перенаправит вас в конфигурацию приложения вашего приложения. На перенаправленной странице выберите APIS AND AUTH API. На странице API включите GOogle + API, вот его снимок enter image description here
  • затем перейдите к учетным данным (ниже API), затем нажмите Создать новый идентификатор клиента и зарегистрируйте домены и обратные вызовы для своего приложения (настройте домен как localhost), здесь его снимок! enter image description here 5. Затем вы получите свой новый идентификатор и секрет. Используйте их для создания новой стратегии

    passport.use(new googleStrategy({
        clientID: '<TheNewclientID>',
        clientSecret: '<The New Secret>',
    
        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.Знайте сериализацию и десериализацию

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, теперь он устарел, а вот ссылка в отношении последних вопросы]

Ответ 2

В большинстве примеров в Интернете код маршрутизации выполняется следующим образом:

app.get('/auth/google', passport.authenticate('google'));

Согласно Экспресс-ссылка, обратные вызовы метода app.get даются три аргумента, request, response и 'next ". Это означает, что метод аутентификации в приведенном выше примере возвращает объект функции, и он выполняется с тремя аргументами request, response и 'next'.

Итак, если вы хотите сделать аутентификацию в функции обратного вызова метода 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);
});