javascript - Express、Passportjs 持久登录不起作用

标签 javascript node.js express passport.js fetch-api

我使用 Express 和 Passport 登录,但出现问题:持久登录 session 不起作用

如果我记录req.isAuthenticated(),它总是false

我正在使用来自 Passport自定义回调fetch 进行调用。从 fetch 收到的数据正在运行:{ success: true, user }

当我不使用自定义回调(见下文)时,它可以工作。

作品

app.post('/login', passport.authenticate('local', { successRedirect: '/',
                                                    failureRedirect: '/login' }));

不工作

app.js

app.use(morgan('tiny'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(express.static(assetPath))
app.use(cookieParser())
app.use(
  session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: true },
  })
)
app.use(passport.initialize())
app.use(passport.session())

routes.js

router.post('/login', (req, res, next) => {
  passport.authenticate('local', ({ user, err, message }) => {
    if (err) {
      return res.send({ user, err, message })
    }

    if (!user) {
      return res.send({ user, err, message })
    }

    req.login(user, function(err) {
      if (err) {
        return next(err)
      }
      return res.send({ success: true, user })
    })
  })(req, res, next)
})

客户:

    fetch(url, {
      method: 'POST',
      credentials: 'include',
      body: JSON.stringify(values),
      headers: { 'Content-Type': 'application/json' },
    })

最佳答案

默认情况下,持久登录存储在 session 中, session 使用签名的 cookie 来识别 future 请求作为同一 session 的一部分。

默认情况下,fetch doesn't send cookies .

您可以通过包含它们来发送 cookie:

fetch(url, {  
  credentials: 'include'  
});

或者您可以使用更现代的身份验证机制,例如 JWT。由你决定。

更新

此外,您正在 session 中设置 secure:true,这是默认设置,也意味着请求必须通过 https 进行,否则 cookie 将被删除。如果您不使用 https,请设置 secure:false。为了获得最佳结果,请将其设置为可以针对生产或开发进行更改的配置设置,因为您始终希望在生产中使用 https。

关于javascript - Express、Passportjs 持久登录不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44355255/

相关文章:

javascript - d3 javascript 单击一行以更改行颜色 - 更改所有行

javascript - 使用 Visual Studio 2008/IE7 在远程站点上调试 JavaScript

javascript - 如何在 jQuery 中验证是否所有复选框都被选中?

javascript - 根据 ECMA,为什么 Javascript 的 MAX_VALUE 是 "approximate"

javascript - 如何在收到获取 POST 请求的响应后将用户重定向到页面?

node.js - npm shrinkwrap 中的 fsevents(由 chokidar 引入)导致构建在 Windows 上失败

node.js - NodeJs环境变量与配置文件

javascript - 使用服务器js中的key从mongo获取数据

javascript - 快速 route 的动态路径

node.js - 访问 Mongoose 模型的快速 Controller 测试?