javascript - Node + Express + Passport : req. 用户未定义但在 Postman 中工作

标签 javascript node.js express authentication passport.js

我的问题与此类似one ,那里的所有答案都没有帮助我。

我将 Passport.js 与本地策略 (passport-local-mongoose) 结合使用。 下面的中间件适用于 Postman,但每当我从我的 React 客户端尝试时都会失败。

exports.isLoggedIn = (req, res, next) => {
  console.log(req.user) // undefined with react, but works from postman
  if (req.isAuthenticated()) {
    return next();
  }
}

这是我的 app.js:

require('./handlers/passport');
app.use(cors())
app.use(session({
  secret: process.env.SECRET,
  key: process.env.KEY,
  resave: true,
  saveUninitialized: true,
  store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
app.use(passport.initialize());
app.use(passport.session());

handlers/passport.js:

const passport = require('passport');
const mongoose = require('mongoose');
const User = mongoose.model('User');

passport.use(User.createStrategy());

passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

user.js(模型):

...
userSchema.plugin(passportLocalMongoose, { usernameField: 'email' });

客户端代码:

const url = 'http://localhost:7777/users/<id>';
const config = {
  headers: {
    'Content-Type': 'application/json',
  },
};

axios.put(url, data, config)
  .then(res => console.log(res))
  .catch(err => console.log(err));

我错过了什么吗? passportLocal 策略是否意味着我不能像我的示例那样使用 API 和客户端?谢谢:D

最佳答案

所以,一段时间后我找到了答案:

服务器发送 SetCookie header ,然后浏览器句柄来存储它,然后将 cookie 与在 Cookie HTTP header 内向同一服务器发出的请求一起发送。

我必须在我的客户端中设置 withCredentials: true。 (axios.js)

const config = {
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json',
  },
};

axios.put(url, { page: '123' }, config)
  .then(res => console.log('axios', res))
  .catch(err => console.log('axios', err));

然后我遇到了 CORS 问题。

所以我将其添加到我的快速服务器中:

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Origin', req.headers.origin);
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
  res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
  if ('OPTIONS' == req.method) {
    res.send(200);
  } else {
      next();
  }
});

关于javascript - Node + Express + Passport : req. 用户未定义但在 Postman 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45536831/

相关文章:

javascript - 如何让 iframe 在现有页面顶部的页面前面加载?

node.js - 指南针 :server not found when running `grunt server`

node.js - 如何在单个液滴上将不同的 MERN 应用程序部署到 digital ocean ?

javascript - BNF 或任何其他符号的 Excel 公式语法

javascript - 我可以创建一个 ESLint 规则来允许所有全局变量匹配一个正则表达式吗?

javascript - 使用快速验证器注册时如何验证用户用户名

javascript - 如何使用 Node.js、EJS 模板和动态文件名进行多重渲染

javascript - 表示 this 在函数之间返回 null

javascript - JSON 返回未定义

node.js - `aws s3 sync`如何判断一个文件是否已经更新?