前端Token 组成及生成方法示例详解

 更新时间:2023年04月21日 08:45:08   作者:亦黑迷失  
这篇文章主要为大家介绍了前端Token 组成及生成方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

平常前端项目中,我们通常使用 token 来进行身份验证 —— 客户登录成功,接口就会返回一个 token,之后前端每次发送请求就在请求头中添加个值为 token 的 authorization 字段来表明身份。至于 token 是怎么生成的?那一长串的字母数字到底有什么含义?或许一些身为前端的小伙伴们长久以来并不甚了解。那么本文,就来对 token 的组成及生成方法做个基本的介绍吧。

生成 token

在使用 koa 搭建的后端项目中,可以安装 jsonwebtoken 这个库来生成 token:

npm i jsonwebtoken

之后引入 jwt,通过 jwt.sign() 即可得到 token,传入的第一个参数是 token 携带的信息,第二个参数是用于数字签名的密钥,第三个参数可以传入一些配置,比如过期时间 expiresIn,单位为秒:

// 代码片段一,省略部分代码
const jwt = require('jsonwebtoken')
loginRouter.get('/login', (ctx, next) => {
  const token = jwt.sign({ name: 'Jay' }, 'aaabbbccc', { expiresIn: 60 * 60 })
  ctx.body = {
    msg: '登录成功',
    token
  }
})

使用浏览器发送请求,可以看到生成的 token:

token 的组成

我们可以将生成的 token 复制粘贴到 jwt 官网的 debugger 工具里进行解码:

可以发现 token 使用 . 分割成了 3 部分:

1. Header

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 这部分,为 Base64 编码后的结果,其中有两个属性:

  • alg,也就是 Algorithm(算法) 的缩写,指定加密算法,默认为 HS256(HMAC-SHA256),是一种单项散列函数,加密解密采用同个密钥;
  • typ,token 的类型(type),通常可以固定写成 JWT。

所以这部分结果,如果保持代码片段一不变,浏览器每次重新请求得到的结果也都不会变化。

2. Payload

token 携带的数据,除了我们在代码片段一中传入的 name 信息以及过期时间 exp ,还有默认携带的 iat(issued at),为 token 的签发时间。Payload 部分的数据同样是经过 Base64 编码的。

3. Signature

签名部分,通过 HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret) 得到,即将 Header 和 Payload 的 Base64 编码结果与数字签名的密钥 secret 结合,通过 HS256 算法生成,这部份的结果,浏览器每次重新请求时都会重新生成。

验证 token

假定前端是通过 Bearer Token 类型向服务器传递的 token,实际上就是将 token 赋值给请求头的 authorization 属性。那么后端在验证时,可以通过 ctx.headers.authorization 拿到带有 Bearer 前缀(注意 Bearer 后有个空格)的 token 。之后再将获取的 token 以及代码片段一生成 token 时传入的密钥一起传给 jwt.verify(),如果验证成功,则 res 可以得到 Payload 数据;如果验证失败,则会报错,可用 try catch 捕获 :

// 代码片段二
userRouter.get('/center', (ctx, next) => {
  const authorization = ctx.headers.authorization
  const token = authorization.replace('Bearer ', '')
  try {
    const res = jwt.verify(token, 'aaabbbccc') 
    console.log('res', res) // res { name: 'Jay', iat: 1679814009, exp: 1679817609 }
    ctx.body = '验证成功'
  } catch (error) {
    ctx.body = '验证失败'
  }
})

采用非对称加密算法

在代码片段一中使用 jwt 生成 token 时,默认采用的加密算法是 HS256,安全性不高,所以一般公司里的项目采用的都是非对称加密算法,比如 RSA 算法,使用私钥来颁发 token,使用公钥来验证 token,关于加密算法这部分知识,若想了解更多,可移步 《前端加密》

生成公私密钥

