http协议是无状态的,所有用户进行多次请求,服务器都不会知道这些请求是谁请求的,以前我可以使用session记录客户端登陆的用户信息,然后让客户端保存用户的cookie,然后客户端每次请求带上cookie,这样服务端就可以识别。JWT其实就是基于token的鉴权机制:
1.首先客户端使用用户名密码来通过api请求服务器
2.服务器进行验证用户的信息,发送给客户端一个token
3.客户端存储token,并在每次请求时附送上这个token值
4.服务端验证token值,并返回数据
1.设置签名字符串,生成Token
var config = {
session:{
secrets: 'helloWord'
}
};
module.exports = config;
var jwt = require('jsonwebtoken');
var config = require('../../config');
var signToken = function(id) {
var expiry = new Date();
expiry.setDate(expiry.getDate() + 7);
return jwt.sign({
id: id ,
exp:parseInt(expiry.getTime()/1000)
}, config.session.secrets );
};
exports.signToken = signToken;
2.通过密码账号生成Token,此Restful api使用的是Express提供的路由规则
var express = require('express');
var router = express.Router();
var jwt = require('jsonwebtoken');
var config = require('../config/jwt');
router.get("/login", function(req, res) {
var username = req.query.username;
var password = req.query.password;
if (!username) {
return res.status(400).send("username require");
}
if (!password) {
return res.status(400).send("password require");
}
if (username != "admin" && password != "password") {
return res.status(401).send("invaild password");
}
var data = new Date();
data.setDate(data.getDate() + 7);//设置7天过期令牌
var authToken = jwt.sign({username: username,exp:parseInt(data.getTime()/1000)}, config.session.secrets);
res.status(200).json({token: authToken});
});
3.设置哪些api需要使用Token
//全局设置在app.js中,这样就拦截了除login之外的所以连接,并且自动验证Token
//并且可以设置获取Token的方式,比如查询参数,head,cookie
app.use(expressJwt({secret: config.session.secrets, getToken: function fromHeaderOrQuerystring (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
} else if (req.body && req.body.token) {
return req.body.token;
}
return null;
}}).unless({path: ["/login"]}));
//路由配置放在下面
var index = require('./routes/index');
app.use('/', index);
//也可以在路由中指定请求设置Token
var jwt = require('express-jwt');
app.get('/protected',
jwt({secret: 'helloWord'}),
function(req, res) {
//todo
res.sendStatus(200);
});
4.测试Token
router.post("/user", function(req, res) {
var username = req.body.username;
var age = req.body.age;
if (!username) {
return res.status(400).send("username require");
}
if (!age) {
return res.status(400).send("age require");
}
res.status(200).json({
username: username,
age: age
})
})
不使用token
使用token
或者token放在heads中
4.销毁Token,退出
客户端请求时候不带Token就是销毁
服务端销毁还在研究中…….
jsonwebtoken的Token保存在哪里 还在找
源代码源代码
浏览器保存Token可以使用HTML 5 Web 存储的
sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后,数据会被删除。
sessionStorage.token=token