express中的token

这里主要总结express中的token相关问题。

首先要知道我们为什么要使用token?

我的理解是,当用户完成登录之后会访问其他的页面,在这个过程中就会涉及到用户访问的权限,比如能不能发表文章能不能修改资料之类的。如果不用token和session之类的工具,就意味着每次权限验证我们就需要用用户的密码来验证。所以为了保存用户的登录状态就提出了token和session这两种形式。

session

用户通过req.session.admin = req.admin这种形式将用户的名称存入session中,然后系统会生成一个sessionId存入cookie中。当浏览器下一次请求时,session会一起传给服务器。这是就可以通过req.session.admin来取值了。

在express下实现:

1
npm install express-session --save

app.js

1
2
3
4
5
6
7
8
9
10
11
var session = require('express-session'); // 引入session所需要的包
app.use(session ({
secret: 'interesting', // 对session id相关的cookie进行签名
resave: true,
saveUninitialized: false, // 是否保存未初始化的会话
cookie: {
maxAge: 1000 * 60 * 3, // 设置session的有效时间,单位为毫秒
}
}))
// 当然你还可以参考express-session的文档,根据需要对session进行设置

routes/userLogin.js

1
req.session.userName = req.query.userName; // 这一命令放置的具体位置即为用户登录成功后

token

相比sessiontoken的安全性更高。如果把session比作学校用的饭卡的话,那么token就是信用卡,每次刷饭卡的时候是不需要输密码的,燃鹅,每次刷信用卡的时候还需要输入密码才能成功输入。这样看来是不是信用卡(token)比较安全呢。sessiontoken就是这样的。

express中的token长这样:

1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIiLCJpYXQiOjE1MDg0NjkxNDUsImV4cCI6MTUwODU1NTU0NX0.mjoEbk3EmKPac2_IoIu9cMPyl6KXMG9n3ts48kX1HNM

.将它分成了三个部分:

header(base64后的)、payload(base64后的)、signature(签名,即密钥)

想要了解它们的具体内容,可以自己去搜,网上很多这方面的解释。

对于express中token的使用:

1
npm install express-jwt jsonwebtoken --save // jsonwebtoken主要用于编码,express-jwt用于解码

app.js

1
2
3
4
5
6
7
8
9
var expressJWT = require('express-jwt');
var secretKey = "interesting"; // 设置密钥,'interesting'可以替换成你需要的值
app.use(expressJWT ({
secret: secretKey // 设置token中的密钥
}).unless({
path:['/userLogin'] // 除了'/userLogin'其他路径都要参与验证
}));

routes/userLogin.js

1
2
3
4
5
6
7
8
9
10
11
12
var jwt = require('jsonwebtoken');
var mytoken = jwt.sign({id: userId}, secretKey, {expiresIn: '1d'}); // expiresIn为token的有效时间,1d表示一天,userId是一个 变量
response = {
status: 200,
msg: '登录成功!',
userId: userId,
secret: secretKey,
token: mytoken
}; // response即为返回给客户端的json值,除了token,其他值可以根据需要设定
const decoded = jwt.verify(mytoken,secretKey); // token的解码我发现了两种,这是第一种。使用这一 种就不需要进行app.js文件中的设置console.log(decoded)了;

routes/users.js

1
2
3
4
5
router.get('/', function(req,res) {
res.send(req.user); // 成功解码后的token放入req.user中
});
// 这是第二种解码方式,我觉得这种方式使用的应该要多一点。token会在每一次网页请求时放在头部中一起发送给服务器,然后服务器通过express-jwt解码,将解码成功的token放入req.user中

测试:

我测试的时候用的postman

生成token 解码token

cookie和session

顺便附上这是网上的摘取的cookie和session的区别:

1、session在服务器端,cookie在客户端(浏览器);

2、session默认被存在服务器的一个文件里,而不是内存;

3、session的运行依赖于session id,而session id是存在cookie中的。也就是说,如果浏览器禁用cookie,那么session也会失效(但是可以通过其他方式实现,比如在url中传递session id);

4、session可以存放在文件、数据库和内存中;

5、用户验证这种场合一般会用session。