Token身份认证

Token是什么

用户的数据安全性很重要,而http又是一种没有状态的协议,并不能区分访问者。这就需要做用户验证,用户输入账号和密码之后,需要把用户的登录信息记录下来,防止访问下一个页面的时候需要重新验证。传统的处理方法是,借助与Session机制,当用户登录之后,服务端生成一个记录,这个记录用来标记用户,然后发送给客户端,客户端将这个标记存储在Cookie里面,当客户端发起下一次请求的时候,会附带上Cookie里的这个标记,然后服务端会验证这条标记在服务器有没有记录,如果有,则通过验证,没有的话就返回失败。这种处理方式是基于服务器的,Session存储在服务器内存里或者是写到数据库里,需要在服务器定期的清理过期的Session,同时当用户量大了之后,对内存的需求会增加,对服务器的压力也会增加。Token也是用于验证用户身份的一种工具,是一个客户端令牌。当客户端发起登录请求时,会在服务端生成一串字符串,反馈给客户端作为Token令牌,之后的用户访问只需要带上这个Token即可。基于Token的验证方法,服务端不需要存储用户的登录记录。这两种验证方法的具体流程如下图:

Token身份认证_第1张图片

Token的使用流程可以概括为:

  1. 用户登录,填写用户名和密码,并发送给服务端
  2. 后端验证用户登录信息
  3. 验证通过,签名生成一个Token,返回给客户端
  4. 客户端存储这个Token,在下一次访问服务端的时候,会附带上这个Token
  5. 服务端下一次接收到数据时,验证Token,并返回数据


Token的优点

Token作为用户认证的处理方式,有几个优点:

  • 无状态,可扩展:不会在服务端存储用户的登录状态,可以很容易的实现服务器的增减
  • 支持移动设备,对多类型客户端的支持良好
  • 支持跨程序调用,各个接口之间的调用更方便
  • 安全可靠


Token的生成

一个比较轻巧的Token规范是JWT(Json Web Token),当然也可以自定义Token的生成方式,只要能正常的加解密,同时Token字符串中包含足够的信息即可。这里只简介一下JWT的生成。一个JWT实际就是一个字符串,它包含三部分,分别是:

  • 头部 header
  • 载荷 payload
  • 签名 signature

他们按照 A.B.C 的格式拼接起来,其中C由A和B生成,他们之间的格式为 Base64(header).Base64(payload).H256(A.B)。需要注意的是header和payload都是对象序列化之后的字符串.
其中Header用来描述JWT的基本信息以及签名使用的算法,可以表示为一个Json对象如下:

    {
      "typ": "JWT",
      "alg": "HS256"
    }

对这个对象序列化之后,在进行Base64编码,得到字符串 A 为:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
而针对载荷payload,有固定的格式,如下:

{
    "sub": "1",
    "iss": "http://localhost:8000/auth/login",
    "iat": 1451888119,
    "exp": 1454516119,
    "nbf": 1451888119,
    "jti": "37c107e4609ddbcc9c096ea5ee76c667"
}

其中,各个字段的含义如下:

  • sub:表示针对的用户,一般设为用户uid
  • iss:当前JWT的签发者
  • iat:签发Token的时间 issue at
  • exp:当前Token的国企时间 expire time
  • nbf:Token在此时间之前不能被接收处理,正常情况下和签发时间一致
  • jti:当前Token的唯一标识

将payload对象序列化之后,再进行Base64编码,得到字符串 B ,为:eyJzdWIiOiIxIiwiaXNzIjoiaHR0cDpcL1wvbG9jYWx
ob3N0OjgwMDFcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNDUxODg4MTE5LCJleHAiOjE0NTQ1MTYxMTksIm5iZiI6MTQ1MTg4OD
ExOSwianRpIjoiMzdjMTA3ZTQ2MDlkZGJjYzljMDk2ZWE1ZWU3NmM2NjcifQ

最后是签名signature,将上面两个字符串用 ‘.’ 符号拼接在一起,然后再按照Header中声明的加密方式(这里是HS256)加密之后,即可得到字符串 C。

将A、B、C三个字符串拼接之后,就得到了完整的JWT。


Token的使用

Token生成之后,客户端每次访问时,都要带上这个字符串。在后端对Token做验证,验证方式就是将Token字符串按照既有方式解密,然后判断Token中存储的信息,包括用户UID,过期时间等,是否符合条件。

你可能感兴趣的:(安全)