简体   繁体   English

将 Passport.js 与 Typescript 结合使用

[英]Using Passport.js with Typescript

This is my passport local config.这是我的护照本地配置。 I'm wrapping it inside a function so I can use it some where else:我将它包装在一个函数中,这样我就可以在其他地方使用它:

export const LocalPassport = (passport: any, strategy: any) => {
  passport.use(
    new strategy(
      {
        usernameField: 'email',
        passwordField: 'password',
        passReqToCallback: true,
        session: false,
      },
      async (req: Request, email: string, password: string, done: any) => {
        try {
          const user = await AuthService.findUserByEmail(email)

          if (!user) {
            return done(null, false)
          }

          const passCheck = bcrypt.compare(password, user.password)
          if (!passCheck) {
            return done(null, false)
          }

          return done(null, user)
        } catch (error) {
          console.log(error)
        }
      }
    )
  )
}

And I use it in my login router:我在我的登录路由器中使用它:

import express from 'express'
import passport from 'passport'
import Strategy from 'passport-local'
import bodyParser from 'body-parser'

import { createUser } from '../controllers/auth'
import FormValidate from '../middlewares/FormValidate'
import { LocalPassport } from '../config/passport'

import User from '../models/User'

LocalPassport(passport, Strategy.Strategy)

const router = express.Router()
router.use(passport.initialize())
router.use(bodyParser.urlencoded({ extended: false }))
router.use(bodyParser.json())

//**path for api/v1/auth */
router.post('/register', FormValidate.register, createUser)
router.post('/login', passport.authenticate('local'), async (req, res) => {
  try {
    res.send('logged in')
  } catch (error) {
    console.log(error)
  }
})

export default router

When I test this route from postman, I received a long list of errors, but it starts with: RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: undefined I tried to console.log and I can see bcrypt compares return true , I believe the error happens after done is invoked当我从邮递员那里测试这条路线时,我收到了一长串错误,但它以: RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: undefined我试图console.log并且我可以看到 bcrypt compares 返回true ,我相信错误调用done后发生

What am I doing wrong here ??我在这里做错了什么? And how should I replace the any types in passport config file.我应该如何替换护照配置文件中的any类型。 Thanks for your help.谢谢你的帮助。

So I figured the error was because I did not set up session for passport, and after authentication it tried to set up a session, hence the error.所以我认为错误是因为我没有为护照设置会话,并且在身份验证后它尝试设置一个会话,因此出现了错误。 I fixed this by:我通过以下方式解决了这个问题:

router.post('/login', passport.authenticate('local', {session: false}), async (req, res) => {
  try {
    res.send('logged in')
  } catch (error) {
    console.log(error)
  }
})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM