node.js - 如何在使用 passport-google-oauth 成功验证后重定向到原始页面

标签 node.js authentication express oauth passport.js

我正在使用 node passport-google-oauth 模块并尝试在使用 Custom returnUrl on Node.js Passport's Google strategy 中建议的基于 session 的方法成功验证后将页面重定向回原始路径.但是,我发现在回调中,存储在 session 中的重定向信息总是被清除,因此我被迫重定向到默认值(在本例中为“/”)。

这是我的代码片段的日志输出。似乎当它在回调中时,returnTo 被清除了。它是 passport-google-oauth 的设计吗?如果是这样,如何在成功验证后重定向回原始页面?

//输出自

Storing url: /newroom
in /auth/google, returnTo = /newroom
in /auth/google/callback, returnTo = undefined
Storing url: /newroom
in /auth/google, returnTo = /newroom
in /auth/google/callback, returnTo = undefined

//代码片段

var express = require('express'),
[sic]
passport = require('passport'),
GoogleStrategy = require('passport-google-oauth').OAuth2Strategy,
cookieParser = require('cookie-parser'),
expressSession = require('express-session'),
bodyParser = require('body-parser'); 

passport.serializeUser(function(user, done) {
    done(null, user);
});

passport.deserializeUser(function(obj, done) {
    done(null, obj);
});

passport.use(new GoogleStrategy({
        clientID: GOOGLE_CLIENT_ID,
        clientSecret: GOOGLE_CLIENT_SECRET,
        callbackURL: 'http://' + MY_HOST + '/auth/google/callback',
    },
    function(accessToken, refreshToken, profile, done) {
        process.nextTick(function() {
            console.log('Profile:' + profile);
            return done(null, profile);
        });
    }
));

var auth = function(req, res, next){
    if (!req.session.user) {
        console.log('Storing url: ' + req.url);
        req.session.returnTo = req.url;
        res.redirect('/auth/google');
    } else if (!userIsValid(req.session.user)) {
        // handle invalid user
    } else {
        next();
    }
};

app.get('/auth/google', function(req, res, next) {
        console.log("in /auth/google, returnTo = " + req.session.returnTo);
        passport.authenticate('google',
            {
                scope: ['https://www.googleapis.com/auth/userinfo.profile',
                    'https://www.googleapis.com/auth/userinfo.email']
            }
        )(req, res, next)
    }
);

app.get('/auth/google/callback', function(req, res, next) {
    console.log("in /auth/google/callback, returnTo = " + req.session.returnTo);
    passport.authenticate('google', function(err, user, info) {
        console.log("in /auth/google/callback callback");
        if (err || !user) {
            res.redirect('/auth/google');
        } else {
            var returnTo = req.session.returnTo ? req.session.returnTo : '/';
            delete req.session.returnTo;
            console.log('Redirecting to: ' + returnTo);
            req.session.user = user;
            res.redirect(returnTo);
        }
    })(req, res, next);
});

最佳答案

也可以存储 session 中的第一个 URL,前提是当前未设置该变量。如果设置了此 var,则发布登录,然后重新定向到该 var。

这比第 3 方 oauth 可能不准确的 header 要好。

在 Java 中,我会在过滤器中执行此操作(检查 session 变量,比如 redirect_to 或 first_url,如果它为 null 则设置它,如果不是登录/注册页面)。在 Node js 中可以使用中间件,如 https://stackoverflow.com/a/13336055/1643558 中所述。

引用那个答案: 我有一个与 app.get('/account', auth.restrict, routes.account) 一起使用的中间件,它在 session 中设置 redirect_to...然后我重定向到/login

auth.restrict = function(req, res, next){
    if ( !req.session.userid ) {
        req.session.redirect_to = '/account';
            res.redirect('/login');
    } else {
        next();
    }
};

然后在 routes.login.post 中,我执行以下操作:

var redirect_to = req.session.redirect_to ? req.session.redirect_to : '/';
delete req.session.redirect_to;
//is authenticated ?
res.redirect(redirect_to);

关于node.js - 如何在使用 passport-google-oauth 成功验证后重定向到原始页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25586774/

相关文章:

ios - localPlayer是否仍然通过身份验证,即使身份验证失败

javascript - Heroku 在 heroku (Node.js) 上找不到本地模块

javascript - Node 和 Express : How to implement basic webhook server

javascript - 使用 Node.js 的 mongodb 驱动程序返回嵌套数组中的第一个元素

node.js - NodeJS + Socket.IO 无法获取 json 返回

javascript - 如何在 JavaScript 中添加 Promise 到事件处理程序

ruby-on-rails - 添加 devise gem 后登录页面出错

python - 输入 URL 时为 "SpotifyOauthError: error: invalid_request, error_description: code must be supplied"

node.js - React组件不断更新

javascript - 在html Nodejs中显示mongodb数据