token

token

  • 身份验证
    http 请求的无状态性

  • JWT (jsonwebtoken)

  1. 用户登录 服务器端产生一个token (加密字符串) 发送给前端
  2. 前端将token 进行保存
  3. 前端发起数据请求的时候携带token
  4. 服务端 验证token 是否合法 如果合法继续操作 不合法终止操作
  5. token 的使用场景 无状态请求 保持用户的登录状态 第三方登录(token+auth2.0)
  • 小案例:登录页面
  1. 先打开终端,运行下面代码:
    在这里插入图片描述
  2. cd 进入token_demo,再安装依赖性文件:
    在这里插入图片描述
  3. 打造一个简单的接口文件(login.js):
    在这里插入图片描述
  4. 在app.js 中引入 路由模块 :

在这里插入图片描述
在这里插入图片描述
5. 在 views 文件夹中新增一个 login.ejs 文件:
在这里插入图片描述
6. 启动项目( npm run start ), 测试接口:
在这里插入图片描述
7. 新建前端文件 token_fe,新建 index.html,样式布局。

<body onload="loadFn()">
  <div class="container">
    <div class="row">
      <div class="form-group">
        <label for=""> 用户名 </label>
        <input type="text" class="form-control username" name="" id="" aria-describedby="emailHelpId" placeholder="">
      </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>
</body>
  1. (通过go live)打开静态服务器
  2. 点击登录得到用户名和密码,发送请求:
    在这里插入图片描述
  3. 添加 onload 事件, 通过判断 cookie或是 本地存储是否有token值。如果有,那么不需要登录,自动跳转首页; 如果没有, 那么就登录。
 function loadFn() {
    var token = localStorage.getItem('token')
    if (token) {
      //有
      location.href = './index.html'
    } else {
      alert('你需要登录')
    }
  }
  1. 解决跨域,在 login.js 里面设置请求头:
    在这里插入图片描述
  2. 前端发请求,在data里面加上token:
    在这里插入图片描述
  3. 产生公钥和私钥,在终端分别运行以下代码:
    在这里插入图片描述
  4. 后端判断 token 有没有值,安装 jsonwebtoken(npm i jsonwebtoken -S)
//引入文件系统
const fs = require('fs')
const path = require('path')
const jwt = require('jsonwebtoken')

   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
        })
      })
    }
  1. 存 token:
success(res) {
        const result = JSON.parse(res)
        if (result.status === 1) {
          localStorage.setItem('token', result.token)
        }
      }

测试!

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值