首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Passport OAuth流传递URL参数

通过Passport OAuth流传递URL参数
EN

Stack Overflow用户
提问于 2017-05-12 18:29:44
回答 1查看 3.9K关注 0票数 4

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

例如,我想做的是有一个像/analysis?id=1234这样的url,然后能够加载特定的分析。

一旦您已经通过了身份验证,并且会话还没有过期,它就可以工作了,但是当您还没有经过身份验证时,它就不能工作了。我想我很难把它传递给callbackURL。如有任何指导,将不胜感激!

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

代码语言:javascript
复制
var session = require('express-session');
var storage = require('node-persist');
var passport = require('passport');
var GoogleStrategy = require('passport-google-oauth2').Strategy;

var GOOGLE_CLIENT_ID      = "<google_client_id>"
  , GOOGLE_CLIENT_SECRET  = "<google_client_secret>",
    GOOGLE_CALLBACKURL = "http://localhost:1425/auth/google/callback";

app.use(session({
  maxAge: 86400000, // 24 hours
  secret: 'no-one-will-find-out',
  resave: true,
  saveUninitialized: true
}));

var sess;
app.use(passport.initialize());
app.use(passport.session());
storage.initSync();

passport.use(new GoogleStrategy({
    clientID: GOOGLE_CLIENT_ID,
    clientSecret: GOOGLE_CLIENT_SECRET,
    callbackURL: GOOGLE_CALLBACKURL
  },
  function(accessToken, refreshToken, profile, cb) {
    return cb(null, profile);
  }
));

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

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

app.get('/login', function (req, res) {
  var id = req.query_id;
  if (id) {
    var url = '/auth/google?id=' + id;
  } else {
    var url = '/auth/google';
  }
  res.render('landing', {url: url, layout: 'landing.hbs'});
});

app.get('/login_error', function (req, res) {
  var url = '/auth/google';
  res.render('landing', {url: url, error: 'show', layout: 'landing.hbs'});
});

app.get('/analysis', ensureAuthenticated, function (req, res) {
  sess = req.session;
  var email = res.req.user.email;
  var domain = res.req.user._json.domain;
  var img = res.req.user._json.image.url;
  var id = req.query.id;
  console.log(id);
  sess.email = encodeURIComponent(email);
  sess.domain = encodeURIComponent(domain);
  if (domain == 'dropbox.com') {
    if (id) {
      res.render('index', { email: email, img: img, query: id });
    } else {
      res.render('index', { email: email, img: img, query: '' });  
    }
  } else {
    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_error'
  }),
  function(req, res) {
    var id = req.query.id;
    // Successful authentication, redirect home.
    if (id) {
      res.redirect('/analysis?id=' + id);
    } else {
      res.redirect('/analysis');
    }
  }
);

function ensureAuthenticated(req, res, next) {
  var id = req.query.id;
  sess = req.session;
  if (req.isAuthenticated()) {
    return next();
  } else {
    console.log('need to login');
    if (id) {
      res.redirect('/login?id=' + id);
    } else {
      res.redirect('/login');  
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-12 19:58:03

我不确定,但我相信google不会把你的“查询字符串”发回给你。

所以,也许你可以把你的“身份”副词放在会议上:

在这里设置会话:

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

在这里检索:

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

你觉得那个怎么样?

干杯!

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

https://stackoverflow.com/questions/43944375

复制
相关文章

相似问题

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