为一个自娱自乐的项目开发WebAPI的时候,我尝试使用了Token验证机制。
对于我这样一个菜鸟来说,Token的验证机制在我理解中十分简单:
先使用用户名和密码登录系统,服务器会返回一个字符串,约定好这个字符串就是系统出入的通行令牌
客户端之后除了登录操作的所有请求只要带上这个字符串,系统就会放行。
好,到现在就明白了,“Token”在当时的我看来只是一个字符串,我只需要保证这个字符串一人一个不重样即可。
于是我就使用了GUID(全局变量标识符)来充当Token。但是使用过程中就有了问题。这个Token是生成了而且不重样,可我怎么确立它和用户之间的对应关系?于是我想到把Token存到用户表中,假设用户带着Token访问更新用户信息的API,服务器拿到Token去查询用户表,进而找到对应的用户名。至此我就知道了这个Token是哪位用户的了。拿着这个用户名,就可以更新该用户的表项了。那么其它的API也是这个这样,首先第一件事要做的就是去查询数据库找到对应的用户名,才能进行其他的操作。
按照我的思路的话,这个方式虽然麻烦一点,但是还是能实现功能的。
另一个观于Token的常见要求是,它得能设置有效期,总不能一个Token用一辈子吧。于是我又往用户表加了一列过期时间,每次验证Token都要从数据库中拿出到期时间与当前时间做比较来判断是不是过期了。
JWT的基本概念
JWT(Json Web Token)本质上是一种Token的设计规范。用于实现Token机制的Token说到底也就是个字符串,重点是这个字符串该怎么写才会比较合理。我试过用GUID来充当这个Token实现简单的Token身份验证机制,完全没问题。可就是用起来有点别扭。而JWT就是一种更加合理的组织Token字符串的方式。
它使用JSON格式,总体分为三个大块:Header .Payload. Signature,分别承担各自的责任。
Header
{
"alg": "HS256",
"typ": "JWT"
}
Payload
{
"sub": "1234567890",
"name": "John Doe",
"admin": true