随着互联网的不断发展,技术的迭代也非常之快。我们的用户认证是基于户名密码的认证,由于这种方式每次都要传输用户名密码,增加了用户密码泄露的风险,基于token的认证方式可以很好的解决这一问题。
什么是Token
token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
Token的组成
- uid 用户唯一的身份标识
- time 当前时间的时间戳
- sign 签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串,为防止token泄露
基于Token机制的身份认证
1.客户端使用用户名和密码请求登录。
2.服务端收到请求,验证用户名和密码。
3.验证成功后,服务端会生成一个token,然后把这个token发送给客户端。
4.客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。
5.客户端每次向服务端发送请求的时候都需要带上服务端发给的token。
6.服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回请求的数据。
生成Token过程中的数据加密
在客户端请求服务器端生成token的过程中,主要涉及的两个数据需要加密的情况。一是首次登陆时需要传用户名和密码,其中密码不能以明文传输,需要RSA进行加密,传到服务器端再通过私钥进行解密。二是服务器首次传输token给客户端时可以对token进行RSA加密,客户端再通过私钥进行解密。
如上图:
1.客户端向服务器第一次发起登录请求(不传输用户名和密码)。
2.服务器利用RSA算法产生一对公钥和私钥,并保留私钥, 将公钥发送给客户端。
3.客户端收到公钥后, 加密用户密码,向服务器发送用户名和加密后的用户密码; 同时另外产生一对公钥和私钥,自己保留私钥, 向服务器发送公钥; 于是第二次登录请求传输了用户名和加密后的密码以及客户端生成的公钥。
4.服务器利用保留的私钥对密文进行解密,得到真正的密码。 经过判断, 确定用户可以登录后,生成sessionId和token, 同时利用客户端发送的公钥,对token进行加密。最后将sessionId和加密后的token返还给客户端。
5.客户端利用自己生成的私钥对token密文解密, 得到真正的token。