cjwt
====

## 简介

约定jwt payload 默认有sub和ctx属性。
sub标识请求从何而来，可以为用户或服务。ctx标识以谁的名义请求。
以下payload表示该请求来自内部test服务，请求xm的相关资源。

```
{
  "sub": "service:test",
  "ctx": {
    "username": "xm"
  }
}
```

## 安装

```
npm install cjwt --save
```

## 使用

```
const CJWT = require('cjwt');
const cjwt = new CJWT(options);

app.use(cjwt.middleware());
app.use((req, res, next) => {
  const cjwt = req.cjwt;
  // cjwt.sub
  // cjwt.iss
  // cjwt.issuer
  // cjwt.subject.type
  // cjwt.subject.id
  
  // cjwt.isService 是否为服务调用
  // cjwt.subjectType 调用类型
  ...
});

cjwt.sign('service', 'cjwt', {username: 'test'})
  .then(console.log);
```

## middleware
使用中间件后会将payload添加到req.cjwt对象中，
payload的值可以通过两种方式取：

req.cjwt.iss === req.cjwt.issuer

同时，可以使用req.cjwt.sign，req.cjwt.verify，req.cjwt.decode等方法

注意，req.cjwt.subject被解析成对象含有type和id两个属性
而req.cjwt.sub直接返回payload中的sub属性

req.cjwt.sub // 'service:test'

req.cjwt.subject.type // 'service'

req.cjwt.subject.id   // 'test'

## options

- options.secret: String|Function，可以直接给字符串，或者返回Promise的函数

  ```
  const secret = (payload) => {
    const code = getSecretCode();
    const salt = payload.username;
    return Promise.resolve(code + salt);
  }
  ```
  
- options.signOptions: Object 生成签名时附加选项
  
  参考 [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback)
    
- options.verifyOptions: Object 校验签名时附加选项
    
  参考 [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback)