Nodejs Koa用户认证插件koa-passport的使用

Nodejs Koa用户认证插件koa-passport的使用
koa-passport 是一个用于 Koa 框架的身份验证中间件,它基于流行的 passport.js 库。以下是一个简单的示例,展示如何在 Koa 项目中使用 koa-passport

安装依赖

首先,你需要安装必要的依赖:

npm install koa koa-router koa-passport passport passport-local

配置 Passport

接下来,配置 passportkoa-passport。创建一个名为 auth.js 的文件,并添加以下内容:

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

// 用户模型
const User = require('./models/User');

// 使用 LocalStrategy 进行本地认证
passport.use(new LocalStrategy(
  function(username, password, done) {
    // 在数据库中查找用户
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!user.verifyPassword(password)) { return done(null, false); }
      return done(null, user);
    });
  }
));

// 序列化和反序列化用户
passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

创建 Koa 应用

现在,在你的主应用文件(如 app.js)中,设置 Koa 应用并使用 koa-passport 中间件:

const Koa = require('koa');
const Router = require('koa-router');
const passport = require('koa-passport');

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

// 使用 passport 中间件
app.use(passport.initialize());
app.use(passport.session());

// 登录路由
router.post('/login', passport.authenticate('local'), async ctx => {
  ctx.body = '登录成功';
});

// 注册路由
router.post('/register', async ctx => {
  const { username, password } = ctx.request.body;
  const user = new User({ username, password });
  await user.save();
  ctx.body = '注册成功';
});

// 保护路由
router.get('/protected', passport.authenticate('local', { session: false }), async ctx => {
  ctx.body = '受保护的路由';
});

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

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

创建用户模型

最后,创建一个用户模型文件 models/User.js,用于处理用户数据:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true }
});

userSchema.methods.verifyPassword = function(password) {
  return this.password === password; // 简单的密码验证
};

module.exports = mongoose.model('User', userSchema);

运行应用

确保你已经设置了 MongoDB 并且 mongoose 已经连接到数据库。然后运行你的应用:

node app.js

访问 /login/protected 路由进行测试。这个示例展示了基本的用户认证流程,你可以在此基础上进行扩展和改进。


3 回复

当然!koa-passport 是一个用于 Koa 框架的身份验证中间件。它支持多种策略,比如本地认证、OAuth 等。首先,你需要安装必要的包:

npm install koa passport passport-local

接下来,在你的 Koa 应用中配置 Passport:

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

// 配置本地认证策略
passport.use(new LocalStrategy(
  function(username, password, done) {
    // 这里应该去数据库检查用户名和密码
    if (username === 'admin' && password === '123456') {
      return done(null, { id: 1, username: 'admin' });
    } else {
      return done(null, false);
    }
  }
));

// 序列化和反序列化用户
passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  // 根据用户ID从数据库获取用户信息
  done(null, { id: 1, username: 'admin' });
});

const app = new Koa();
app.use(passport.initialize());
app.use(passport.session());

// 登录路由
app.use(require('koa-router')().post('/login', passport.authenticate('local'), ctx => {
  ctx.body = "登录成功";
}));

app.listen(3000);

这样,你就有了一个基本的登录系统。koa-passport 的文档中有更多高级配置和策略,你可以根据需要进行探索。祝你编程愉快!


koa-passport 是一个用于 Koa 框架的身份验证中间件,它通常与 passport 一起使用来处理各种身份验证策略。下面是一个简单的示例,展示如何在 Koa 应用中设置和使用 koa-passport

首先,你需要安装必要的依赖:

npm install koa koa-router koa-passport passport passport-local bcryptjs jsonwebtoken

这里我们使用了 koa-passport 来进行认证,passport 作为核心模块,passport-local 用于本地策略认证,bcryptjs 用于密码加密,jsonwebtoken 用于生成 JWT。

接下来,配置你的应用:

  1. 创建 Koa 应用
const Koa = require('koa');
const Router = require('koa-router');
const passport = require('koa-passport');
const LocalStrategy = require('passport-local').Strategy;
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');

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

// 使用 passport 中间件
app.use(passport.initialize());
app.use(passport.session());

// 配置本地策略
passport.use(new LocalStrategy(
    async (username, password, done) => {
        try {
            // 这里应该是从数据库中查找用户
            const user = { id: 1, username: 'test', password: await bcrypt.hash('test', 8) };
            const isMatch = await bcrypt.compare(password, user.password);
            if (isMatch) {
                return done(null, user);
            } else {
                return done(null, false, { message: 'Invalid credentials.' });
            }
        } catch (error) {
            return done(error);
        }
    }
));

// 用户序列化和反序列化
passport.serializeUser((user, done) => {
    done(null, user.id);
});

passport.deserializeUser(async (id, done) => {
    try {
        const user = { id: 1, username: 'test' }; // 这里应该查询数据库
        done(null, user);
    } catch (err) {
        done(err, null);
    }
});

// JWT 生成
function generateToken(user) {
    return jwt.sign({ id: user.id }, 'secret', { expiresIn: '1h' });
}

// 登录路由
router.post('/login', async (ctx, next) => {
    await passport.authenticate('local', async (err, user) => {
        if (!user) {
            ctx.body = { success: false, message: 'Authentication failed.' };
        } else {
            ctx.state.user = user;
            ctx.body = { success: true, token: generateToken(user) };
        }
    })(ctx, next);
});

// 认证保护路由
router.get('/protected', passport.authenticate('jwt', { session: false }), (ctx) => {
    ctx.body = { message: 'You are authenticated!' };
});

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

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

以上代码展示了如何使用 koa-passportpassport-local 策略来实现基本的登录和受保护路由。请根据实际情况调整数据库查询逻辑。

koa-passport 是用于 Koa 框架的认证中间件,通常与 @koa/routerkoa-session 等其他库一起使用。首先安装必要的依赖:

npm install koa Passport passport-local koa-router koa-session

配置 Passport 并设置本地策略:

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

// 配置策略
Passport.use(new LocalStrategy(
  function(username, password, done) {
    // 验证逻辑...
  }
));

// 序列化和反序列化用户
Passport.serializeUser(function(user, done) {
  done(null, user.id);
});

Passport.deserializeUser(function(id, done) {
  // 根据 id 查找用户...
});

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

app.keys = ['secret'];
app.use(session({}, app));
app.use(Passport.initialize());
app.use(Passport.session());

// 使用路由
router.post('/login', Passport.authenticate('local'), ctx => {
  ctx.body = { message: '登录成功' };
});

app.use(router.routes());

这只是一个基本示例,你需要根据实际需求调整代码。

回到顶部