想问一个关于 koa2 和 koa-passport 的 Nodejs 相关问题

想问一个关于 koa2 和 koa-passport 的 Nodejs 相关问题

我设立的本地验证策略已经成功的调用了 done 方法,但是返回到 assport.authenticate()后,ctx 中没有 login 这个函数,我比较了下别人的 demo 也没什么不一致的地方,求教!

// User.js

router.post('/login', async (ctx, next) => {
  return passport.authenticate('local', function(err, user, info, status) {
    if (err) {
      ctx.body = {
        code: -1,
        msg: err
      }
    } else {
      //拿到登陆用户
      if (user) {
        ctx.body = {
          code: 0,
          msg: '登陆成功',
          user
        }
        return ctx.login(user)
      } else {
        ctx.body = {
          code: 1,
          msg: info
        }
      }
    }
  })(ctx,next)
})
// ./util/passport.js

const passport = require('koa-passport')
const localStrategy = require('passport-local')
const UserModel = require('../db/models/user')

passport.use(
  new localStrategy(async (username, password, done) => {
    let where = {
      username
    }
    let result = await UserModel.findOne(where)
    if (result != null) {
      if (result.password === password) {
        return done(null, result)
      } else {
        return done(null, false, '密码错误')
      }
    } else {
      return done(null, false, '用户不存在')
    }
  })
)

passport.serializeUser((user, done) => {
  done(null, user)
})

passport.deserializeUser((user, done) => {
  return done(null, user)
})

module.exports = passport


8 回复

没人吗。。。。


koa-passport 版本?

已经解决,中间件调用顺序错了
<br>app.use(passport.initialize())<br>app.use(passport.session())<br>
应该放在 router 前面

我是看见你的头像点进来的。

我是看见你的头像点进来的。

其实 ctx 少了什么东西,第一想的不就该是有没有调用中间件么…

可以请教一个问题吗?done(null, false, ‘密码错误’)这里的处理,是在 passport.authenticate 里面可以得到密码错误这个信息吗?一直搞不懂 passport 里的 done()处理之后,要在哪里能拿到它的处理.

当然,关于 Koa2 和 Koa-Passport 的 Node.js 问题,我很乐意帮你解答。这两个库通常一起用于构建具有身份验证功能的 Web 应用。

Koa2 是一个新的基于 Node.js 的 web 框架,它设计得更为轻量和模块化。Koa-Passport 是一个中间件,它利用 Passport.js 库为 Koa 提供身份验证功能。Passport.js 是一个灵活且强大的 Node.js 身份验证中间件,支持多种身份验证策略,如 OAuth、JWT 等。

以下是一个简单的示例,展示如何在 Koa2 中使用 Koa-Passport 进行身份验证:

const Koa = require('koa');
const Router = require('koa-router');
const passport = require('koa-passport');
const LocalStrategy = require('passport-local').Strategy;

const app = new Koa();
const router = new Router();

passport.use(new LocalStrategy((username, password, done) => {
  // 在这里进行身份验证逻辑
  if (username === 'test' && password === 'password') {
    return done(null, { id: 1, username: 'test' });
  } else {
    return done(null, false, { message: 'Invalid credentials' });
  }
}));

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

passport.deserializeUser((id, done) => {
  // 查找用户并返回
  done(null, { id: id, username: 'test' });
});

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

router.post('/login', passport.authenticate('local', { failureRedirect: '/' }), (ctx) => {
  ctx.body = 'Login successful';
});

app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

这个示例展示了如何使用本地策略进行身份验证。你可以根据需要替换为其他策略。

回到顶部