首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用passport-google-oauth验证成功后重定向到原始页面

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

Stack Overflow用户
提问于 2014-08-31 05:07:53
回答 2查看 4.5K关注 0票数 3

我正在使用node passport-google-oauth模块,并尝试使用Custom returnUrl on Node.js Passport's Google strategy中建议的基于会话的方法,在成功进行身份验证后将页面重定向回原始路径。然而,我发现在我的回调中,存储在会话中的重定向信息总是被清除,所以我被迫重定向到默认的(在这种情况下是‘/’)。

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

//输出自

代码语言:javascript
复制
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

//代码片段

代码语言:javascript
复制
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);
});
EN

回答 2

Stack Overflow用户

发布于 2016-05-03 20:26:32

仅当当前未设置该变量时,才能存储会话中的第一个URL。如果设置了此var,则执行post登录,然后重定向至该变量。

这比来自第三方oauth的报头可能不准确要好。

在Java语言中,我会在过滤器中进行设置(检查会话变量,例如redirect_to或first_url,如果它为空,则设置它,如果不是登录/注册页面,则设置它)。在节点中,js可以使用https://stackoverflow.com/a/13336055/1643558中解释的中间件。

引用这个答案:我有一个用于app.get('/account', auth.restrict, routes.account)的中间件,它设置了session...then中的redirect_to,我将其重定向到/login

代码语言:javascript
复制
auth.restrict = function(req, res, next){
    if ( !req.session.userid ) {
        req.session.redirect_to = '/account';
            res.redirect('/login');
    } else {
        next();
    }
};

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

代码语言:javascript
复制
var redirect_to = req.session.redirect_to ? req.session.redirect_to : '/';
delete req.session.redirect_to;
//is authenticated ?
res.redirect(redirect_to);
票数 2
EN

Stack Overflow用户

发布于 2015-03-28 16:18:03

我使用

代码语言:javascript
复制
res.redirect(req.headers.referer); 

但问题是有时它工作,有时它不,好像用户将是第一次登录facebook,facebook将首先显示权限对话框,它覆盖了引用标题变量,但如果用户已经授予您的应用程序的权限,他/她将被重新定向到url,无论他们来自哪里。

SBE -抱歉,英语不好;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25586774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档