nodejs基于Token的身份认证

传统的Session验证

起初的验证方式是存在于服务器的,用户登录进来以后,服务器判断成功,将数据存进session里面,向用户返回一个sessionID。这样的弊端是,假如用户基数特别大,每登录一个用户,就要存储一条,对服务器的内存压力比较大。

基于Token的验证方法

基于Token的验证方法是无状态的,因此我们就不用把信息存在服务器中了。

Token可以通过请求头传输,所以他可以在任何一种http请求中被发送到服务器中。

Token的验证流程

客户端发送用户、密码到服务器。
服务器接收到信息之后和数据库进行比对,验证成功后,生成一段有时效的Token字符串,向客户端返回登陆成功信息以及Token字符串。
客服端接收到信息,将Token存储在Local Storage或者Cookies中。
客服端再向服务器发送请求时,将Token放在请求头中。
服务器先解析请求头中的Token,如果解析成功,那么就进入业务逻辑中,如果不成功返回错误信息。

nodeJS(express) + jwt(jsonwebtoken)

首先安装 jsonwebtoken
npm install jsonwebtoken -S

然后在服务器中创建一个js文件,可以自行命名,我在这里命名为jwt.js

// 引入模块依赖
const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');
// 创建 token 类
class Jwt {
    constructor(data, key, minute) {
        this.data = data;
        this.keyword = key;
        this.minute = minute || 30
    }
    //生成token
    generateToken() {
        let data = this.data;
        let minute = this.minute
        let keyword = this.keyword
        let created = Math.floor(Date.now() / 1000);
        let exp = created + 60 * minute;
        let cert = fs.readFileSync(path.join(__dirname, '../pem/rsa_private_key.pem')); //私钥 可以自己生成        
        let token = jwt.sign({
            data: {
                'id': data,
                "key": keyword
            },
            exp
        }, cert, {
            algorithm: 'RS256'
        });
        return token;
    }

    // 校验token
    verifyToken() {
        let token = this.data
        let cert = fs.readFileSync(path.join(__dirname, '../pem/rsa_public_key.pem')); //公钥 可以自己生成
        let res;
        try {
            let result = jwt.verify(token, cert, {
                algorithms: ['RS256']
            }) || {};
            let {
                exp = 0
            } = result, current = Math.floor(Date.now() / 1000);
            if (current <= exp) {
                res = result.data || {};
            }
            return res;
        } catch (e) {
            res = 'err';
        }
    }
}

module.exports = Jwt;

解析

generateToken

jwt.sign(payload, secretOrPrivateKey, [options, callback]);

payload ==> 代指要存进的内容
secretOrPrivateKey ==> 秘钥,我这里使用的是生成的私钥加密,也可以使用不规则字符。
[options, callback] ==> 参数,包括支持的算法等等

verifyToken

jwt.verify(token, secretOrPublicKey, [options, callback]);

token ==> sign生成的Token
secretOrPublicKey ==> 使用生成的公钥解密。
[options, callback] ==> 使用相同的解密方式

具体参数

可以查看jsonwebtoken在npm上的详细解释

支持的算法

参数值 数字签名或MAC算法
HS256 使用SHA-256哈希算法的HMAC
HS384 使用SHA-384哈希算法的HMAC
HS512 使用SHA-512哈希算法的HMAC
RS256 使用SHA-256哈希算法的RSASSA-PKCS1-v1_5
RS384 使用SHA-384哈希算法的RSASSA-PKCS1-v1_5
RS512 使用SHA-512哈希算法的RSASSA-PKCS1-v1_5
PS256 使用SHA-256哈希算法的RSASSA-PSS(only node ^ 6.12.0 OR> = 8.0.0)
PS384 使用SHA-384哈希算法的RSASSA-PSS(only node ^ 6.12.0 OR> = 8.0.0)
PS512 使用SHA-512哈希算法的RSASSA-PSS(only node ^ 6.12.0 OR> = 8.0.0)
ES256 使用P-256曲线和SHA-256哈希算法的ECDSA
ES384 使用P-384曲线和SHA-384哈希算法的ECDSA
ES512 使用P-521曲线和SHA-512哈希算法的ECDSA
none 不包含数字签名或MAC值

前端的实际操作方法

怎么存储

因为我比较喜欢使用Cookie来存储的,所以以Cookie为主。

封装方法

首先使用一个npm包,js-cookie。

npm install js-cookie -S

在合适的文件夹中创建一个js文件。一般推荐在utils文件夹下

import Cookies from 'js-cookie'

const TokenName = 'XXXXXXXX'

export function getToken() {
  return Cookies.get(TokenName)
}

export function setToken(token) {
  return Cookies.set(TokenName, token, {
    expires: 1,
    path: '/'
  })
}

export function removeToken() {
  return Cookies.remove(TokenName)
}

请求封装

以VUE来说,按照我之前关于Axios的文章,封装请求即可。

VUE.JS请求工具Axios的封装

完结撒花

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352