使用express和passport未设置cookie

mr.*_*bdo 5 cookies node.js express express-jwt passport.js

我花了很长时间试图找出它不起作用的原因。

我正在使用 React 实现一个登录页面。此页面使用 axios 发送用户并传递到后端(nodejs +express):

const login = useCallback(e => {
    e.preventDefault()
    fetch(process.env.REACT_APP_HOST + '/login', {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        username: e.target.elements.username.value,
        password: e.target.elements.password.value
      })
    })
      .then(response => {
        if (response.ok) {
          return response.json()
        } else if (response.status === 401) {
          throw new Error('Invalid user or pass.')
        } else {
          throw new Error('An error ocurred')
        }
       ...
      })

  }, [])
Run Code Online (Sandbox Code Playgroud)

在后端,我有一条接收这些数据并检查 LDAP 系统的路由。所以我使用 JWT 生成一个令牌并将其保存在令牌上

const express = require('express'),
    passport = require('passport'),
    bodyParser = require('body-parser'),
    jwt = require('jsonwebtoken'),
    cors = require('cors')
    cookieParser = require('cookie-parser')
    LdapStrategy = require('passport-ldapauth');

let app = express();
app.use(cookieParser())
app.use(cors());

....

app.post('/login', function (req, res, next) {

        passport.authenticate('ldapauth', { session: false }, function (err, user, info) {

            const token = jwt.sign(user, env.authSecret)
            res.cookie('cookie_token', token) //it doesn't set the cookie

            if (err) {
                return next(err)
            }
            if (!user) {
                res.sendStatus(401)
            } else {
                return res.status(200).send({ firstName: user.givenName});
            }
        })(req, res, next);
    });
Run Code Online (Sandbox Code Playgroud)

问题是令牌是空的,没有被设置。

Asi*_*man 4

有几件事。在您的 React fetch post 方法中,您需要添加

withCredentials: true,

在 httpheader 旁边。

 fetch(process.env.REACT_APP_HOST + '/login', {
  method: 'POST',
  withCredentials: true,
  credentials: 'include',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    username: e.target.elements.username.value,
    password: e.target.elements.password.value
  })
})
Run Code Online (Sandbox Code Playgroud)

之后,在您的 Node.js 部分中,您将使用 cors 但验证所有来源。这不适用于凭据。您需要使用这样的 cors 来验证特定来源并将凭据转换为 true-

app.use(cors({credentials: true, origin: 'http://localhost:4200'}));
Run Code Online (Sandbox Code Playgroud)

之后你可以通过以下方式发送你的cookie

res.cookie('cookie_token', token, { maxAge: 900000 }) 
Run Code Online (Sandbox Code Playgroud)

chrom 应用程序 cookie 视图

这样 cookie 就会到达,一旦 cookie 到达客户端,您就可以使用 document.cookie 或任何其他包(如“js-cookie”)检索 cookie

  • 我解决了它,我按照你的建议做了,我只更改了这段代码:`credentials: 'include',` (2认同)