在 windows 系统下,公私密钥的生成可以去下载安装 OpenSSL, 然后通过系统自带的命令行工具使用 openssl 生成。也可以直接通过 git 的 bash 工具(集成了 OpenSSL)来生成 。首先生成私钥: 进入到要保存密钥的目录下,输入 openssl 按下回车:

接着就可以输入 genrsa -out private.key 1024 来生成 rsa 算法的私钥:

生成的私钥如下:

有了私钥,再使用 rsa -in private.key -pubout -out public.key 生成与之对应的公钥:

公钥如下:

修改之前的代码

有了一对公私密钥后,生成 token 时我们就可以将代码片段一稍加修改,将传入的密钥改为私钥,并在配置对象中指定要使用的算法为 RS256

const token = jwt.sign({ name: 'Jay' }, privateKey, {
  expiresIn: 60 * 60,
  algorithm: 'RS256'
})

验证 token 时,也需将代码片段二中用公钥替换原本的密钥,然后添加算法配置,只不过这里 algorithm 的值为数组,因为在验证时是可以通过多种算法依次尝试的:

const res = jwt.verify(token, publicKey, {
  algorithm: ['RS256']
})

privateKeypublicKey 可以通过 fs 模块获取:

const fs = require('fs')
const privateKey = fs.readFileSync('./src/keys/private.key')
const publicKey = fs.readFileSync('./src/keys/public.key')

以上就是前端Token 组成及生成方法示例详解的详细内容,更多关于前端Token组成生成方法的资料请关注脚本之家其它相关文章!

相关文章

  • 基于JavaScript实现的快速排序算法分析

    基于JavaScript实现的快速排序算法分析

    这篇文章主要介绍了基于JavaScript实现的快速排序算法,分析了快速排序的原理并结合实例形式给出了javascript快速排序的操作步骤与相关实现技巧,需要的朋友可以参考下
    2017-04-04
  • Leaflet 基础入门教程示例

    Leaflet 基础入门教程示例

    这篇文章主要为大家介绍了Leaflet 基础入门教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • js Array操作的最简短最容易理解方法

    js Array操作的最简短最容易理解方法

    这篇文章主要是对js中的Array操作进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • typescript使用 ?. ?? ??= 运算符的方法步骤

    typescript使用 ?. ?? ??= 运算符的方法步骤

    本文主要介绍了typescript使用 ?. ?? ??= 运算符的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • 返回上一个url并刷新界面的js代码

    返回上一个url并刷新界面的js代码

    要返回上一页再刷新页面我们用到最多的是在像php,asp,jsp,asp.net中,下面我来给大家先介绍js 返回前一页并刷新页面,然后再把这些代码放在php中实现删除后返回当前页面并刷新页面
    2020-09-09
  • video.js 实现视频只能后退不能快进的思路详解

    video.js 实现视频只能后退不能快进的思路详解

    这篇文章主要介绍了video.js 实现视频只能后退不能快进的思路详解,主要思路是点击进度条需要获取拖动前的时间点,具体实例代码大家跟随小编一起看看吧
    2018-08-08
  • JSON遍历方式实例总结

    JSON遍历方式实例总结

    这篇文章主要介绍了JSON遍历方式,结合实例形式总结分析了JavaScript操作json实现遍历的常用技巧,并给出了实例总结,需要的朋友可以参考下
    2015-12-12
  • JS原型链怎么理解

    JS原型链怎么理解

    本文重点给大家介绍javascript中的原型链知识,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-06-06
  • JavaScript中的observables 操作符创建实例

    JavaScript中的observables 操作符创建实例

    这篇文章主要介绍了JavaScript中的observables 操作符创建实例的相关资料,文章介绍详细,需要的小伙伴可以参考一下,希望对你有所帮助
    2022-03-03
  • webpack+express实现文件精确缓存的示例代码

    webpack+express实现文件精确缓存的示例代码

    这篇文章主要介绍了webpack+express实现文件精确缓存的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06

最新评论