在节点中解码 Jwt 令牌 - 没有库

Posted

技术标签:

【中文标题】在节点中解码 Jwt 令牌 - 没有库【英文标题】:Decode Jwt Token in Node - without Library 【发布时间】:2019-03-22 14:46:08 【问题描述】:

我有以下代码来解码 javascript 中的 Jwt 令牌(参考:How to decode jwt token in javascript)

const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';

function parseJwt(token) 
  var base64Url = token.split('.')[1];
  var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
  console.log(JSON.parse((atob(base64))))
;

parseJwt(token);

我从上面的代码中得到了我需要的有效载荷 但是我在没有“atob”函数来解码base64编码字符串的节点中实现它

似乎我们需要在节点中使用缓冲区。我进行了研究并提出了以下无效的解决方案。

const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
function parseJwt(token) 
  const base64Url = token.split('.')[1];
  const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
  const buff = new Buffer(base64, 'base64');
  const payloadinit = buff.toString('ascii');
  const payload = JSON.parse(payloadinit);
  console.log(payload)
;
parseJwt(token);

如果有更好的方法,请告诉我 - 没有库(Jwt 或 decode-Jwt)

【问题讨论】:

【参考方案1】:

实际上我已经在独立环境中尝试过,上面的代码就像获取 Jwt 令牌负载的魅力

const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'

const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const buff = new Buffer(base64, 'base64');
const payloadinit = buff.toString('ascii');
const payload = JSON.parse(payloadinit);
console.log(payload);

https://repl.it/@Punith/RuralSeveralAdaware

【讨论】:

谢谢!在节点 10 及以上,使用const buff = Buffer.from(base64, "base64"); 而不是 new Buffer。【参考方案2】:
const DecodeJWT= (token) => 
  try 
    return JSON.parse(atob(token.split('.')[1]));
   catch (e) 
    return null;
  
;

简单易行的方法

【讨论】:

很好的解决方案,也可以直接在客户端执行,无需缓冲区

以上是关于在节点中解码 Jwt 令牌 - 没有库的主要内容,如果未能解决你的问题,请参考以下文章

如何解码 Java 生成的 Node.js 中的 jwt 令牌?

在没有秘密的情况下解码 JWT 令牌

JWT 令牌解码

使用 php-jwt 库解码 firebase 自定义令牌时出现 openssl_verify() 错误

在 Python 中使用来自 Gravitee 的公钥解码 JWT 令牌时出现问题

PHP JWT:: **解码** 过期令牌