Chr*_*8er 167 javascript jwt
如何使用JavaScript解码JWT的有效负载?没有图书馆.因此令牌只返回我的前端应用程序可以使用的有效负载对象.
示例令牌: xxxxxxxxx.XXXXXXXX.xxxxxxxx
结果就是有效载荷:
{exp: 10012016 name: john doe, scope:['admin']}
Run Code Online (Sandbox Code Playgroud)
Peh*_*eje 362
这会有用吗?
function parseJwt (token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
};
Run Code Online (Sandbox Code Playgroud)
正如Racing Tadpole的评论中提到的,javascript replace仅替换第一次出现,而是使用正则表达式:
function parseJwt (token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
};
Run Code Online (Sandbox Code Playgroud)
Guy*_*Guy 43
你可以使用jwt-decode,那么你可以写:
import jwt_decode from 'jwt-decode';
var token = 'eyJ0eXAiO.../// jwt token';
var decoded = jwt_decode(token);
console.log(decoded);
/*{exp: 10012016 name: john doe, scope:['admin']}*/
Run Code Online (Sandbox Code Playgroud)
Raj*_*jan 34
简单的功能与try - catch
const parseJwt = (token) => {
try {
return JSON.parse(atob(token.split('.')[1]));
} catch (e) {
return null;
}
};
Run Code Online (Sandbox Code Playgroud)
谢谢!
Muh*_*ssa 33
您可以使用纯 javascriptatob()函数将令牌解码为字符串:
atob(token.split('.')[1]);
Run Code Online (Sandbox Code Playgroud)
或者直接解析成json对象:
JSON.parse(atob(token.split('.')[1]));
Run Code Online (Sandbox Code Playgroud)
阅读atob()和btoa()内置javascript 函数Base64 编码和解码- Web APIs | MDN。
has*_*e72 17
function parseJwt(token) {
var base64Payload = token.split('.')[1];
var payload = Buffer.from(base64Payload, 'base64');
return JSON.parse(payload.toString());
}
Run Code Online (Sandbox Code Playgroud)
let payload= parseJwt("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c");
console.log("payload:- ", payload);
Run Code Online (Sandbox Code Playgroud)
如果使用节点,您可能必须使用缓冲包:
npm install buffer
var Buffer = require('buffer/').Buffer
Run Code Online (Sandbox Code Playgroud)
Avi*_*vik 11
由于 nodejs 环境中不存在“window”对象,我们可以使用以下代码行:
let base64Url = token.split('.')[1]; // token you get
let base64 = base64Url.replace('-', '+').replace('_', '/');
let decodedData = JSON.parse(Buffer.from(base64, 'base64').toString('binary'));
Run Code Online (Sandbox Code Playgroud)
它非常适合我。希望能帮助到你。
Vas*_*iak 10
如果使用node.js 16或更高版本,您可以使用内置的base64url编码器/解码器。
let payload = JSON.parse(Buffer.from(token.split(".")[1], "base64url"));
Run Code Online (Sandbox Code Playgroud)
我使用此函数根据此答案获取有效负载、标头、exp(到期时间)、iat(发布于)
function parseJwt(token) {
try {
// Get Token Header
const base64HeaderUrl = token.split('.')[0];
const base64Header = base64HeaderUrl.replace('-', '+').replace('_', '/');
const headerData = JSON.parse(window.atob(base64Header));
// Get Token payload and date's
const base64Url = token.split('.')[1];
const base64 = base64Url.replace('-', '+').replace('_', '/');
const dataJWT = JSON.parse(window.atob(base64));
dataJWT.header = headerData;
// TODO: add expiration at check ...
return dataJWT;
} catch (err) {
return false;
}
}
const jwtDecoded = parseJwt('YOUR_TOKEN') ;
if(jwtDecoded)
{
console.log(jwtDecoded)
}
Run Code Online (Sandbox Code Playgroud)
小智 7
@Peheje会工作,但你会遇到unicode问题.要修复它,我使用/sf/answers/2107458601/上的代码;
let b64DecodeUnicode = str =>
decodeURIComponent(
Array.prototype.map.call(atob(str), c =>
'%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
).join(''))
let parseJwt = token =>
JSON.parse(
b64DecodeUnicode(
token.split('.')[1].replace('-', '+').replace('_', '/')
)
)
let form = document.getElementById("form")
form.addEventListener("submit", (e) => {
form.out.value = JSON.stringify(
parseJwt(form.jwt.value)
)
e.preventDefault();
})Run Code Online (Sandbox Code Playgroud)
textarea{width:300px; height:60px; display:block}Run Code Online (Sandbox Code Playgroud)
<form id="form" action="parse">
<textarea name="jwt">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkrDtGhuIETDs8OoIiwiYWRtaW4iOnRydWV9.469tBeJmYLERjlKi9u6gylb-2NsjHLC_6kZNdtoOGsA</textarea>
<textarea name="out"></textarea>
<input type="submit" value="parse" />
</form>Run Code Online (Sandbox Code Playgroud)
如果您使用 Node.JS,您可以通过执行以下操作来使用本机 Buffer 模块:
const token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6ImU3YjQ0Mjc4LTZlZDYtNDJlZC05MTZmLWFjZDQzNzhkM2U0YSIsImlhdCI6MTU5NTg3NzUxOCwiZXhwIjoxNTk1ODgxMTE4fQ.WXyDlDMMSJAjOFF9oAU9JrRHg2wio-WolWAkAaY3kg4';
const tokenDecodablePart = token.split('.')[1];
const decoded = Buffer.from(base64Url, 'base64').toString();
console.log(decoded)
Run Code Online (Sandbox Code Playgroud)
你很高兴去:-)
如果您使用的是Typescript 或vanilla JavaScript,这是一个零依赖项,可以在您的项目简单函数中复制粘贴(基于 @Rajan Maharjan 的答案)。
这个答案特别好,不仅因为它不依赖于任何 npm 模块,还因为它不依赖于Buffer这里的其他一些解决方案正在使用的任何 node.js 内置模块(如),当然会失败浏览器(除非polyfill,但首先没有理由这样做)。此外 JSON.parse 可能会在运行时失败,这个版本(尤其是在 Typescript 中)将强制处理它。JSDoc 注释将使您的代码的未来维护者心存感激。:)
/**
* Returns a JS object representation of a Javascript Web Token from its common encoded
* string form.
*
* @template T the expected shape of the parsed token
* @param {string} token a Javascript Web Token in base64 encoded, `.` separated form
* @returns {(T | undefined)} an object-representation of the token
* or undefined if parsing failed
*/
export function getParsedJwt<T extends object = { [k: string]: string | number }>(
token: string,
): T | undefined {
try {
return JSON.parse(atob(token.split('.')[1]))
} catch {
return undefined
}
}
Run Code Online (Sandbox Code Playgroud)
为了完成,这里也是香草 javascript 版本:
/**
* Returns a JS object representation of a Javascript Web Token from its common encoded
* string form.
*
* @param {string} token a Javascript Web Token in base64 encoded, `.` separated form
* @returns {(object | undefined)} an object-representation of the token
* or undefined if parsing failed
*/
export function getParsedJwt(token) {
try {
return JSON.parse(atob(token.split('.')[1]))
} catch (error) {
return undefined
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我在jwt.io 上找到了这段代码,它运行良好。
//this is used to parse base64
function url_base64_decode(str) {
var output = str.replace(/-/g, '+').replace(/_/g, '/');
switch (output.length % 4) {
case 0:
break;
case 2:
output += '==';
break;
case 3:
output += '=';
break;
default:
throw 'Illegal base64url string!';
}
var result = window.atob(output); //polifyll https://github.com/davidchambers/Base64.js
try{
return decodeURIComponent(escape(result));
} catch (err) {
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下(某些开发平台),
最佳答案(目前)面临 base64 长度无效的问题。
所以,我需要一种更稳定的方式。
我希望它会帮助你。
基于GitHub - auth0/jwt-decode的答案。更改输入/输出以包括字符串拆分和返回对象 { header, Payload, Signature },这样您就可以传递整个令牌。
var jwtDecode = function (jwt) {
function b64DecodeUnicode(str) {
return decodeURIComponent(atob(str).replace(/(.)/g, function (m, p) {
var code = p.charCodeAt(0).toString(16).toUpperCase();
if (code.length < 2) {
code = '0' + code;
}
return '%' + code;
}));
}
function decode(str) {
var output = str.replace(/-/g, "+").replace(/_/g, "/");
switch (output.length % 4) {
case 0:
break;
case 2:
output += "==";
break;
case 3:
output += "=";
break;
default:
throw "Illegal base64url string!";
}
try {
return b64DecodeUnicode(output);
} catch (err) {
return atob(output);
}
}
var jwtArray = jwt.split('.');
return {
header: decode(jwtArray[0]),
payload: decode(jwtArray[1]),
signature: decode(jwtArray[2])
};
};
Run Code Online (Sandbox Code Playgroud)
您可以定义并使用这个衬垫函数:
jwtDecode = b => JSON.parse(Buffer.from(b.split('.')[1], 'base64').toString('binary'));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
131384 次 |
| 最近记录: |