基于express框架的Token实现

本文详细介绍了Token的概念及其在身份验证中的应用。Token具有随机性、不可预测性和时效性等特点。通过客户端和服务端之间的交互过程,解释了基于Token的身份验证流程,并提供了JWT作为生成Token的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Token?

在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般我们所说的的token大多是指用于身份验证的token。

Token的特点

  • 随机性
  • 不可预测性
  • 时效性
  • 无状态、可扩展

基于Token的身份验证方法

  • 客户端使用用户名和密码请求登录
  • 服务端收到请求,验证登录是否成功
  • 验证成功后,服务端会返回一个Token给客户端,反之,返回身份验证失败的信息
  • 客户端收到Token后把Token用一种方式(cookie/localstorage/sessionstorage/其他)存储起来
  • 客户端每次发起请求时都将Token发给服务端
  • 服务端收到请求后,验证Token的合法性,合法就返回客户端所需数据,反之,返回验证失败的信息

JWT(Json Web Tokens)

生成Token的解决方案有许多,常用的一种就是 Json Web Tokens ,具体可以百度,下面给出Node的实现代码:

/**
 * Created by BIRD on 2017/11/23.
 */
var crypto=require("crypto");
var token={
    createToken:function(obj,timeout){
        console.log(parseInt(timeout)||0);
        var obj2={
            data:obj,//payload
            created:parseInt(Date.now()/1000),//token生成的时间的,单位秒
            exp:parseInt(timeout)||10//token有效期
        };
        //payload信息
        var base64Str=Buffer.from(JSON.stringify(obj2),"utf8").toString("base64");
        //添加签名,防篡改
        var secret="hel.h-five.com";
        var hash=crypto.createHmac('sha256',secret);
        hash.update(base64Str);
        var signature=hash.digest('base64');
        return  base64Str+"."+signature;
    },
    decodeToken:function(token){
        var decArr=token.split(".");
        if(decArr.length<2){
            //token不合法
            return false;
        }
        var payload={};
        //将payload json字符串 解析为对象
        try{
            payload=JSON.parse(Buffer.from(decArr[0],"base64").toString("utf8"));
        }catch(e){
            return false;
        }
        //检验签名
        var secret="hel.h-five.com";
        var hash=crypto.createHmac('sha256',secret);
        hash.update(decArr[0]);
        var checkSignature=hash.digest('base64');
        return {
            payload:payload,
            signature:decArr[1],
            checkSignature:checkSignature
        }
    },
    checkToken:function(token){
        var resDecode=this.decodeToken(token);
        if(!resDecode){
            return false;
        }
        //是否过期
        var expState=(parseInt(Date.now()/1000)-parseInt(resDecode.payload.created))>parseInt(resDecode.payload.exp)?false:true;
        if(resDecode.signature===resDecode.checkSignature&&expState){
            return true;
        }
        return false;
    }
};
module.exports=exports=token;

 

https://www.cnblogs.com/hlere/p/6668159.html?utm_source=itdadao&utm_medium=referral

Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:

  • iss:Issuer,发行者
  • sub:Subject,主题
  • aud:Audience,观众
  • exp:Expiration time,过期时间
  • nbf:Not before
  • iat:Issued at,发行时间
  • jti:JWT ID

转载于:https://www.cnblogs.com/KDSER/p/7884863.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值