项目作者: teng-boy

项目描述 :
node restify jwt redis mongo demo
高级语言: JavaScript
项目地址: git://github.com/teng-boy/node-rest-jwt-redis.git
创建时间: 2017-06-09T14:19:32Z
项目社区:https://github.com/teng-boy/node-rest-jwt-redis

开源协议:

下载


环境

1、开发使用node版本:v8.0.0

2、demo依赖mongo和redis,所以在使用该demo的时候,必须在本地成功安装它们。

mongo

1、连接信息文件,参考lib下的db.js文件

2、用途:保存测试数据

  1. 用户model如下:
  2. {
  3. 'name': String,
  4. 'pwd': String
  5. }

3、配置:进入项目根目录,查看config文件夹下的development.js,修改对应的mongoConfig即可

  1. //mongo连接信息
  2. mongoConfig: {
  3. "host": "192.168.33.10",
  4. "database": "rest_test"
  5. }

redis

1、连接信息文件,参考lib下的redis.js文件

2、保存token,刷新维护token

  1. 说明:系统默认token有效期为2h

3、配置:进入项目根目录,查看config文件夹下的development.js,修改对应的redisConfig即可

  1. //redis连接信息
  2. redisConfig: {
  3. "host": "192.168.33.10",
  4. "port": 6379
  5. }

关于token

demo使用了简单的jsonwebtoken模块管理token。

  1. 关键代码:
  2. //token验证
  3. function verify(req, res, next){
  4. //从head获取token
  5. let token = req.headers['x-broncos-token'];
  6. if(!token){
  7. return res.json({code: 1000, data: {}, msg: 'token is required'});
  8. }
  9. //验证token
  10. jwt.verify(token, config.secret, (err, decode) => {
  11. if(err) {
  12. console.log('verify err-->' + err);
  13. return res.json({code: 401, data: {}, msg: err});
  14. }
  15. //验证通过
  16. let expireIn = decode.expireIn;
  17. let userId = decode.userId;
  18. //判断token是否有效
  19. redis.exists(userId, function(e, ret){
  20. if(e) throw e;
  21. console.log('ret-->' + ret);
  22. if(ret){
  23. //该token有效,重置token过期时间
  24. redis.expire(userId, expireIn);
  25. next();
  26. }else{
  27. //token无效
  28. res.json({code: 401, data: {}, msg: 'invalid token'});
  29. }
  30. });
  31. });
  32. }
  1. 说明:
  2. 1token是由headerpayloadsecret组合而成的。
  3. 2demopayload部分组成如下:
  4. {
  5. 'user': 'xxx', //用户 _id
  6. 'expireIn': xxx //单位:秒,token有效时间,demo默认2h
  7. }
  8. 3secret是签名,保证token安全的关键,不可暴露
  9. 4、关于jsonwebtoken的细致方面,可网上行搜索。

使用说明

1、拉取代码到本地:https://github.com/broncoss/node-rest-jwt-redis.git

2、启动方式:进入项目根目录,先npm install安装依赖,再执行./bin/develop.sh启动项目

3、除了生成token API /v1/token 外,其他所有API接口都需在header中传递x-broncos-token(其value为生成的token)

4、使用post方式请求/v1/token获取token时需要传namepwd,但为了方便测试,系统默认namepwd的值为test

5、在请求获取token时,可通过传expireIn自行设置token有效时间。在token有效期内访问API,系统自动刷新token有效时间。token一旦过期,需要重新获取token

线上测试案例

1、生成有效期为100秒的token

  1. curl -l -H "Content-type: application/json" -X POST -d '{"name": "test", "pwd": "test", "expireIn": 100}' http://api.broncodes.com/v1/token
  1. 返回案例:
  2. {
  3. "code":200,
  4. "data":{
  5. "user":{
  6. "__v":0,
  7. "name":"test",
  8. "pwd":"test",
  9. "_id":"593feff1e5fe22001003b812 //用户ID
  10. },
  11. "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI1OTNmZWZmMWU1ZmUyMjAwMTAwM2I4MTIiLCJleHBpcmVJbiI6MTAwMDAwMCwiaWF0IjoxNDk3MzYyNDE3fQ.rcZp6DlRIgjr8lID7nV4nV9pxLEz_FNlVnG1US1GHdg"
  12. },
  13. "msg":"success"
  14. }

2、根据用户ID查询用户

  1. curl -H "x-broncos-token:获取的token" -X GET http://api.broncodes.com/v1/users/用户ID
  1. 返回案例:
  2. {
  3. "code":200,
  4. "data":{
  5. "_id":"593feff1e5fe22001003b812",
  6. "name":"test",
  7. "pwd":"test",
  8. "__v":0
  9. },
  10. "msg":"success"
  11. }

3、获取所有用户

  1. curl -H "x-broncos-token:获取的token" -X GET http://api.broncodes.com/v1/users
  1. 返回案例:
  2. {
  3. "code":200,
  4. "data":[{
  5. "_id":"593ebf50e5fe22001003b810",
  6. "name":"test",
  7. "pwd":"test",
  8. "__v":0
  9. },{
  10. "_id":"593feff1e5fe22001003b812",
  11. "name":"test",
  12. "pwd":"test",
  13. "__v":0
  14. }],
  15. "msg":"success"
  16. }

4、根据用户ID删除用户

  1. curl -H "x-broncos-token:获取的token" -X DELETE http://api.broncodes.com/v1/users/用户ID
  1. 返回案例:
  2. {
  3. "code":200,
  4. "data":{},
  5. "msg":"success"
  6. }