在节点中解码 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 令牌?
使用 php-jwt 库解码 firebase 自定义令牌时出现 openssl_verify() 错误