什么是passport权限认证,它该如何配置呢?
后端系统避免不了要做权限认证,比如本地用户登录,第三方登录
权限认证的思路也极其简单,不外乎就是登录,登出,路由守护三部分
前面的系统中我们通过koa-session做了个简单的登陆权限认证。但是这中写法有很大的局限性,不易于扩展,在koa中有个passport可以帮我们解决系统开发过程中的权认证问题
Passport是一个Node.js中间件,它提供了易于实现的各种不同的请求身份验证策略。默认情况下,它将用户对象存储在会话中
passport目前有很多已经写好的登录策略,比如github登录,微信登录,Facebook登录,google等等
官网 http://passportjs.org/docs/
安装包:
npm i koa-passport –s
安装本地策略:
npm i passport-local -s
本地认证
配置koa-passport:
配置koa-passport:序列化和反序列化
在app.js中应用koa-passport配置:
app.use(passport.initialize()) 会在请求周期ctx对象挂载以下方法与属性
- ctx.state.user 认证用户
- ctx.login(user) 登录用户(序列化用户)
- ctx.isAuthenticated() 判断是否认证
- ctx.logout() 登出
修改登陆、登出等业务逻辑
通过passport增加jwt策略对跨域请求的token进行验证
首先安装依赖:
npm install --save koa-passport (已安装的忽略)
npm install --save passport-jwt
npm install --save jsonwebtoken
流程:
- 当用户登录时,后端会创建签名令牌并将其作为响应返回
- 客户端在本地保存令牌(通常在localStorage中),并在每个需要身份验证的后续请求中将其发回
- 所有需要身份验证的请求都会通过中间件检查提供的令牌,并且只有在验证令牌时才允许请求
登陆时生成token:
在passport.js中添加jwt认证策略
登陆后解析token:passport.authenticate(‘jwt’, { session: false })
完整代码如下:
目录
// passport.js
var LocalStrategy = require('passport-local').Strategy
const userDao = require('../service/user_dao')
const md5 = require('../util/md5solt')
const passport = require('koa-passport')
const JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt;
const opts = {
jwtFromRequest:ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey:"gamercode"// 数字签名,与生成token时的一样,不能告诉用户
}
//jwt验证
passport.use(new JwtStrategy(opts,async (jwt_payload,done)=>{
//jwt_payload 返回的是登录时返回的数据 即payload
console.log(jwt_payload)
const user=await userDao.getUserInfo(jwt_payload.user_id);
if(user){
user.password =''
user.solt=''
done(null,user);
}else{
done(null,false);
}
}))
//本地验