@jjlmoya/utils-developer 1.15.0 → 1.17.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 -3
- package/src/tests/pagespeed_best_practices.test.ts +198 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/aspectRatio/component.astro +3 -1
- package/src/tool/colorConverter/component.astro +3 -3
- 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/llmCostCalculator/component.astro +1 -2
- package/src/tool/mobileMockupGenerator/component.astro +4 -5
- package/src/tool/placeholderGenerator/component.astro +2 -2
- package/src/tool/readabilityCalculator/component.astro +4 -4
- package/src/tool/serpPixelSimulator/bibliography.astro +14 -0
- package/src/tool/serpPixelSimulator/bibliography.ts +16 -0
- package/src/tool/serpPixelSimulator/component.astro +84 -0
- package/src/tool/serpPixelSimulator/controller.ts +323 -0
- package/src/tool/serpPixelSimulator/entry.ts +30 -0
- package/src/tool/serpPixelSimulator/i18n/de.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/en.ts +213 -0
- package/src/tool/serpPixelSimulator/i18n/es.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/id.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/it.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/ja.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/ko.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/nl.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/pl.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/pt.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/sv.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/tr.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/zh.ts +214 -0
- package/src/tool/serpPixelSimulator/index.ts +8 -0
- package/src/tool/serpPixelSimulator/logic.ts +18 -0
- package/src/tool/serpPixelSimulator/seo.astro +15 -0
- package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +335 -0
- package/src/tool/serpPixelSimulator/ui.ts +33 -0
- package/src/tools.ts +3 -2
|
@@ -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 = 'jwt-decoder-parser-en-claims-inspecteur';
|
|
7
|
+
const title = 'JWT Decoder, Parser en Claims Inspecteur';
|
|
8
|
+
const description = 'Plak een JSON Web Token, decodeer de header en payload direct, inspecteer registered claims, herken verlopen tokens en kopieer schone JSON voor het debuggen van authenticatieprocessen.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Plak de JWT',
|
|
13
|
+
text: 'Kopieer een token uit een Authorization-header, cookie, logboekvermelding of identiteitsprovider en plak het in het invoerveld.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Lees de gedecodeerde header en payload',
|
|
17
|
+
text: 'De tool splitst het token in header, payload en handtekening en toont de JSON-segmenten in aparte panels voor snelle inspectie.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Controleer belangrijke claims',
|
|
21
|
+
text: 'Bekijk algoritme, uitgever, publiek, onderwerp, uitgegeven-op tijd, geldig-vanaf tijd en vervaltijd zonder handmatig Unix-timestamps om te rekenen.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Kopieer de benodigde gegevens',
|
|
25
|
+
text: 'Kopieer een gedecodeerd gedeelte of de volledige gedecodeerde uitvoer wanneer je een opgeschoonde debugmomentopname met je team wilt delen.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: 'Bewijst het decoderen van een JWT dat het token geldig is?',
|
|
32
|
+
answer: 'Nee. Decoderen onthult alleen de base64url-gecodeerde header en payload. Een token is pas betrouwbaar nadat de handtekening, uitgever, publiek, vervaldatum en gerelateerde claims zijn gevalideerd door de applicatie of identiteitsprovider.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: 'Kan ik deze JWT-decoder gebruiken voor access tokens en ID tokens?',
|
|
36
|
+
answer: 'Ja. De decoder is handig voor het inspecteren van OAuth access tokens, OpenID Connect ID tokens, sessietokens en service-to-service tokens, zolang ze het standaard driedelige JWT-formaat gebruiken.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'Waarom verifieert het handtekeningpaneel het token niet?',
|
|
40
|
+
answer: 'JWT-verificatie vereist de juiste geheime sleutel, publieke sleutel of JWKS-configuratie. Deze tool richt zich bewust op decoderen en inspecteren, zodat ontwikkelaars tokeninhoud kunnen zien zonder te doen alsof een zichtbare handtekeningstring bewijs van geldigheid is.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: 'Wat moet ik eerst controleren bij het debuggen van een JWT?',
|
|
44
|
+
answer: 'Begin met exp, nbf, iss, aud en alg. De meeste echte productieproblemen komen door verlopen tokens, klokafwijking, verkeerde publiek-waarden, onverwachte uitgever-URL\'s of onveilige algoritme-aannames.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: JwtDecoderUI = {
|
|
49
|
+
tokenLabel: 'JWT-token',
|
|
50
|
+
tokenPlaceholder: 'Plak hier een JWT: header.payload.handtekening',
|
|
51
|
+
sampleButton: 'Voorbeeld laden',
|
|
52
|
+
clearButton: 'Wissen',
|
|
53
|
+
statusWaiting: 'Plak een token om de JSON-header, payload en claims te decoderen.',
|
|
54
|
+
statusValid: 'JWT succesvol gedecodeerd.',
|
|
55
|
+
statusInvalid: 'Dit lijkt geen geldige driedelige JWT te zijn.',
|
|
56
|
+
statusExpired: 'JWT gedecodeerd, maar de exp-claim is al verlopen.',
|
|
57
|
+
statusUnsigned: 'JWT gedecodeerd, maar het is niet ondertekend of gebruikt algoritme none.',
|
|
58
|
+
headerTitle: 'Header',
|
|
59
|
+
payloadTitle: 'Payload',
|
|
60
|
+
signatureTitle: 'Handtekening',
|
|
61
|
+
claimsTitle: 'Geregistreerde claims',
|
|
62
|
+
copyHeader: 'Gedecodeerde header kopieren',
|
|
63
|
+
copyPayload: 'Gedecodeerde payload kopieren',
|
|
64
|
+
copySignature: 'Handtekening kopieren',
|
|
65
|
+
copyAll: 'Alles kopieren',
|
|
66
|
+
copiedLabel: 'Gekopieerd',
|
|
67
|
+
invalidTokenTitle: 'Ongeldige JWT',
|
|
68
|
+
invalidTokenBody: 'Controleer of het token drie door punten gescheiden base64url-segmenten heeft.',
|
|
69
|
+
invalidSegmentError: 'Controleer of het token drie door punten gescheiden base64url-segmenten heeft.',
|
|
70
|
+
invalidDecodeError: 'De header of payload kon niet worden gedecodeerd als geldige JSON.',
|
|
71
|
+
emptyJson: '{}',
|
|
72
|
+
signaturePresent: 'Handtekeningsegment is aanwezig; verifieer het in uw auth-laag met de juiste sleutel.',
|
|
73
|
+
signatureMissing: 'Geen handtekeningsegment',
|
|
74
|
+
algorithmLabel: 'Algoritme',
|
|
75
|
+
typeLabel: 'Type',
|
|
76
|
+
issuerLabel: 'Uitgever',
|
|
77
|
+
subjectLabel: 'Onderwerp',
|
|
78
|
+
audienceLabel: 'Publiek',
|
|
79
|
+
issuedAtLabel: 'Uitgegeven op',
|
|
80
|
+
notBeforeLabel: 'Geldig vanaf',
|
|
81
|
+
expiresAtLabel: 'Verloopt op',
|
|
82
|
+
claimMissing: 'Niet aanwezig',
|
|
83
|
+
privacyNote: 'Decoderen vindt plaats in uw browsersessie. Plak geen productiesleutels in een tool tenzij uw beveiligingsbeleid dit toestaat.',
|
|
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: 'JWT decoder FAQ',
|
|
133
|
+
faq,
|
|
134
|
+
bibliographyTitle: 'JWT specificaties en beveiligingsreferenties',
|
|
135
|
+
bibliography,
|
|
136
|
+
howTo,
|
|
137
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
138
|
+
seo: [
|
|
139
|
+
{
|
|
140
|
+
type: 'title',
|
|
141
|
+
text: 'Decodeer JWTs zonder de beveiligingscontext te verliezen',
|
|
142
|
+
level: 2,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'paragraph',
|
|
146
|
+
html: 'Een JSON Web Token ziet er compact uit, maar bevat vaak precies het detail dat een authenticatiefout verklaart: het ondertekeningsalgoritme, uitgever, publiek, onderwerp, uitgegeven-op tijd, geldig-vanaf tijd, vervaldatum en toepassingsspecifieke autorisatieclaims. Deze <strong>JWT-decoder, parser en claims-inspecteur</strong> zet de drie tokensegmenten om in leesbare JSON zodat u auth-stromen sneller kunt debuggen.',
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'diagnostic',
|
|
150
|
+
variant: 'warning',
|
|
151
|
+
title: 'Gedecodeerd betekent niet vertrouwd',
|
|
152
|
+
html: 'Iedereen kan een JWT base64url-decoderen. Vertrouwen begint pas nadat uw applicatie de handtekening verifieert met de juiste geheime sleutel, publieke sleutel of JWKS, en vervolgens uitgever, publiek, vervaldatum en domeinspecifieke claims valideert. Gebruik deze tool om gegevens te inspecteren, niet om een token als authentiek te accepteren.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'title',
|
|
156
|
+
text: 'Wat elk JWT segment u vertelt',
|
|
157
|
+
level: 3,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'table',
|
|
161
|
+
headers: ['Segment', 'Typische inhoud', 'Debugwaarde'],
|
|
162
|
+
rows: [
|
|
163
|
+
['Header', 'Algoritme, tokentype en optionele sleutel-ID', 'Toont of het token HS256, RS256, ES256 of een andere verificatiestrategie verwacht.'],
|
|
164
|
+
['Payload', 'Geregistreerde claims en applicatieclaims', 'Onthult identiteit, tenant, scopes, rollen, vervaldatum en publiek-mismatches.'],
|
|
165
|
+
['Handtekening', 'Cryptografische handtekeningbytes gecodeerd als base64url', 'Bevestigt dat een handtekeningsegment bestaat, maar moet elders met de juiste sleutel worden geverifieerd.'],
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
type: 'title',
|
|
170
|
+
text: 'Claims die meestal falende authenticatie verklaren',
|
|
171
|
+
level: 3,
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
type: 'list',
|
|
175
|
+
items: [
|
|
176
|
+
'<strong>exp:</strong> als het token is verlopen, kunnen de vernieuwingslogica of klokinstellingen onjuist zijn.',
|
|
177
|
+
'<strong>nbf:</strong> als het token nog niet actief is, kunnen server- en identiteitsproviderklokken uit sync zijn.',
|
|
178
|
+
'<strong>iss:</strong> als de uitgever-URL afwijkt van de configuratie, kan het token van de verkeerde tenant of omgeving komen.',
|
|
179
|
+
'<strong>aud:</strong> als het publiek niet overeenkomt met de API-identificatie, is het token voor een andere bron aangemaakt.',
|
|
180
|
+
'<strong>alg:</strong> als het algoritme onverwacht is, kan uw verificateur het token weigeren of een gevaarlijke configuratiefout blootleggen.',
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
type: 'title',
|
|
185
|
+
text: 'Toepassingen van een JWT parser tijdens ontwikkeling',
|
|
186
|
+
level: 3,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'comparative',
|
|
190
|
+
columns: 3,
|
|
191
|
+
items: [
|
|
192
|
+
{
|
|
193
|
+
title: 'Frontend debugging',
|
|
194
|
+
description: 'Inspecteer ID tokens en access tokens ontvangen na inloggen om scopes, rollen en profielclaims te bevestigen.',
|
|
195
|
+
icon: 'mdi:monitor-dashboard',
|
|
196
|
+
points: ['Controleer profielclaims', 'Bevestig scopes en rollen', 'Vergelijk inlogomgevingen'],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
title: 'Backend API QA',
|
|
200
|
+
description: 'Vergelijk verwachte uitgevers- en publiek-waarden met het token dat daadwerkelijk in een Authorization-header is verzonden.',
|
|
201
|
+
icon: 'mdi:api',
|
|
202
|
+
highlight: true,
|
|
203
|
+
points: ['Valideer publiek-vorm', 'Herken uitgever-mismatches', 'Inspecteer bearer tokens'],
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
title: 'Identiteitsprovider configureren',
|
|
207
|
+
description: 'Controleer of claims van Auth0, Azure AD, Cognito, Keycloak of een aangepaste provider zijn vormgegeven zoals uw app verwacht.',
|
|
208
|
+
icon: 'mdi:account-key',
|
|
209
|
+
points: ['Bekijk tenantgegevens', 'Controleer aangepaste claims', 'Vergelijk providerkoppelingen'],
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
type: 'title',
|
|
215
|
+
text: 'Veelvoorkomende JWT fouten die deze inspecteur zichtbaar maakt',
|
|
216
|
+
level: 3,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
type: 'proscons',
|
|
220
|
+
title: 'Snelle controles versus vertrouwensbeslissingen',
|
|
221
|
+
items: [
|
|
222
|
+
{
|
|
223
|
+
pro: 'Zie misvormde tokens onmiddellijk.',
|
|
224
|
+
con: 'Kan uw verwachte publiek of uitgever niet kennen.',
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
pro: 'Converteer Unix-timestamp-claims naar leesbare datums.',
|
|
228
|
+
con: 'Kan geen handtekening verifieren zonder het echte sleutelmateriaal.',
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
pro: 'Herken ontbrekende uitgever-, publiek-, onderwerp- of typewaarden.',
|
|
232
|
+
con: 'Kan niet bewijzen dat scopes en rollen veilig zijn voor uw applicatie.',
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
type: 'summary',
|
|
238
|
+
title: 'Best practice werkwijze',
|
|
239
|
+
items: [
|
|
240
|
+
'Decodeer het token om te begrijpen wat de client of API daadwerkelijk heeft ontvangen.',
|
|
241
|
+
'Controleer exp, nbf, iss, aud, sub en alg voordat u applicatielogica naloopt.',
|
|
242
|
+
'Verifieer handtekeningen en vertrouwensbeslissingen alleen in uw auth-laag.',
|
|
243
|
+
'Vermijd het delen van gevoelige productie-JWTs in tickets, logs of schermafbeeldingen.',
|
|
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 = '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
|
+
};
|