Express,Passportjs 持久登录不起作用

Express, Passportjs persistent login not working

我正在使用 Express 和 Passport 登录,但有一个问题:持久登录会话不起作用

如果我记录 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' },
    })

默认情况下,持久登录存储在会话中,它使用签名的 cookie 将未来的请求识别为同一会话的一部分。

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

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

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

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

更新

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