登录接口设计
① 编写流程
登录用户路由router编写;
处理登录函数Login的controller编写;
操作数据库的service编写;
② 登录用户基本逻辑设计
编写验证登录中间件
//目录:@/middleware/auth_middleware.js // 用户登录验证中间件 const verifyLogin = async(ctx,next)=>{ console.log('验证登录成功的midleware'); // 1. 获取用户名和密码 const {name, password} = ctx.request.body // 2.判断用户名和密码是否为空 if(!name ||!password || name ===''||password ===''){ const error = new Error(errorTypes.NAME_OR_PASSWORD_IS_REQUIRED) return ctx.app.emit('error',error,ctx) } // 3. 判断用户是否存在 const result = await userServiece.getUserByName(name); const user = result[0]; // console.log(user); if(!user){ const error = new Error(errorTypes.USER_DOES_NOT_EXISTS) return ctx.app.emit('error',error,ctx) } // 4. 判断密码是否与数据库的存储一致 if(md5password(password) != user.password){ const error = new Error(errorTypes.PASSWORD_IS_INCORRENT) return ctx.app.emit('error',error,ctx) } ctx.user = user; await next(); }
登录返回凭证
① 生成公钥和私钥
注意:这里补充一下cookie和token的相关知识 http://t.csdn.cn/u4tO1
引入keys(参考http://t.csdn.cn/u4tO1 )–>将公钥和私钥写入配置文件下(src/app/config.js)
② 派发令牌
③ 编写验证测试接口
④ 验证令牌(授权中间件0)
//目录:@/middleware/auth_middleware.js const verifyAuth = async(ctx,next)=>{ console.log('授权验证middleware(判断是否登录)'); // 1. 获取token const authorization = ctx.headers.authorization; if (!authorization) { const error = new Error(errorTypes.UNAUTHORIZATION); return ctx.app.emit('error', error, ctx); } const token = authorization.replace('Bearer ','') // 2. 验证token try{ const result = jwt.verify(token,PUBLIC_KEY,{ algorithms:["RS256"] }); ctx.user = result // console.log(ctx.user) await next(); }catch(err){ const error = new Error(errorTypes.UNAUTHORIZATION) ctx.app.emit('error',error,ctx) } }