diff --git a/src/tools/index.ts b/src/tools/index.ts index bc5192a4..ca4e5f98 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -1,6 +1,7 @@ import { LockOpen } from '@vicons/tabler'; import type { ToolCategory } from './tool'; +import { tool as jwtParser } from './jwt-parser'; import { tool as mimeTypes } from './mime-types'; import { tool as otpCodeGeneratorAndValidator } from './otp-code-generator-and-validator'; import { tool as base64FileConverter } from './base64-file-converter'; @@ -67,6 +68,7 @@ export const toolsByCategory: ToolCategory[] = [ metaTagGenerator, otpCodeGeneratorAndValidator, mimeTypes, + jwtParser, ], }, { diff --git a/src/tools/jwt-parser/index.ts b/src/tools/jwt-parser/index.ts new file mode 100644 index 00000000..eb1c6e48 --- /dev/null +++ b/src/tools/jwt-parser/index.ts @@ -0,0 +1,11 @@ +import { ArrowsShuffle } from '@vicons/tabler'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'JWT parser', + path: '/jwt-parser', + description: '', + keywords: ['jwt', 'parser'], + component: () => import('./jwt-parser.vue'), + icon: ArrowsShuffle, +}); diff --git a/src/tools/jwt-parser/jwt-parser.service.ts b/src/tools/jwt-parser/jwt-parser.service.ts new file mode 100644 index 00000000..120a0990 --- /dev/null +++ b/src/tools/jwt-parser/jwt-parser.service.ts @@ -0,0 +1,20 @@ +import jwt_decode, { InvalidTokenError } from 'jwt-decode'; + +interface JWT { + header: Map; + payload: Map; +} + +export function safe_jwt_decode(raw_jwt: string): JWT { + try { + const header = jwt_decode(raw_jwt, { header: true }) as Map; + const payload = jwt_decode(raw_jwt) as Map; + return { header: header, payload: payload }; + } catch (e) { + if (e instanceof InvalidTokenError) { + return { header: new Map(), payload: new Map() }; + } else { + throw e; + } + } +} diff --git a/src/tools/jwt-parser/jwt-parser.vue b/src/tools/jwt-parser/jwt-parser.vue new file mode 100644 index 00000000..d54c2389 --- /dev/null +++ b/src/tools/jwt-parser/jwt-parser.vue @@ -0,0 +1,9 @@ + + + + +