node.js - Passport.js 和 Restify 的 session 问题

标签 node.js session authentication passport.js restify

我正在尝试开发一个简单的概念证明,该概念将 Passport 的 Google 身份验证策略与 Restify 和 Bookshelf.js 结合使用。我希望这个简单的应用程序能够让我解析/sessions/google 路由(调用 Google 身份验证)并在身份验证成功后重定向到/sessions/googleReturn。对于这个简单的概念证明,请假设与用户模型对应的表包含正在进行身份验证的用户的记录。

下面是我目前正在尝试的代码。目前,此代码会在身份验证后导致无限重定向循环。如果我删除/sessions/googleReturn 路由中的 'passport.authenticate('google', { failureRedirect: '/' })' 行,/sessions/googleReturn 会解析,但 req.user 返回一个空对象。我猜我没有初始化 session 或将 session 正确绑定(bind)到 Passport 。 Passport 方法内的 console.log 输出似乎被抑制,这使得调试变得困难。如果我用 express/express-session 替换 Restify/client-session,我的概念验证就有效。我究竟做错了什么?提前致谢。

var restify = require('restify');
var sessions = require('client-sessions');
var passport = require('passport');
var GoogleStrategy = require('passport-google').Strategy;
var User = require('./models/user'); // Bookshelf model

var server = restify.createServer({ name: 'test-server' });

server
  .use(sessions({
    cookieName: 'user',
    secret: 'topsecret',
    duration: 365 * 24 * 60 * 60 * 1000}))
  .use(passport.initialize())
  .use(passport.session());

passport.serializeUser(function(user, done) {
  console.log('serialize user:', user);
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  console.log('deserialize user:', id);
  new User({ id: id }).fetch({require: true}).then(function(user) {
    done(null, user);
  }).catch(function(err) {
    done(err, null);
  });
});

passport.use(
  new GoogleStrategy({
    returnURL: 'http://localhost:3000/sessions/googleReturn',
    realm: 'http://localhost:3000'
  },
  function(identifier, profile, done) {
    console.log('Hello from the verify callback', identifier, profile);
    new User({ email: profile.emails[0].value }).fetch({require: true}).then(function(user) {
      done(null, user);
    }).catch(function(err) {
      done(err, null);
    });
  }
));

server.listen(3000, function () {
  console.log('%s listening at %s', server.name, server.url);
});

server.get('/', function(req, res, next) {
  res.send(200, 'Hello from root route.');
  return next();
});

server.get(
  '/sessions/google',
  passport.authenticate('google')
);

server.get(
  '/sessions/googleReturn',
  passport.authenticate('google', { failureRedirect: '/' }),
  function(req, res, next) {
    console.log('Session user data?', req.user);
    res.send(200, 'Hello from Google auth return route.');
    return next();
  }
);

最佳答案

如果您看到 google auth 的响应,它会显示 302 已暂时移动。 此外,google openid 也已被弃用,并被 google-plus 登录取代。

Google OpenID:https://developers.google.com/accounts/docs/OpenID

如果您想使用,有一个用于 google-plus 登录的 npm 模块。

npm 安装 Passport-google-plus https://www.npmjs.com/package/passport-google-plus

关于node.js - Passport.js 和 Restify 的 session 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28597549/

相关文章:

php - 如果用户尚未登录,我如何拒绝他们访问我的 Backbone 应用程序的某些部分?

wcf - IIS 6.0 上 WCF 中的集成 Windows 身份验证

java - 应用引擎 : creating my own UserService?

node.js - 为棋盘游戏 session 数据保留数据时,redisJSON 是否比普通 redis 更好?

javascript - 如何将 100 万条记录异步保存到 mongodb?

node.js - Sails js::测试传递给 View 的变量

python - reactjs 如何从 django 访问 session 数据(用户名)

node.js - NodeJS 管道损坏导致我的 Express api 停止工作

node.js - 如何处理多个帐户服务器上的 session /同时水平扩展?

ruby - Rack::Session::Pool 与 Sinatra