Express + Passport.js:req.user 未定义

Posted

技术标签:

【中文标题】Express + Passport.js:req.user 未定义【英文标题】:Express + Passport.js: req.user is UNDEFINED 【发布时间】:2018-03-12 02:33:01 【问题描述】:

我有一个快速 API 服务器和一个单独的 create-react-app 应用程序,没有代理。我使用 passport.js 进行 OAuth,它在 MongoDB 中查找以反序列化用户。

在后端,我设置了 cors 中间件,在前端,我使用我的服务器 URL 配置了 axios 基本 URL。

在 URL 栏中使用邮递员/手动编写端点,我的 API 请求成功并找到了 req.user。但是如果我使用 axios 从前端发出 API 请求,req.user 未定义或为空字符串。

我想不通,请帮帮我,伙计们。

middlewares.js

  app.use(cors())

  app.use(cookieSession(
    maxAge: 30 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey]
  ))

  app.use(compression())

  if (process.env.NODE_ENV !== 'production') 
    app.use(morgan('tiny'))
  

  app.use(bodyParser.json())

  app.use(helmet())

  app.use(passport.initialize())
  app.use(passport.session())

authRoutes.js

  app.get(
    '/auth/current_user',
    (req, res) => 
      res.send(req.user)
      console.log(req.user) // UNDEFINED ONLY WITH AXIOS IN REACT APP
    
  )

actions.js

axios.defaults.baseURL = process.env.REACT_APP_API_URL

export const fetchUser = () => async dispatch => 
  const  data  = await axios.get('/auth/current_user')
  console.log('USER DATA: ')
  console.log(data === '') // TRUE
  dispatch(
    type: FETCH_USER,
    payload: data
  )

passport-config.js

passport.serializeUser((user, done) => 
  done(null, user.id)
)

passport.deserializeUser((id, done) => 
  User.findById(id).then(user => 
    done(null, user)
  )
)

重现步骤:

克隆服务器https://github.com/darioielardi/triplan-server

克隆客户端https://github.com/darioielardi/triplan-client

在服务器上:npm run start-dev

在客户端:npm start

当您使用 google 登录时,身份验证流程正常,但是(正如您在“网络”chrome devtools 选项卡中看到的那样)“/auth/current_user”api 请求具有 response.data ===“”

【问题讨论】:

那么您如何使用 axios 发送用户?在您的代码中,它取决于请求,而您的 axios 不发送任何请求,那么您如何期望用户在那里? 我不想发送用户,我想获取用户。使用护照,用户应该在 req.user 中,所以使用 axios 我想在我的反应应用程序中获取用户数据。 这没有意义你知道我在说什么吗?看看你的代码。您没有发送任何身份验证标头。 使用护照配置更新问题 所以当这个块const data = await axios.get('/auth/current_user')运行时你已经登录了吗? 【参考方案1】:

我想我已经找到了解决方案。

后端

首先你必须安装 cors npm install --save cors,然后粘贴这段代码。

import cors from 'cors'

app.use(cors(
  methods:['GET','POST'],
  credentials: true 
))

前端

将 axios 与凭据和标头选项一起使用:

const config = 
  withCredentials: true,
  headers: 
    'Content-Type': 'application/json',
  ,
;
axios.post('http://localhost:8000/routes/register', user, config);

希望对您或其他人有所帮助。

【讨论】:

以上是关于Express + Passport.js:req.user 未定义的主要内容,如果未能解决你的问题,请参考以下文章

快速会话与passport.js?

连续登录后未定义 Passport context.req.user (express/graphql)

Passport.js - req.isAuthenticated 不是一个函数

req.user 是不是传递给客户端?

Passport.js 在 req.login 上失败

Passport js 无法跨域维护会话