Как расшифровать токенов JWT в JavaScript
Как я могу декодировать полезную нагрузку JWT с помощью JavaScript? Без библиотеки. Таким образом, маркер просто возвращает объект полезной нагрузки, который может использоваться моим интерфейсным приложением.
пример маркера: xxxxxxxxx.XXXXXXXX.xxxxxxxx
и результатом является полезная нагрузка:
{exp: 10012016 name: john doe, scope:['admin']}
8 ответов:
будет ли это работать?
function parseJwt (token) { var base64Url = token.split('.')[1]; var base64 = base64Url.replace('-', '+').replace('_', '/'); return JSON.parse(window.atob(base64)); };
Как уже упоминалось в комментариях Racing Tadpole javascript replace заменяет только первое вхождение, вместо этого используйте регулярное выражение:
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
можно использовать 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']}*/
простая функция с try-catch
const parseJwt = (token) => { try { return JSON.parse(atob(token.split('.')[1])); } catch (e) { return null; } };
спасибо!
@Peheje будет работать, но у вас будут проблемы с unicode. Чтобы исправить это я использую код наhttps://stackoverflow.com/a/30106551/5277071;
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(); })
textarea{width:300px; height:60px; display:block}
<form id="form" action="parse"> <textarea name="jwt">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkrDtGhuIETDs8OoIiwiYWRtaW4iOnRydWV9.469tBeJmYLERjlKi9u6gylb-2NsjHLC_6kZNdtoOGsA</textarea> <textarea name="out"></textarea> <input type="submit" value="parse" /> </form>
Я нашел этот код в 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; } }
в некоторых случаях(определенные платформы развития),
лучший ответ(на данный момент) сталкивается с проблемой недопустимой длины base64.
Поэтому мне нужен был более стабильный способ.Я надеюсь, что это поможет вам.
Я использую эту функцию, чтобы получить полезную нагрузку, заголовок, exp (время истечения), iat (выданный At) на основе этой ответ
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) }
и Гай, и Пехедже уже ответили на вопрос. Для полного новичка, такого как я, было полезно также иметь строку импорта, определенную в Примере.
также мне потребовалось несколько минут, чтобы понять, что токен-это полный набор учетных данных, которые отправляются обратно (весь токен JWT, а не только его часть idToken). Просто, как только вы это знаете..
import jwt_decode from 'jwt-decode'; var token = 'eyJ0eXAiO.../// jwt token'; var decoded = jwt_decode(token); /*{exp: 10012016 name: john doe, scope:['admin']}*/