token
-
身份验证
http 请求的无状态性 -
JWT (jsonwebtoken)
- 用户登录 服务器端产生一个token (加密字符串) 发送给前端
- 前端将token 进行保存
- 前端发起数据请求的时候携带token
- 服务端 验证token 是否合法 如果合法继续操作 不合法终止操作
- token 的使用场景 无状态请求 保持用户的登录状态 第三方登录(token+auth2.0)
- 小案例:登录页面
- 先打开终端,运行下面代码:
- cd 进入token_demo,再安装依赖性文件:
- 打造一个简单的接口文件(login.js):
- 在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>
- (通过go live)打开静态服务器
- 点击登录得到用户名和密码,发送请求:
- 添加 onload 事件, 通过判断 cookie或是 本地存储是否有token值。如果有,那么不需要登录,自动跳转首页; 如果没有, 那么就登录。
function loadFn() {
var token = localStorage.getItem('token')
if (token) {
//有
location.href = './index.html'
} else {
alert('你需要登录')
}
}
- 解决跨域,在 login.js 里面设置请求头:
- 前端发请求,在data里面加上token:
- 产生公钥和私钥,在终端分别运行以下代码:
- 后端判断 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
})
})
}
- 存 token:
success(res) {
const result = JSON.parse(res)
if (result.status === 1) {
localStorage.setItem('token', result.token)
}
}
测试!