node.js笔记
首发于node.js笔记
socket.io基于Token的验证 (一)

socket.io基于Token的验证 (一)

介绍

在使用socket.io碰到断线重连时,它的重连机制是重新建立一个链接,然后之前的链接会被删除,这样用户就要重新验证身份,所以要使用cookie、session或者token。在cookie、session、token中最优的选择当然是token,优点不在这里举例了大家自行搜索,所以使用token惊喜socket.io进行验证。


socket.io基于token的验证步骤

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求并验证用户名与密码
  3. 验证成功后,服务端会签发一个 token,再把这个 token 发送给客户端里
  4. 客户端将token放到query里用于断线重连或者静态文件的读取(静态服务器对私密的文件进行过滤)


断线重连的验证步骤

  1. 客户端断线重连时会get服务器
  2. 服务器收到连接,读取token进行身份验证,这样断线重连身份不变


jwt

实施token验证使用JWT(JSON Web Tokens),有三个部分:

  1. header
  2. payload
  3. signature

中间用点分隔,并且都使用 Base64 进行编码。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwYW4uY29tIiwiZXhwIjoiMTQzODk1
Njc3OCIsIm5hbWUiOiJ1c2VyIG5hbWUiLCJhY2Nlc3NBdXRob3JpdHkiOjF9.PT1DbvoSp+eKSUB
c4EaWPbAEP8uxlq7aFhqDjAZL7U=
Header

header 主要是 token的类型算法 两个部分。

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

Base64 编码

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9


Payload

Payload 里面是 token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容,下面是标准字段:

  • iss:Issuer,发行者
  • sub:Subject,主题
  • aud:Audience,观众
  • exp:Expiration time,过期时间
  • nbf:Not before
  • iat:Issued at,发行时间
  • jti:JWT ID

也可以自定义字段用于存储信息,比如 name accessAuthority。

{
  iss: 'pan.com',
  exp: '1438955445',
  name: 'user name',
  accessAuthority: 1
}

Base64 编码

eyJpc3MiOiJwYW4uY29tIiwiZXhwIjoiMTQzODk1Njc3OCIsIm5hbWUiOiJ1c2VyIG5hbWUiLCJhY
2Nlc3NBdXRob3JpdHkiOjF9
Signature

JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header、payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。

let encodeStr = headerBase64 + '.' + payloadBase64;
let signature = Crypto.createHmac('sha256', 'hello world')//算法和密钥

signature的Base64编码

PT1DbvoSp+eKSUB5c4EaWPbAEP8uxlq7aFhqDjAZL7U=

最后发个客户端的 token:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwYW4uY29tIiwiZXhwIjoiMTQzODk1
Njc3OCIsIm5hbWUiOiJ1c2VyIG5hbWUiLCJhY2Nlc3NBdXRob3JpdHkiOjF9.PT1DbvoSp+eKSUB5
c4EaWPbAEP8uxlq7aFhqDjAZL7U=

就是开头看到的token,介绍完就可以开始编写node.js模块啦。

编辑于 2017-08-03

文章被以下专栏收录