【问题标题】:Can't set a cookie w/ Nuxt.js, Express-Session无法使用 Nuxt.js、Express-Session 设置 cookie
【发布时间】:2018-04-03 18:33:29
【问题描述】:

我是 NUXT 和 SSR 的新手,我已经研究了几个小时,但我似乎无法弄清楚。我正在使用 JWT 在我的 Nuxt 应用程序中使用 Bearer Token 对用户进行身份验证,这在我点击刷新并丢失会话之前运行良好。

现在我希望使用 express-session 和 connect-mongo 来保持会话。我无法在客户端上设置 cookie 以包含在未来的请求中。

当用户通过身份验证时:

router.post('/login', function(req, res) {
  User.findOne({
    username: req.body.username
  }, function(err, user) {
    if (err) throw err;

    if (!user) {
      res.status(401).send({success: false, msg: 'Authentication failed. User not found.'});
    } else {
      // check if password matches
      user.comparePassword(req.body.password, function (err, isMatch) {
        if (isMatch && !err) {
          // if user is found and password is right create a token
          var token = jwt.sign(user.toJSON(), config.secret, { expiresIn: 604800 });
          req.session.authUser = { 'user': 'Test User' }
          return res.json({success: true, token: token, user: user});
        } else {
          res.status(401).send({success: false, msg: 'Authentication failed. Wrong password.'});
        }
      });
    }

上面的 console.log 显示了会话中的 authUser。

Session {
  cookie: 
   { path: '/',
     _expires: 2018-04-03T18:13:53.209Z,
     originalMaxAge: 60000,
     httpOnly: true },
  authUser: { user: 'Test User' } }

当我查看我的 chrome devtools 应用程序 cookie 时,尚未设置 connect.ssid,当我在将来的请求中使用 console.log(req.session) 时,authUser 丢失了。

我的服务器代码是:

// Passport 
var passport = require('passport');
var passportJWT = require("passport-jwt");
var ExtractJwt = passportJWT.ExtractJwt;
var JwtStrategy = passportJWT.Strategy;

// Config File
let config = require('./config/settings.js')

// Initialize Express
var app = express();

// CORS-ENABLE
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "http://127.0.0.1:1337");
  res.header("Access-Control-Allow-Credentials", 'true');
  next();
});
app.use(cors())

const dbPath = 'mongodb://blogUser:blogUserPassword@localhost:27017/blog'

// Express Session
app.use(session({
  secret: 'super-secret-key',
  resave: false,
  saveUninitialized: false,
  store: new MongoStore({ url: dbPath }),
  cookie: { maxAge: 60000 }
}))

// File Upload
app.use(fileUpload());

// view engine setup
// app.set('views', path.join(__dirname, 'views'));
// app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());

app.use(express.static(path.join(__dirname, 'public')));

// Routes
var index = require('./routes/index');
var users = require('./routes/users');
app.use('/api', index);
app.use('/users', users);

// Passport Config
app.use(passport.initialize());
app.use(passport.session())

// mongoose
const options = {
  autoIndex: true, // Don't build indexes
  reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
  reconnectInterval: 500, // Reconnect every 500ms
  poolSize: 10, // Maintain up to 10 socket connections
  // If not connected, return errors immediately rather than waiting for reconnect
  bufferMaxEntries: 0
};

console.log(options);

// Localhost Connect
mongoose.connect(dbPath, options).then(
  () => { console.log("connected !!!"); },
  err => { console.log(err);  }
);

我们不胜感激。

【问题讨论】:

标签: express vuex express-session nuxt.js


【解决方案1】:

如果你想使用服务器,你创建会话的问题是快速路由器,因为更改 res 和 req vars 所以喜欢在 nuxt 中使用它。

const express = require('express');

// Create express router
const router = express.Router()

// Transform req & res to have the same API as express
const app = express()
router.use((req, res, next) => {
  Object.setPrototypeOf(req, app.request)
  Object.setPrototypeOf(res, app.response)
  req.res = res
  res.req = req
  next()
})

【讨论】:

  • 如果你想使用服务器你创建会话的问题是 express 路由器,因为更改 res 和 req vars 所以喜欢在 nuxt 中使用这个。 句子没有任何意义。
【解决方案2】:

你错过了这一步

// Create express router
const router = express.Router()

// Transform req & res to have the same API as express
// So we can use res.status() & res.json()
router.use((req, res, next) => {
  Object.setPrototypeOf(req, app.request)
  Object.setPrototypeOf(res, app.response)
  req.res = res
  res.req = req
  next()
})

req、res参数需要在客户端互换

执行 router.post('/login') 并注销后

app.use('/api', router)

这样就完美了

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2017-06-20
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2022-08-17
    • 2021-04-03
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多