node.js实现token身份验证

2018-1-18    分类: 前端资源

node token node.js node

《token理解、学习》

 

安装必要模块:

//koa-jwt 中间件,使用后为每个路由添加校验方法,就不需要一个个手动添加
npm install -S koa-jwt


//生成token
npm install -S jsonwebtoken

 

 

1,假设用户使用正确的帐号和密码登录,后台就会生成一个token,返回给浏览器

const jwt = require('jsonwebtoken');
//生成token
const token = jwt.sign({
  name: 123
  },'user_pass_xxx' //随便一点内容,撒盐:加密的时候混淆
  ,{
     expiresIn: 60 //60秒到期时间
});

 

生成的token内容类似于:(以下代码是JWT数据格式,具体可以参考地址)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoxMjMsImlhdCI6MTQ5MTQ3NTQyNCwiZXhwIjoxNDkxNDc1NDg0fQ.hYNC4qFAyhZClmPaLixfN137d41R2CFk1xPlfLK10JU

 

//解密token
jwt.verify(token, 'user_pass_xxx', function (err, decoded) {
  if (!err){
     console.log(decoded.name); //会输出123,如果过了60秒,则有错误。
  }
})

 

 

2,把token用cookies存储在本地里,每次请求需要用帐号和密码校验对了才能显示的页面时,就必须把token从cookies里提取出来把token值带入到request headers,之后服务器才能获取到token值。

使用ajax把token值传入到request headers后在带给后台

 

 

3,服务器获取到客服端从request headers带入的token值后,就可以进行逻辑判断了,如果有token值并没过期就显示出相应的页面或数据

 

const app = new Koa()
const koajwt = require('koa-jwt')
app.use(koajwt({secret: 'user_pass_xxx'}).unless({path:[/^\/api\/login/, /^\/api\/register/]})) //usless排除进行jwt校验的路由
                                        //unless({ path: ['/public']}) ,每个路由都要校验token除了,访问/public路由时不需要


//在路由中处理
const router = require('koa-router')()
router.post('/xxx', async ctx => {
  const token = ctx.state.user //从request headers带入token值,才能使用这种方法获取
  console.log(token.id)
  console.log(token.secret)
}




 

 

 

//单独为某个路由添加校验

get('/helloworld', koajwt({
 secret: 'user_pass_xxx', // Should not be hardcoded
}), async(ctx) => {
 ctx.body = 'helloworld page!' //通过了token才能显示内容
})

 

参考文章有:

https://www.dengxiangxing.com/post/42072

http://yunzaifei.github.io/2017/09/22/koa2%E5%BC%80%E5%8F%91%E7%9A%84api%E6%9C%8D%E5%8A%A1%E5%8F%8Ajwt%E5%BA%94%E7%94%A8/

https://www.jianshu.com/p/a7882080c541

https://segmentfault.com/a/1190000009494020

https://www.npmjs.com/package/jsonwebtoken