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

发布了66 篇原创文章 · 获赞 30 · 访问量 28万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览