Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过Passport OAuth流传递URL参数_Javascript_Node.js_Oauth 2.0_Passport.js - Fatal编程技术网

Javascript 通过Passport OAuth流传递URL参数

Javascript 通过Passport OAuth流传递URL参数,javascript,node.js,oauth-2.0,passport.js,Javascript,Node.js,Oauth 2.0,Passport.js,目前,我使用优秀的Passport框架在node.js中实现了Google OAuth2,但我发现在工作流中传递URL参数很困难 例如,我想做的是创建一个类似于/analysis?id=1234的url,然后能够加载特定的分析 一旦您已经通过身份验证且会话尚未过期,它就可以工作,但如果您尚未通过身份验证,它就无法工作。我想我正在努力将它传递到回调URL。任何指导都将不胜感激 以下是我到目前为止得到的(仅相关代码) var session=require('express-session'); v

目前,我使用优秀的Passport框架在node.js中实现了Google OAuth2,但我发现在工作流中传递URL参数很困难

例如,我想做的是创建一个类似于
/analysis?id=1234
的url,然后能够加载特定的分析

一旦您已经通过身份验证且会话尚未过期,它就可以工作,但如果您尚未通过身份验证,它就无法工作。我想我正在努力将它传递到回调URL。任何指导都将不胜感激

以下是我到目前为止得到的(仅相关代码)

var session=require('express-session');
var storage=require('node-persist');
var passport=需要(“passport”);
var GoogleStrategy=require('passport-google-oauth2')。策略;
var GOOGLE_CLIENT_ID=“”
,GOOGLE_CLIENT_SECRET=“”,
GOOGLE_CALLBACKURL=”http://localhost:1425/auth/google/callback";
应用程序使用(会话)({
最大年龄:86400000,//24小时
秘密:“没人会发现”,
雷萨夫:是的,
saveUninitialized:true
}));
var-sess;
app.use(passport.initialize());
app.use(passport.session());
storage.initSync();
passport.use(谷歌新战略)({
clientID:GOOGLE\u客户端\u ID,
clientSecret:GOOGLE\u CLIENT\u SECRET,
callbackURL:GOOGLE\u callbackURL
},
函数(accessToken、refreshToken、配置文件、cb){
返回cb(空,配置文件);
}
));
passport.user(函数(用户,cb){
cb(空,用户);
});
passport.deserializeUser(函数(obj、cb){
cb(null,obj);
});
app.get('/login',函数(req,res){
var id=请求查询\u id;
如果(id){
var url='/auth/google?id='+id;
}否则{
var url='/auth/google';
}
res.render('landing',{url:url,布局:'landing.hbs'});
});
app.get('/login_error',函数(req,res){
var url='/auth/google';
res.render('landing',{url:url,错误:'show',布局:'landing.hbs'});
});
app.get('/analysis',确保重新验证,函数(req,res){
sess=请求会话;
var email=res.req.user.email;
var domain=res.req.user.\u json.domain;
var img=res.req.user.\u json.image.url;
var id=req.query.id;
console.log(id);
sess.email=encodeURIComponent(电子邮件);
sess.domain=encodeURIComponent(域);
如果(域=='dropbox.com'){
如果(id){
res.render('index',{email:email,img:img,query:id});
}否则{
res.render('index',{email:email,img:img,查询:'});
}
}否则{
res.redirect('/login_error');
}
});
app.get('/auth/google',passport.authenticate('google',{scope:[
'https://www.googleapis.com/auth/plus.login',
'https://www.googleapis.com/auth/plus.profile.emails.read']
}));
app.get(“/auth/google/callback”,
passport.authenticate('google'{
failureRedirect:“/login\u错误”
}),
功能(req、res){
var id=req.query.id;
//身份验证成功,重定向到主页。
如果(id){
res.redirect('/analysis?id='+id);
}否则{
res.redirect('/analysis');
}
}
);
功能确保重新验证(req、res、next){
var id=req.query.id;
sess=请求会话;
如果(请求isAuthenticated()){
返回next();
}否则{
log('需要登录');
如果(id){
res.redirect('/login?id='+id);
}否则{
res.redirect('/login');
}
}
}

我不确定,但我相信google auth不会将您的“查询字符串”发回给您

因此,您可以将您的“id”参数放入会话中:

在此处设置会话:

app.get('/auth/google', function(req, res, next) {
   req.session.analysis_id = req.query.id;
   next();
}, passport.authenticate('google', { scope: [
       'https://www.googleapis.com/auth/plus.login',
       'https://www.googleapis.com/auth/plus.profile.emails.read']
}));
请在此处检索:

app.get('/auth/google/callback',
      passport.authenticate('google', {
        failureRedirect: '/login_error'
      }),
      function(req, res) {
        var id = req.session.analysis_id;
        // Successful authentication, redirect home.
        if (id) {
          res.redirect('/analysis?id=' + id);
        } else {
          res.redirect('/analysis');
        }
      }
    );
你觉得怎么样


干杯

你能解释清楚你想做什么吗?您试图传递什么参数?略微更新了它-我基本上希望根据提供的id加载特定的分析,例如
/analysis?id=1234
。如果尚未验证,则需要初始化OAuth流,然后加载正确的分析,而不是添加
req.session.analysis\u id=req.query.id
/auth/google/
路径中,我将其添加到了ensureAuthenticated函数中,结果成功了!谢谢你建议我使用这个课程!
app.get('/auth/google/callback',
      passport.authenticate('google', {
        failureRedirect: '/login_error'
      }),
      function(req, res) {
        var id = req.session.analysis_id;
        // Successful authentication, redirect home.
        if (id) {
          res.redirect('/analysis?id=' + id);
        } else {
          res.redirect('/analysis');
        }
      }
    );