网关项目开发总结

JWT

JWT的组成

一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。

  • 头部(Header)
    头部主要是加密算法,通常如下。
{
  "typ": "JWT",
  "alg": "HS256"
}
  • 载荷(Payload)
{
    "iss": "John Wu JWT",
    "iat": 1441593502,
    "exp": 1441594722,
    "aud": "www.example.com",
    "sub": "[email protected]",
    "userID": "aabbccddeefff",
}

这里面的前五个字段都是由JWT的标准所定义的。
iss: 该JWT的签发者
sub: 该JWT所面向的用户
aud: 接收该JWT的一方
exp(expires): 什么时候过期,这里是一个Unix时间戳
iat(issued at): 在什么时候签发的

我们主要关注的是exp和自定义的userID字段。

  • 签名(sign)
    签名就是将头部和载荷通过加密算法生成的字符串。
JWT生成

在服务端用加盐算法和服务端私钥,对用户id和过期时间,以及加密算法进行加密。这个过程叫做签名。
然后把JWT返回给客户端。
用代码表示如下。

const jwt = require('jsonwebtoken');
const token = jwt.sign({key:'要加签的数据,比如用户id'},'私钥', {expiresIn: '1 days'})

// ...可以把token写入response的cookie,或者直接返回
JWT验证

拿到客户端的JWT后,首先进行过期验证。
过期验证通过后,在服务端用加盐算法和服务端私钥,对用户id和过期时间,以及加密算法进行加密得到签名。
两者签名一致后,表示JWT验证通过。
用代码表示如下。

const jwt = require('jsonwebtoken');
// 假设客户端把jwt按照规范放入request的header的authorization属性
const token = ctx.request.header.authorization.split(' ')[1];
let decode = null;

try {
    decode = jwt.verify(token, '私钥');
} 
catch (error) {
    if (error.name === 'TokenExpiredError') {
      // token 过期 
    }
    else{
      // 解析token的其它错误   
    }
    return;
}

if(decode){
    // token 校验通过
}

UUID

首先ID结构是由时间戳+机器ID+线程ID+自增序列(同毫秒内产生的自增序列) 组成。
目前开源库有puid。

约定大于配置,配置大于硬编码

硬编码若要修改,便各个文件各个位置找过去修改。
配置则把经常修改的地方统一到一个地方,方便修改。
要修改的东西多了,则要配置一大堆。
这时候就需要约定,大家按照约定的规范进行命名文件、存放目录,便可以减少许多配置。

对每个请求进行try...catch捕捉错误

防止请求崩溃而导致系统异常。

你可能感兴趣的:(网关项目开发总结)