RESTful APi 登陆权限、node.js、用户状态控制之JWT(Json web Token)

http协议是无状态的,所有用户进行多次请求,服务器都不会知道这些请求是谁请求的,以前我可以使用session记录客户端登陆的用户信息,然后让客户端保存用户的cookie,然后客户端每次请求带上cookie,这样服务端就可以识别。JWT其实就是基于token的鉴权机制:
1.首先客户端使用用户名密码来通过api请求服务器
2.服务器进行验证用户的信息,发送给客户端一个token
3.客户端存储token,并在每次请求时附送上这个token值
4.服务端验证token值,并返回数据

1.设置签名字符串,生成Token

var config = {
    session:{
        secrets: 'helloWord'
    }

};

module.exports = config;
var jwt = require('jsonwebtoken');
var config = require('../../config');

var  signToken = function(id) {
    var expiry = new Date();
    expiry.setDate(expiry.getDate() + 7);
    return jwt.sign({
        id: id ,
        exp:parseInt(expiry.getTime()/1000)
    }, config.session.secrets );
};

exports.signToken = signToken;

2.通过密码账号生成Token,此Restful api使用的是Express提供的路由规则

var express = require('express');
var router = express.Router();
var jwt = require('jsonwebtoken');
var config = require('../config/jwt');

router.get("/login", function(req, res) {
    var username = req.query.username;
    var password = req.query.password;
    if (!username) {
        return res.status(400).send("username require");
    }
    if (!password) {
        return res.status(400).send("password require");
    }

    if (username != "admin" && password != "password") {
        return res.status(401).send("invaild password");
    }
    var data = new Date();
    data.setDate(data.getDate() + 7);//设置7天过期令牌
    var authToken = jwt.sign({username: username,exp:parseInt(data.getTime()/1000)}, config.session.secrets);
    res.status(200).json({token: authToken});
});

这里写图片描述

3.设置哪些api需要使用Token


//全局设置在app.js中,这样就拦截了除login之外的所以连接,并且自动验证Token
//并且可以设置获取Token的方式,比如查询参数,head,cookie
app.use(expressJwt({secret: config.session.secrets,  getToken: function fromHeaderOrQuerystring (req) {
    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
        return req.headers.authorization.split(' ')[1];
    } else if (req.query && req.query.token) {
        return req.query.token;
    } else if (req.body && req.body.token) {
        return req.body.token;
    }
    return null;
}}).unless({path: ["/login"]}));

//路由配置放在下面
var index = require('./routes/index');
app.use('/', index);

//也可以在路由中指定请求设置Token

var jwt = require('express-jwt');

app.get('/protected',
  jwt({secret: 'helloWord'}),
  function(req, res) {
    //todo
    res.sendStatus(200);
  });

4.测试Token

router.post("/user", function(req, res) {
    var username = req.body.username;
    var age = req.body.age;
    if (!username) {
        return res.status(400).send("username require");
    }
    if (!age) {
        return res.status(400).send("age require");
    }

    res.status(200).json({
        username: username,
        age: age
    })
})

不使用token
这里写图片描述

使用token
这里写图片描述
或者token放在heads中
这里写图片描述

4.销毁Token,退出
客户端请求时候不带Token就是销毁
服务端销毁还在研究中…….
jsonwebtoken的Token保存在哪里 还在找

源代码源代码

浏览器保存Token可以使用HTML 5 Web 存储的
sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后,数据会被删除。

sessionStorage.token=token

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值