# passport **Repository Path**: wsgtop/passport ## Basic Information - **Project Name**: passport - **Description**: passport登录的demo案例 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-03 - **Last Updated**: 2022-07-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # koa-passport使用Demo 在看其它人在GitHub上的代码的时候,发现了有人登录使用了一个叫做passport的轮子,百度了一下,发现官网是英文的,写的使用文档十分简单,不能运行,看了下sf上的文章,测试后才能运行,写一个简单的笔记用来记录此次的坑。 官网地址 https://www.passportjs.org/ ## 安装的包 - koa-bodyparser 解析post请求的body。 可使用 koa-body替换 - koa-session 服务端存session是使用 - koa-redis 用户登录存储信息的地方,其实就是在存储session信息 - koa-passport Node.js的身份验证中间件 - passport-local 登录使用本地策略 运行命令安装 `yarn add koa-bodyparser koa-session koa-redis koa-passport passport-local `
或`npm install koa-bodyparser koa-session koa-redis koa-passport passport-local -S` ## 需要的环境 - 查库使用的数据库 MYSQL | MongoDB | 其它 - 存储session的缓存件 redis | 其它 ## 序列化和反序列化的操作 这里使用 passport-local 策略(本地权限认证)为例子。 passport使用之前要定义策略及序列化与反序列化操作,这个应该就是这样设置的吧,把 passport 的配置及策略写到一个文件passport.js passport.js中定义策略 ``` javascript import passport from "koa-passport"; import passportLocal from "passport-local"; const LocalStrategy = passportLocal.Strategy // 序列化ctx.login()触发 passport.serializeUser(function (user, done) { console.log("serializeUser: ", user); done(null, user.id); }); // 反序列化(请求时,session中存在"passport":{"user":"1"}触发) passport.deserializeUser(async function (id, done) { console.log("deserializeUser: ", id); const user = { id: 1, username: "admin", password: "123456" }; done(null, user); }); // 提交数据(策略) passport.use( new LocalStrategy( { // usernameField: 'username', // passwordField: 'password' }, function (username, password, done) { // 这个地方的user其实应该查询DB,找出真正的用户登录信息,进行密码验证,这里只是一个demo,没有调用DB,而是将用户信息写成了一个常量。 const user = { id: 1, username: username, password: password }; // done是路由调用返回的参数,定义几个返回几个 done(null, user, { msg: "this is a test" }); // done(err, user, info) } ) ); export default passport; ``` 入口文件app.js中加载策略 ```javascript import passport from "./passport.js"; import bodyParser from "koa-bodyparser"; import session from "koa-session"; import RedisStore from "koa-redis"; app.keys = ["em:"]; app.use(bodyParser()); log.warn(); app.use( session( { cookie: { secure: false, maxAge: 86400000 }, store: RedisStore({...config.get("redis")}), }, app ) ); app.use(passport.initialize()); app.use(passport.session()); ``` login.js 路由文件中调用策略,authenticate就是使用登录验证策略调用,后面一定要有一个ctx传入,不然无法运行 ```javascript import Router from "koa-router"; const router = new Router(); import passport from "../../passport.js"; router.post("/", async (ctx) => { const body = ctx.request.body; return passport.authenticate("local", async (err, user, info) => { ctx.body = user; return ctx.login({ id: 1, username: "admin", password: "123456" }); })(ctx); }); export default router; router.get("/", async (ctx) => { ctx.body = "login"; }); ```