node.js-token&mocha&koa

1、token

  • 使用token的步骤如下

    • 用户登录 服务器端产生一个token (加密字符串) 发送给前端 。(后端)

    • 前端将token 进行保存 (最好使用cookie,设置过期期限)。(前端)

    • 前端发起数据请求的时候携带token 。(前端)

    • 服务端 验证token 是否合法 :如果合法继续操作;不合法终止操作。(后端)

    • token 的使用场景 :无状态请求 保持用户的登录状态 第三方登录(token+auth2.0)

      前端代码:

      <!DOCTYPE html>
      <html lang="en">
      
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Document</title>
          <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css"
              integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
          <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
      </head>
      
      <body onload="loadFn()">
          <div class="container">
              <div class="row">
                  <div class="form-group">
                      <label for="">用户名:</label>
                      <input type="text" name="" id="" class="form-control username" placeholder="" aria-describedby="helpId">
                  </div>
              </div>
              <div class="row">
                  <div class="form-group">
                      <label for="">密码:</label>
                      <input type="password" class="form-control password" name="" id="" placeholder="">
                  </div>
              </div>
              <div class="row">
                  <button type="button" class="btn btn-primary login">登录</button>
              </div>
          </div>
          <script>
              function loadFn() {
                  var token = localStorage.getItem('token');
                  //判断token值是否存在,如果存在直接自动登录。
                  if (token) {
                      location.href = 'index.html'
                  } else {
                      alert('你需要登录')
                  }
              }
      
              $('.login').on('click', function () {
                  $.ajax({
                      type: 'post',
                      url: 'http://localhost:3000/login',
                      data: {
                          name: $('.username').val(),
                          pass: $('.password').val(),
                          //传递数据给后端的时候要带上token值。
                          token: localStorage.getItem('token')
                      },
                      success(data) {
                          console.log(data);
                          const result = JSON.parse(data);
                          //接收后端传过来的状态码,存token值。
                          if (result.status === 1) {
                              localStorage.setItem('token', result.token);
                          }       }
      
                  })
              })
          </script>
      </body>
      
      </html>
      

      后端代码:

      const express = require( 'express' )
      const fs = require( 'fs' )
      const jwt = require( 'jsonwebtoken' )
      const router = express.Router()
      const path = require( 'path' )
      
      router
        .route('/login')
        .post(( req,res,next ) => {
      	//解决跨域
          res.setHeader('Access-Control-Allow-Origin','*')
          const { token,username,password } = req.body 
          if( token ){
            //证明有值
            res.render('login',{
              data: JSON.stringify({
                info: '登录成功',
                status: 1
              })
            })
          } else {
            // 第一次登录 或是 token失效 
            // 重新生成token  返回给前台
            // 1. 通过文件系统读取私钥
            let 			private_key=fs.readFileSync(path.join(__dirname,'../rsa/private_key.pem'))
            var use_token = jwt.sign( username, private_key,{ algorithm: 'RS256'});
            /* 
              payload: 负载也就是数据,这里是值用户名
              private_key: 通过openSSL 生成的私钥 
              RS256: 算法
            */
           res.render('login',{
             data: JSON.stringify({
               info: '登录成功',
               status: 1,
               token: use_token
             })
           })
          }
        })
      
      module.exports = router
      

2、mocha

  • mocha概念:Mocha是一个在Node.js和浏览器上运行的功能丰富的JavaScript测试框架,使异步测试变得简单而有趣。*Mocha测试以串行方式运行,允许灵活准确的报告,同时将未捕获的异常映射到正确的测试用例。在GitHub托管

3、koa

  • koa概念:Koa 就是一种简单好用的 Web 框架。它的特点是优雅、简洁、表达力强、自由度高。本身代码只有1000多行,所有功能都通过插件实现,很符合 Unix 哲学。

  • 使用koa实现一个简单的服务器。

    const Koa = require( 'koa' )
    const app = new Koa() 
    
    //引入路由模块
    const homeRouter = require( './route/home.js' )
    const aboutRouter = require( './route/about.js')
    
    const host = 'localhost'
    const port = 3000
    
    app.use( homeRouter )
    app.use( aboutRouter )
    
    app.listen( port,host,() => {
      console.log(`服务器运行在: http://${ host}:${ port } `)
    })
    

    home.js

    const route = require( 'koa-route' )
    
    const homeRoute = route.get('/home', ctx => {
      ctx.response.body = 'hello home'
    })
    
    module.exports = homeRoute
    

    about.js

    const route = require('koa-route')
    
    const aboutRoute = route.get('/about', ctx => {
      ctx.response.body = 'hello about'
    })
    
    module.exports = aboutRoute
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值