token
token的概念
-
token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。 -
简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。
token的使用场景
-
无状态请求
-
保持用户的登录状态
-
第三方登录(token+auth2.0)
token使用流程
- 先安装perl
+ 重启电脑
+ 进入 C:\Perl64\eg
+ 以管理员身份运行 perl --help
- 报错( perl没有配置环境变量 )
- 安装openssl
+ 软件安装无要求,一路next
+ 重启电脑
+ 然后在命令终端输入openssl,发现报错openssl命令未找到
+ 配置全局的环境变量
+ 在命令终端继续输入openssl,然后报警告:WARNING: can't open config file: /usr/local/ssl/openssl.cnf
+ 在你得opensll安装路径下找到openssl.cfg,我的路径是 C:\OpenSSL-Win64\bin\openssl.cfg,设置环境变量
`$ set OPENSSL_CONF=C:\OpenSSL-Win64\bin\openssl.cfg `
+ 继续输入openssl
`$ openssl`
`$ OpenSSL>`
- 注意: perl与openssl的下载方法另行百度
-
先使用express创建项目
-
打造了一个login的post接口
-
使用openssl生成一个私钥
- 进入某一个项目文件夹中生成
$ openssl genrsa -out ./private_key.pem 1024
- 进入某一个项目文件夹中生成
-
使用openssl生成公钥
$ openssl rsa -in ./private_key.pem -pubout -out ./public_key.pem
-
安装jsonwebtoken
$ cnpm i jsonwebtoken -D
-
通过私钥生成token
let private_key=fs.readFileSync(path.join(__dirname,'./private_key.pem'))
var token = jwt.sign(palyload, private_key,{ algorithm: 'RS256'});
- 前端发送ajax时要发送一个token
submit.onclick = function () {
$.ajax({
url: 'http://localhost:3000/login',
data: {
username: username.value,
password: password.value,
token: localStorage.getItem('token') //用封装的获取cookie的方法来取
},
method: 'POST',
success ( res ) {
console.log( res )
const result = JSON.parse( res )
localStorage.setItem('token',result.auth)
}
})
}
-
后端接收前端发来的token,做登录判断
-
前端存储token
-
或后端存储token
// 我们使用express-session来存储
// 1. 在app.js中设置express-session
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}))
// 2. 在你的接口中 做 req.session的值设置
const { username,password,token } = req.body
if( !token ){
//当前条件成立,证明用户是第一次登录( 一个cookie周期 )
req.session.token = jwt_token
//jwt_token是我们通过使用jsonwebtoken + openssl定义的私钥 来生成的
}else{
//当前条件不成立,证明用户已经不是第一次登录( 一个cookie周期 )
//如果cookie时间周期到了,那么我们将token清除掉
var timeTap = Date.now() //当前时间戳
var fuTimeTap = (new Data( req.session.cookie._expires )).getTime()
if( fuTimeTap - timeTap === req.session.cookie.originalMaxAge ){
req.session.token = ''
}
}