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