@jjlmoya/utils-developer 1.16.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/category/index.ts +3 -1
- package/src/entries.ts +7 -1
- package/src/index.ts +4 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/calculadoraTiempoDatos/data-time-calculator-web-speed-impact.css +498 -499
- package/src/tool/jwtDecoder/bibliography.astro +14 -0
- package/src/tool/jwtDecoder/bibliography.ts +12 -0
- package/src/tool/jwtDecoder/component.astro +209 -0
- package/src/tool/jwtDecoder/entry.ts +30 -0
- package/src/tool/jwtDecoder/i18n/de.ts +248 -0
- package/src/tool/jwtDecoder/i18n/en.ts +247 -0
- package/src/tool/jwtDecoder/i18n/es.ts +248 -0
- package/src/tool/jwtDecoder/i18n/fr.ts +248 -0
- package/src/tool/jwtDecoder/i18n/id.ts +248 -0
- package/src/tool/jwtDecoder/i18n/it.ts +248 -0
- package/src/tool/jwtDecoder/i18n/ja.ts +248 -0
- package/src/tool/jwtDecoder/i18n/ko.ts +248 -0
- package/src/tool/jwtDecoder/i18n/nl.ts +247 -0
- package/src/tool/jwtDecoder/i18n/pl.ts +247 -0
- package/src/tool/jwtDecoder/i18n/pt.ts +247 -0
- package/src/tool/jwtDecoder/i18n/ru.ts +248 -0
- package/src/tool/jwtDecoder/i18n/sv.ts +248 -0
- package/src/tool/jwtDecoder/i18n/tr.ts +248 -0
- package/src/tool/jwtDecoder/i18n/zh.ts +248 -0
- package/src/tool/jwtDecoder/index.ts +11 -0
- package/src/tool/jwtDecoder/jwt-decoder-parser-and-claims-inspector.css +358 -0
- package/src/tool/jwtDecoder/logic.ts +96 -0
- package/src/tool/jwtDecoder/seo.astro +15 -0
- package/src/tool/jwtDecoder/ui.ts +38 -0
- package/src/tool/serpPixelSimulator/bibliography.astro +11 -4
- package/src/tool/serpPixelSimulator/index.ts +0 -4
- package/src/tool/serpPixelSimulator/seo.astro +8 -5
- package/src/tool/visualCssGridFlexboxGenerator/bibliography.astro +14 -0
- package/src/tool/visualCssGridFlexboxGenerator/bibliography.ts +20 -0
- package/src/tool/visualCssGridFlexboxGenerator/canvas.ts +103 -0
- package/src/tool/visualCssGridFlexboxGenerator/component.astro +218 -0
- package/src/tool/visualCssGridFlexboxGenerator/entry.ts +30 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/de.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/en.ts +256 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/es.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/fr.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/id.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/it.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/ja.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/ko.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/nl.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/pl.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/pt.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/ru.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/sv.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/tr.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/i18n/zh.ts +110 -0
- package/src/tool/visualCssGridFlexboxGenerator/index.ts +11 -0
- package/src/tool/visualCssGridFlexboxGenerator/interactions.ts +45 -0
- package/src/tool/visualCssGridFlexboxGenerator/logic.ts +49 -0
- package/src/tool/visualCssGridFlexboxGenerator/presets.ts +63 -0
- package/src/tool/visualCssGridFlexboxGenerator/seo.astro +15 -0
- package/src/tool/visualCssGridFlexboxGenerator/ui.ts +58 -0
- package/src/tool/visualCssGridFlexboxGenerator/visual-css-grid-flexbox-generator.css +816 -0
- package/src/tool/visualCssGridFlexboxGenerator/workspace.ts +192 -0
- package/src/tools.ts +3 -1
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { JwtDecoderUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'dekoder-jwt-parser-i-inspektor-claims';
|
|
7
|
+
const title = 'Dekoder JWT, Parser i Inspektor Claims';
|
|
8
|
+
const description = 'Wklej JSON Web Token, natychmiast zdekoduj jego nagłówek i payload, sprawdź zarejestrowane claims, wykryj wygasłe tokeny i skopiuj czysty JSON do debugowania procesów uwierzytelniania.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Wklej JWT',
|
|
13
|
+
text: 'Skopiuj token z nagłówka Authorization, ciasteczka, wpisu w logu lub dostawcy tożsamości i wklej go w pole wejściowe.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Odczytaj odkodowany nagłówek i payload',
|
|
17
|
+
text: 'Narzędzie dzieli token na nagłówek, payload i podpis, a następnie renderuje segmenty JSON w oddzielnych panelach do szybkiej inspekcji.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Sprawdź ważne claims',
|
|
21
|
+
text: 'Przejrzyj algorytm, wystawcę, odbiorcę, temat, czas wystawienia, czas ważności od i czas wygaśnięcia bez ręcznego przeliczania znaczników czasu Unix.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Skopiuj potrzebne dane',
|
|
25
|
+
text: 'Skopiuj jedną odkodowaną sekcję lub całe odkodowane dane wyjściowe, gdy potrzebujesz udostępnić oczyszczoną migawkę debugowania swojemu zespołowi.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: 'Czy odkodowanie JWT dowodzi, że token jest ważny?',
|
|
32
|
+
answer: 'Nie. Odkodowanie ujawnia tylko nagłówek i payload zakodowane w base64url. Token jest godny zaufania dopiero po zweryfikowaniu podpisu, wystawcy, odbiorcy, daty wygaśnięcia i powiązanych claims przez aplikację lub dostawcę tożsamości.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: 'Czy mogę używać tego dekodera JWT do access tokenów i ID tokenów?',
|
|
36
|
+
answer: 'Tak. Dekoder jest przydatny do inspekcji access tokenów OAuth, ID tokenów OpenID Connect, tokenów sesyjnych i tokenów service-to-service, o ile używają standardowego trzyczęściowego formatu JWT.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'Dlaczego panel podpisu nie weryfikuje tokena?',
|
|
40
|
+
answer: 'Weryfikacja JWT wymaga poprawnego sekretu, klucza publicznego lub konfiguracji JWKS. To narzędzie celowo koncentruje się na odkodowaniu i inspekcji, aby programiści mogli zobaczyć zawartość tokena bez udawania, że widoczny ciąg podpisu jest dowodem ważności.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: 'Co powinienem sprawdzić najpierw podczas debugowania JWT?',
|
|
44
|
+
answer: 'Zacznij od exp, nbf, iss, aud i alg. Większość rzeczywistych problemów produkcyjnych wynika z wygasłych tokenów, rozbieżności zegarów, nieprawidłowych wartości odbiorcy, nieoczekiwanych adresów URL wystawcy lub niebezpiecznych założeń dotyczących algorytmu.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: JwtDecoderUI = {
|
|
49
|
+
tokenLabel: 'Token JWT',
|
|
50
|
+
tokenPlaceholder: 'Wklej tutaj JWT: nagłówek.payload.podpis',
|
|
51
|
+
sampleButton: 'Wczytaj przykład',
|
|
52
|
+
clearButton: 'Wyczyść',
|
|
53
|
+
statusWaiting: 'Wklej token, aby odkodować jego nagłówek JSON, payload i claims.',
|
|
54
|
+
statusValid: 'JWT pomyślnie odkodowany.',
|
|
55
|
+
statusInvalid: 'To nie wygląda na poprawny trzyczęściowy JWT.',
|
|
56
|
+
statusExpired: 'JWT odkodowany, ale claim exp jest już wygasły.',
|
|
57
|
+
statusUnsigned: 'JWT odkodowany, ale nie jest podpisany lub używa algorytmu none.',
|
|
58
|
+
headerTitle: 'Nagłówek',
|
|
59
|
+
payloadTitle: 'Payload',
|
|
60
|
+
signatureTitle: 'Podpis',
|
|
61
|
+
claimsTitle: 'Zarejestrowane claims',
|
|
62
|
+
copyHeader: 'Kopiuj odkodowany nagłówek',
|
|
63
|
+
copyPayload: 'Kopiuj odkodowany payload',
|
|
64
|
+
copySignature: 'Kopiuj podpis',
|
|
65
|
+
copyAll: 'Kopiuj wszystko',
|
|
66
|
+
copiedLabel: 'Skopiowano',
|
|
67
|
+
invalidTokenTitle: 'Nieprawidłowy JWT',
|
|
68
|
+
invalidTokenBody: 'Sprawdź, czy token ma trzy segmenty base64url oddzielone kropkami.',
|
|
69
|
+
invalidSegmentError: 'Sprawdź, czy token ma trzy segmenty base64url oddzielone kropkami.',
|
|
70
|
+
invalidDecodeError: 'Nagłówek lub payload nie mógł zostać odkodowany jako prawidłowy JSON.',
|
|
71
|
+
emptyJson: '{}',
|
|
72
|
+
signaturePresent: 'Segment podpisu jest obecny; zweryfikuj go w swojej warstwie uwierzytelniania z poprawnym kluczem.',
|
|
73
|
+
signatureMissing: 'Brak segmentu podpisu',
|
|
74
|
+
algorithmLabel: 'Algorytm',
|
|
75
|
+
typeLabel: 'Typ',
|
|
76
|
+
issuerLabel: 'Wystawca',
|
|
77
|
+
subjectLabel: 'Temat',
|
|
78
|
+
audienceLabel: 'Odbiorca',
|
|
79
|
+
issuedAtLabel: 'Wystawiony',
|
|
80
|
+
notBeforeLabel: 'Ważny od',
|
|
81
|
+
expiresAtLabel: 'Wygasa',
|
|
82
|
+
claimMissing: 'Nieobecny',
|
|
83
|
+
privacyNote: 'Dekodowanie odbywa się w sesji przeglądarki. Nie wklejaj sekretów produkcyjnych do żadnego narzędzia, chyba że zezwala na to Twoja polityka bezpieczeństwa.',
|
|
84
|
+
sampleToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJnYW1lYm9iLXVzZXItNDIiLCJuYW1lIjoiR2FtZUJvYiBEZXZlbG9wZXIiLCJpc3MiOiJodHRwczovL3d3dy5nYW1lYm9iLmRldiIsImF1ZCI6ImRldmVsb3Blci10b29scyIsImlhdCI6MTcxNzIwMDAwMCwibmJmIjoxNzE3MjAwMDAwLCJleHAiOjE4OTM0NTYwMDAsInJvbGUiOiJhZG1pbiJ9.demo-signature',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
88
|
+
'@context': 'https://schema.org',
|
|
89
|
+
'@type': 'FAQPage',
|
|
90
|
+
mainEntity: faq.map((item) => ({
|
|
91
|
+
'@type': 'Question',
|
|
92
|
+
name: item.question,
|
|
93
|
+
acceptedAnswer: {
|
|
94
|
+
'@type': 'Answer',
|
|
95
|
+
text: item.answer,
|
|
96
|
+
},
|
|
97
|
+
})),
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const howToSchema: WithContext<HowTo> = {
|
|
101
|
+
'@context': 'https://schema.org',
|
|
102
|
+
'@type': 'HowTo',
|
|
103
|
+
name: title,
|
|
104
|
+
description,
|
|
105
|
+
step: howTo.map((step, index) => ({
|
|
106
|
+
'@type': 'HowToStep',
|
|
107
|
+
position: index + 1,
|
|
108
|
+
name: step.name,
|
|
109
|
+
text: step.text,
|
|
110
|
+
})),
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
114
|
+
'@context': 'https://schema.org',
|
|
115
|
+
'@type': 'SoftwareApplication',
|
|
116
|
+
name: title,
|
|
117
|
+
description,
|
|
118
|
+
applicationCategory: 'DeveloperApplication',
|
|
119
|
+
operatingSystem: 'Any',
|
|
120
|
+
offers: {
|
|
121
|
+
'@type': 'Offer',
|
|
122
|
+
price: '0',
|
|
123
|
+
priceCurrency: 'EUR',
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export const content: ToolLocaleContent<JwtDecoderUI> = {
|
|
128
|
+
slug,
|
|
129
|
+
title,
|
|
130
|
+
description,
|
|
131
|
+
ui,
|
|
132
|
+
faqTitle: 'FAQ dekodera JWT',
|
|
133
|
+
faq,
|
|
134
|
+
bibliographyTitle: 'Specyfikacje JWT i odniesienia bezpieczeństwa',
|
|
135
|
+
bibliography,
|
|
136
|
+
howTo,
|
|
137
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
138
|
+
seo: [
|
|
139
|
+
{
|
|
140
|
+
type: 'title',
|
|
141
|
+
text: 'Dekoduj JWT bez utraty kontekstu bezpieczeństwa',
|
|
142
|
+
level: 2,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'paragraph',
|
|
146
|
+
html: 'JSON Web Token wygląda na zwarty, ale często zawiera dokładnie te szczegóły, które wyjaśniają błąd uwierzytelniania: algorytm podpisywania, wystawcę, odbiorcę, temat, czas wystawienia, czas ważności od, datę wygaśnięcia i claims autoryzacyjne specyficzne dla aplikacji. Ten <strong>dekoder JWT, parser i inspektor claims</strong> przekształca trzy segmenty tokena w czytelny JSON, dzięki czemu możesz szybciej debugować procesy uwierzytelniania.',
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'diagnostic',
|
|
150
|
+
variant: 'warning',
|
|
151
|
+
title: 'Odkodowany nie oznacza zaufany',
|
|
152
|
+
html: 'Każdy może zdekodować JWT za pomocą base64url. Zaufanie zaczyna się dopiero po zweryfikowaniu podpisu przez aplikację przy użyciu poprawnego sekretu, klucza publicznego lub JWKS, a następnie zwalidowaniu wystawcy, odbiorcy, daty wygaśnięcia i wszelkich claims specyficznych dla domeny. Używaj tego narzędzia do inspekcji danych, a nie do uznawania tokena za autentyczny.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'title',
|
|
156
|
+
text: 'Co mówi każdy segment JWT',
|
|
157
|
+
level: 3,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'table',
|
|
161
|
+
headers: ['Segment', 'Typowa zawartość', 'Wartość debugowania'],
|
|
162
|
+
rows: [
|
|
163
|
+
['Nagłówek', 'Algorytm, typ tokena i opcjonalny identyfikator klucza', 'Pokazuje, czy token oczekuje HS256, RS256, ES256 lub innej strategii weryfikacji.'],
|
|
164
|
+
['Payload', 'Zarejestrowane claims i claims aplikacji', 'Ujawnia tożsamość, dzierżawę, zakresy, role, wygaśnięcie i niezgodności odbiorcy.'],
|
|
165
|
+
['Podpis', 'Bajty podpisu kryptograficznego zakodowane jako base64url', 'Potwierdza, że segment podpisu istnieje, ale musi zostać zweryfikowany z odpowiednim kluczem w innym miejscu.'],
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
type: 'title',
|
|
170
|
+
text: 'Claims, które zwykle wyjaśniają nieudane uwierzytelnianie',
|
|
171
|
+
level: 3,
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
type: 'list',
|
|
175
|
+
items: [
|
|
176
|
+
'<strong>exp:</strong> jeśli token wygasł, logika odświeżania lub ustawienia zegara mogą być nieprawidłowe.',
|
|
177
|
+
'<strong>nbf:</strong> jeśli token nie jest jeszcze aktywny, zegary serwera i dostawcy tożsamości mogą być rozsynchronizowane.',
|
|
178
|
+
'<strong>iss:</strong> jeśli adres URL wystawcy różni się od konfiguracji, token może pochodzić z niewłaściwej dzierżawy lub środowiska.',
|
|
179
|
+
'<strong>aud:</strong> jeśli odbiorca nie pasuje do identyfikatora API, token został wybity dla innego zasobu.',
|
|
180
|
+
'<strong>alg:</strong> jeśli algorytm jest nieoczekiwany, weryfikator może odrzucić token lub ujawnić niebezpieczny błąd konfiguracji.',
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
type: 'title',
|
|
185
|
+
text: 'Zastosowania parsera JWT podczas programowania',
|
|
186
|
+
level: 3,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'comparative',
|
|
190
|
+
columns: 3,
|
|
191
|
+
items: [
|
|
192
|
+
{
|
|
193
|
+
title: 'Debugowanie frontendu',
|
|
194
|
+
description: 'Sprawdzaj ID tokeny i access tokeny otrzymane po zalogowaniu, aby potwierdzić zakresy, role i claims profilu.',
|
|
195
|
+
icon: 'mdi:monitor-dashboard',
|
|
196
|
+
points: ['Sprawdź claims profilu', 'Potwierdź zakresy i role', 'Porównaj środowiska logowania'],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
title: 'QA API backendu',
|
|
200
|
+
description: 'Porównaj oczekiwane wartości wystawcy i odbiorcy z tokenem faktycznie wysłanym w nagłówku Authorization.',
|
|
201
|
+
icon: 'mdi:api',
|
|
202
|
+
highlight: true,
|
|
203
|
+
points: ['Zweryfikuj kształt odbiorcy', 'Wykryj niezgodności wystawcy', 'Sprawdź bearer tokeny'],
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
title: 'Konfiguracja dostawcy tożsamości',
|
|
207
|
+
description: 'Sprawdź, czy claims z Auth0, Azure AD, Cognito, Keycloak lub niestandardowego dostawcy są ukształtowane zgodnie z oczekiwaniami aplikacji.',
|
|
208
|
+
icon: 'mdi:account-key',
|
|
209
|
+
points: ['Przejrzyj dane dzierżawcy', 'Sprawdź niestandardowe claims', 'Porównaj mapowania dostawców'],
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
type: 'title',
|
|
215
|
+
text: 'Typowe błędy JWT, które ten inspektor uwidacznia',
|
|
216
|
+
level: 3,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
type: 'proscons',
|
|
220
|
+
title: 'Szybkie kontrole a decyzje o zaufaniu',
|
|
221
|
+
items: [
|
|
222
|
+
{
|
|
223
|
+
pro: 'Natychmiast zobacz nieprawidłowo sformułowane tokeny.',
|
|
224
|
+
con: 'Nie może znać oczekiwanego odbiorcy ani wystawcy.',
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
pro: 'Konwertuj claims ze znacznikami czasu Unix na czytelne daty.',
|
|
228
|
+
con: 'Nie może zweryfikować podpisu bez rzeczywistego materiału klucza.',
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
pro: 'Wykryj brakujące wartości wystawcy, odbiorcy, tematu lub typu.',
|
|
232
|
+
con: 'Nie może udowodnić, że zakresy i role są bezpieczne dla Twojej aplikacji.',
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
type: 'summary',
|
|
238
|
+
title: 'Najlepsze praktyki pracy',
|
|
239
|
+
items: [
|
|
240
|
+
'Odkoduj token, aby zrozumieć, co klient lub API faktycznie otrzymało.',
|
|
241
|
+
'Sprawdź exp, nbf, iss, aud, sub i alg przed analizą logiki aplikacji.',
|
|
242
|
+
'Weryfikuj podpisy i decyzje o zaufaniu tylko w warstwie uwierzytelniania.',
|
|
243
|
+
'Unikaj udostępniania wrażliwych produkcyjnych JWT w zgłoszeniach, logach lub zrzutach ekranu.',
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
};
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { JwtDecoderUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'decodificador-jwt-parser-e-inspetor-de-claims';
|
|
7
|
+
const title = 'Decodificador JWT, Parser e Inspetor de Claims';
|
|
8
|
+
const description = 'Cole um JSON Web Token, decodifique seu cabeçalho e payload instantaneamente, inspecione claims registradas, identifique tokens expirados e copie JSON limpo para depurar fluxos de autenticação.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Cole o JWT',
|
|
13
|
+
text: 'Copie um token de um cabeçalho Authorization, cookie, entrada de log ou provedor de identidade e cole-o no campo de entrada.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Leia o cabeçalho e payload decodificados',
|
|
17
|
+
text: 'A ferramenta divide o token em cabeçalho, payload e assinatura, depois renderiza os segmentos JSON em painéis separados para inspeção rápida.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Verifique claims importantes',
|
|
21
|
+
text: 'Revise algoritmo, emissor, audiência, assunto, data de emissão, data de validade inicial e data de expiração sem converter manualmente timestamps Unix.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Copie os dados necessários',
|
|
25
|
+
text: 'Copie uma seção decodificada ou a saída completa quando precisar compartilhar um snapshot de depuração higienizado com sua equipe.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: 'Decodificar um JWT prova que o token é válido?',
|
|
32
|
+
answer: 'Não. A decodificação apenas revela o cabeçalho e o payload codificados em base64url. Um token só é confiável depois que a assinatura, emissor, audiência, expiração e claims relacionadas são validadas pela aplicação ou provedor de identidade.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: 'Posso usar este decodificador JWT para access tokens e ID tokens?',
|
|
36
|
+
answer: 'Sim. O decodificador é útil para inspecionar access tokens OAuth, ID tokens OpenID Connect, tokens de sessão e tokens serviço a serviço, desde que usem o formato JWT padrão de três partes.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'Por que o painel de assinatura não verifica o token?',
|
|
40
|
+
answer: 'A verificação JWT requer o segredo correto, chave pública ou configuração JWKS. Esta ferramenta foca intencionalmente na decodificação e inspeção para que os desenvolvedores possam ver o conteúdo do token sem fingir que uma string de assinatura visível é prova de validade.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: 'O que devo verificar primeiro ao depurar um JWT?',
|
|
44
|
+
answer: 'Comece com exp, nbf, iss, aud e alg. A maioria dos problemas reais de produção vem de tokens expirados, desvio de relógio, valores de audiência incorretos, URLs de emissor inesperadas ou suposições inseguras de algoritmo.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: JwtDecoderUI = {
|
|
49
|
+
tokenLabel: 'Token JWT',
|
|
50
|
+
tokenPlaceholder: 'Cole um JWT aqui: cabeçalho.payload.assinatura',
|
|
51
|
+
sampleButton: 'Carregar exemplo',
|
|
52
|
+
clearButton: 'Limpar',
|
|
53
|
+
statusWaiting: 'Cole um token para decodificar seu cabeçalho JSON, payload e claims.',
|
|
54
|
+
statusValid: 'JWT decodificado com sucesso.',
|
|
55
|
+
statusInvalid: 'Isso não parece ser um JWT válido de três partes.',
|
|
56
|
+
statusExpired: 'JWT decodificado, mas a claim exp já está expirada.',
|
|
57
|
+
statusUnsigned: 'JWT decodificado, mas não está assinado ou usa algoritmo none.',
|
|
58
|
+
headerTitle: 'Cabeçalho',
|
|
59
|
+
payloadTitle: 'Payload',
|
|
60
|
+
signatureTitle: 'Assinatura',
|
|
61
|
+
claimsTitle: 'Claims registradas',
|
|
62
|
+
copyHeader: 'Copiar cabeçalho decodificado',
|
|
63
|
+
copyPayload: 'Copiar payload decodificado',
|
|
64
|
+
copySignature: 'Copiar assinatura',
|
|
65
|
+
copyAll: 'Copiar tudo',
|
|
66
|
+
copiedLabel: 'Copiado',
|
|
67
|
+
invalidTokenTitle: 'JWT inválido',
|
|
68
|
+
invalidTokenBody: 'Verifique se o token tem três segmentos base64url separados por pontos.',
|
|
69
|
+
invalidSegmentError: 'Verifique se o token tem três segmentos base64url separados por pontos.',
|
|
70
|
+
invalidDecodeError: 'O cabeçalho ou payload não pode ser decodificado como JSON válido.',
|
|
71
|
+
emptyJson: '{}',
|
|
72
|
+
signaturePresent: 'O segmento de assinatura está presente; verifique-o em sua camada de autenticação com a chave correta.',
|
|
73
|
+
signatureMissing: 'Nenhum segmento de assinatura',
|
|
74
|
+
algorithmLabel: 'Algoritmo',
|
|
75
|
+
typeLabel: 'Tipo',
|
|
76
|
+
issuerLabel: 'Emissor',
|
|
77
|
+
subjectLabel: 'Assunto',
|
|
78
|
+
audienceLabel: 'Audiência',
|
|
79
|
+
issuedAtLabel: 'Emitido em',
|
|
80
|
+
notBeforeLabel: 'Válido a partir de',
|
|
81
|
+
expiresAtLabel: 'Expira em',
|
|
82
|
+
claimMissing: 'Não presente',
|
|
83
|
+
privacyNote: 'A decodificação é executada no seu navegador. Não cole segredos de produção em nenhuma ferramenta a menos que sua política de segurança permita.',
|
|
84
|
+
sampleToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJnYW1lYm9iLXVzZXItNDIiLCJuYW1lIjoiR2FtZUJvYiBEZXZlbG9wZXIiLCJpc3MiOiJodHRwczovL3d3dy5nYW1lYm9iLmRldiIsImF1ZCI6ImRldmVsb3Blci10b29scyIsImlhdCI6MTcxNzIwMDAwMCwibmJmIjoxNzE3MjAwMDAwLCJleHAiOjE4OTM0NTYwMDAsInJvbGUiOiJhZG1pbiJ9.demo-signature',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
88
|
+
'@context': 'https://schema.org',
|
|
89
|
+
'@type': 'FAQPage',
|
|
90
|
+
mainEntity: faq.map((item) => ({
|
|
91
|
+
'@type': 'Question',
|
|
92
|
+
name: item.question,
|
|
93
|
+
acceptedAnswer: {
|
|
94
|
+
'@type': 'Answer',
|
|
95
|
+
text: item.answer,
|
|
96
|
+
},
|
|
97
|
+
})),
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const howToSchema: WithContext<HowTo> = {
|
|
101
|
+
'@context': 'https://schema.org',
|
|
102
|
+
'@type': 'HowTo',
|
|
103
|
+
name: title,
|
|
104
|
+
description,
|
|
105
|
+
step: howTo.map((step, index) => ({
|
|
106
|
+
'@type': 'HowToStep',
|
|
107
|
+
position: index + 1,
|
|
108
|
+
name: step.name,
|
|
109
|
+
text: step.text,
|
|
110
|
+
})),
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
114
|
+
'@context': 'https://schema.org',
|
|
115
|
+
'@type': 'SoftwareApplication',
|
|
116
|
+
name: title,
|
|
117
|
+
description,
|
|
118
|
+
applicationCategory: 'DeveloperApplication',
|
|
119
|
+
operatingSystem: 'Any',
|
|
120
|
+
offers: {
|
|
121
|
+
'@type': 'Offer',
|
|
122
|
+
price: '0',
|
|
123
|
+
priceCurrency: 'EUR',
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export const content: ToolLocaleContent<JwtDecoderUI> = {
|
|
128
|
+
slug,
|
|
129
|
+
title,
|
|
130
|
+
description,
|
|
131
|
+
ui,
|
|
132
|
+
faqTitle: 'FAQ do decodificador JWT',
|
|
133
|
+
faq,
|
|
134
|
+
bibliographyTitle: 'Especificações JWT e referências de segurança',
|
|
135
|
+
bibliography,
|
|
136
|
+
howTo,
|
|
137
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
138
|
+
seo: [
|
|
139
|
+
{
|
|
140
|
+
type: 'title',
|
|
141
|
+
text: 'Decodifique JWTs sem perder o contexto de segurança',
|
|
142
|
+
level: 2,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'paragraph',
|
|
146
|
+
html: 'Um JSON Web Token parece compacto, mas frequentemente carrega o detalhe exato que explica uma falha de autenticação: o algoritmo de assinatura, emissor, audiência, assunto, data de emissão, data de validade inicial, expiração e claims de autorização específicas da aplicação. Este <strong>decodificador JWT, parser e inspetor de claims</strong> transforma os três segmentos do token em JSON legível para que você possa depurar fluxos de autenticação mais rapidamente.',
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'diagnostic',
|
|
150
|
+
variant: 'warning',
|
|
151
|
+
title: 'Decodificado não significa confiável',
|
|
152
|
+
html: 'Qualquer pessoa pode decodificar um JWT em base64url. A confiança começa apenas depois que sua aplicação verifica a assinatura com o segredo correto, chave pública ou JWKS, e então valida emissor, audiência, expiração e quaisquer claims específicas do domínio. Use esta ferramenta para inspecionar dados, não para aceitar um token como autêntico.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'title',
|
|
156
|
+
text: 'O que cada segmento JWT revela',
|
|
157
|
+
level: 3,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'table',
|
|
161
|
+
headers: ['Segmento', 'Conteúdo típico', 'Valor para depuração'],
|
|
162
|
+
rows: [
|
|
163
|
+
['Cabeçalho', 'Algoritmo, tipo de token e ID de chave opcional', 'Mostra se o token espera HS256, RS256, ES256 ou outra estratégia de verificação.'],
|
|
164
|
+
['Payload', 'Claims registradas e claims da aplicação', 'Revela identidade, tenant, escopos, funções, expiração e incompatibilidades de audiência.'],
|
|
165
|
+
['Assinatura', 'Bytes de assinatura criptográfica codificados como base64url', 'Confirma que um segmento de assinatura existe, mas deve ser verificado com a chave correta em outro lugar.'],
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
type: 'title',
|
|
170
|
+
text: 'Claims que geralmente explicam falhas de autenticação',
|
|
171
|
+
level: 3,
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
type: 'list',
|
|
175
|
+
items: [
|
|
176
|
+
'<strong>exp:</strong> se o token expirou, a lógica de renovação ou as configurações de relógio podem estar erradas.',
|
|
177
|
+
'<strong>nbf:</strong> se o token ainda não está ativo, os relógios do servidor e do provedor de identidade podem estar dessincronizados.',
|
|
178
|
+
'<strong>iss:</strong> se a URL do emissor difere da configuração, o token pode vir do tenant ou ambiente errado.',
|
|
179
|
+
'<strong>aud:</strong> se a audiência não corresponde ao identificador da API, o token foi emitido para outro recurso.',
|
|
180
|
+
'<strong>alg:</strong> se o algoritmo é inesperado, seu verificador pode rejeitar o token ou expor um erro de configuração perigoso.',
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
type: 'title',
|
|
185
|
+
text: 'Casos de uso de um parser JWT durante o desenvolvimento',
|
|
186
|
+
level: 3,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'comparative',
|
|
190
|
+
columns: 3,
|
|
191
|
+
items: [
|
|
192
|
+
{
|
|
193
|
+
title: 'Depuração frontend',
|
|
194
|
+
description: 'Inspecione ID tokens e access tokens recebidos após o login para confirmar escopos, funções e claims de perfil.',
|
|
195
|
+
icon: 'mdi:monitor-dashboard',
|
|
196
|
+
points: ['Verificar claims de perfil', 'Confirmar escopos e funções', 'Comparar ambientes de login'],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
title: 'QA de API backend',
|
|
200
|
+
description: 'Compare valores esperados de emissor e audiência com o token realmente enviado no cabeçalho Authorization.',
|
|
201
|
+
icon: 'mdi:api',
|
|
202
|
+
highlight: true,
|
|
203
|
+
points: ['Validar formato da audiência', 'Identificar incompatibilidades de emissor', 'Inspecionar bearer tokens'],
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
title: 'Configuração de provedor de identidade',
|
|
207
|
+
description: 'Verifique se as claims do Auth0, Azure AD, Cognito, Keycloak ou um provedor personalizado estão formatadas como sua aplicação espera.',
|
|
208
|
+
icon: 'mdi:account-key',
|
|
209
|
+
points: ['Revisar dados do tenant', 'Verificar claims personalizadas', 'Comparar mapeamentos do provedor'],
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
type: 'title',
|
|
215
|
+
text: 'Erros comuns de JWT que este inspetor torna óbvios',
|
|
216
|
+
level: 3,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
type: 'proscons',
|
|
220
|
+
title: 'Verificações rápidas versus decisões de confiança',
|
|
221
|
+
items: [
|
|
222
|
+
{
|
|
223
|
+
pro: 'Veja tokens malformados imediatamente.',
|
|
224
|
+
con: 'Não pode saber sua audiência ou emissor esperados.',
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
pro: 'Converta claims de timestamp Unix em datas legíveis.',
|
|
228
|
+
con: 'Não pode verificar uma assinatura sem o material de chave real.',
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
pro: 'Identifique valores ausentes de emissor, audiência, assunto ou tipo.',
|
|
232
|
+
con: 'Não pode provar que escopos e funções são seguros para sua aplicação.',
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
type: 'summary',
|
|
238
|
+
title: 'Fluxo de trabalho de melhores práticas',
|
|
239
|
+
items: [
|
|
240
|
+
'Decodifique o token para entender o que o cliente ou API realmente recebeu.',
|
|
241
|
+
'Verifique exp, nbf, iss, aud, sub e alg antes de buscar lógica de aplicação.',
|
|
242
|
+
'Verifique assinaturas e decisões de confiança apenas em sua camada de autenticação.',
|
|
243
|
+
'Evite compartilhar JWTs de produção sensíveis em tickets, logs ou capturas de tela.',
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
};
|