@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,248 @@
|
|
|
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-inspector-claims';
|
|
7
|
+
const title = 'Декодер JWT, Парсер и Инспектор Claims';
|
|
8
|
+
const description = 'Вставьте JSON Web Token, мгновенно декодируйте его заголовок и полезную нагрузку, проверяйте зарегистрированные claims, находите просроченные токены и копируйте чистый JSON для отладки процессов аутентификации.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Вставьте JWT',
|
|
13
|
+
text: 'Скопируйте токен из заголовка Authorization, cookie, записи журнала или провайдера идентификации и вставьте его в поле ввода.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Прочитайте декодированные заголовок и payload',
|
|
17
|
+
text: 'Инструмент разделяет токен на заголовок, payload и подпись, затем отображает JSON сегменты на отдельных панелях для быстрой проверки.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Проверьте важные claims',
|
|
21
|
+
text: 'Проверьте алгоритм, издателя, аудиторию, субъект, время выпуска, время начала действия и срок истечения без ручного преобразования Unix timestamp.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Скопируйте нужные данные',
|
|
25
|
+
text: 'Скопируйте один декодированный раздел или весь декодированный вывод, когда нужно поделиться очищенным снимком отладки с командой.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: 'Доказывает ли декодирование JWT, что токен действителен?',
|
|
32
|
+
answer: 'Нет. Декодирование лишь раскрывает заголовок и payload в кодировке base64url. Токен заслуживает доверия только после того, как подпись, издатель, аудитория, срок действия и связанные claims проверены приложением или провайдером идентификации.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: 'Можно ли использовать этот декодер JWT для access токенов и ID токенов?',
|
|
36
|
+
answer: 'Да. Декодер полезен для проверки OAuth access токенов, ID токенов OpenID Connect, сессионных токенов и токенов сервис-сервис, если они используют стандартный трёхчастный формат JWT.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'Почему панель подписи не проверяет токен?',
|
|
40
|
+
answer: 'Для проверки JWT требуется правильный секрет, открытый ключ или конфигурация JWKS. Этот инструмент намеренно сосредоточен на декодировании и проверке, чтобы разработчики могли видеть содержимое токена, не выдавая видимую строку подписи за доказательство подлинности.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: 'Что проверять в первую очередь при отладке JWT?',
|
|
44
|
+
answer: 'Начните с exp, nbf, iss, aud и alg. Большинство реальных производственных проблем связано с истёкшими токенами, рассинхронизацией часов, неверными значениями audience, неожиданными URL издателя или небезопасными предположениями об алгоритме.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: JwtDecoderUI = {
|
|
49
|
+
tokenLabel: 'JWT токен',
|
|
50
|
+
tokenPlaceholder: 'Вставьте JWT сюда: заголовок.payload.подпись',
|
|
51
|
+
sampleButton: 'Загрузить пример',
|
|
52
|
+
clearButton: 'Очистить',
|
|
53
|
+
statusWaiting: 'Вставьте токен для декодирования его JSON заголовка, payload и claims.',
|
|
54
|
+
statusValid: 'JWT успешно декодирован.',
|
|
55
|
+
statusInvalid: 'Это не похоже на действительный трёхчастный JWT.',
|
|
56
|
+
statusExpired: 'JWT декодирован, но claim exp уже истёк.',
|
|
57
|
+
statusUnsigned: 'JWT декодирован, но он не подписан или использует алгоритм none.',
|
|
58
|
+
headerTitle: 'Заголовок',
|
|
59
|
+
payloadTitle: 'Payload',
|
|
60
|
+
signatureTitle: 'Подпись',
|
|
61
|
+
claimsTitle: 'Зарегистрированные claims',
|
|
62
|
+
copyHeader: 'Копировать декодированный заголовок',
|
|
63
|
+
copyPayload: 'Копировать декодированный payload',
|
|
64
|
+
copySignature: 'Копировать подпись',
|
|
65
|
+
copyAll: 'Копировать всё',
|
|
66
|
+
copiedLabel: 'Скопировано',
|
|
67
|
+
invalidTokenTitle: 'Недействительный JWT',
|
|
68
|
+
invalidTokenBody: 'Проверьте, что токен содержит три сегмента base64url, разделённых точками.',
|
|
69
|
+
invalidSegmentError: 'Проверьте, что токен содержит три сегмента base64url, разделённых точками.',
|
|
70
|
+
invalidDecodeError: 'Заголовок или payload не удалось декодировать как действительный JSON.',
|
|
71
|
+
emptyJson: '{}',
|
|
72
|
+
signaturePresent: 'Сегмент подписи присутствует; проверьте его в вашем слое аутентификации с правильным ключом.',
|
|
73
|
+
signatureMissing: 'Сегмент подписи отсутствует',
|
|
74
|
+
algorithmLabel: 'Алгоритм',
|
|
75
|
+
typeLabel: 'Тип',
|
|
76
|
+
issuerLabel: 'Издатель',
|
|
77
|
+
subjectLabel: 'Субъект',
|
|
78
|
+
audienceLabel: 'Аудитория',
|
|
79
|
+
issuedAtLabel: 'Выпущен',
|
|
80
|
+
notBeforeLabel: 'Действует с',
|
|
81
|
+
expiresAtLabel: 'Истекает',
|
|
82
|
+
claimMissing: 'Отсутствует',
|
|
83
|
+
privacyNote: 'Декодирование выполняется в вашем браузере. Не вставляйте производственные секреты в инструмент, если это не разрешено вашей политикой безопасности.',
|
|
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
|
+
inLanguage: 'ru',
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export const content: ToolLocaleContent<JwtDecoderUI> = {
|
|
129
|
+
slug,
|
|
130
|
+
title,
|
|
131
|
+
description,
|
|
132
|
+
ui,
|
|
133
|
+
faqTitle: 'Часто задаваемые вопросы о декодере JWT',
|
|
134
|
+
faq,
|
|
135
|
+
bibliographyTitle: 'Спецификации JWT и ссылки по безопасности',
|
|
136
|
+
bibliography,
|
|
137
|
+
howTo,
|
|
138
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
139
|
+
seo: [
|
|
140
|
+
{
|
|
141
|
+
type: 'title',
|
|
142
|
+
text: 'Декодируйте JWT, не теряя контекст безопасности',
|
|
143
|
+
level: 2,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'paragraph',
|
|
147
|
+
html: 'JSON Web Token выглядит компактно, но часто содержит именно ту информацию, которая объясняет сбой аутентификации: алгоритм подписи, издатель, аудитория, субъект, время выпуска, время начала действия, срок истечения и специфичные для приложения claims авторизации. Этот <strong>декодер JWT, парсер и инспектор claims</strong> превращает три сегмента токена в читаемый JSON, чтобы вы могли быстрее отлаживать процессы аутентификации.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: 'diagnostic',
|
|
151
|
+
variant: 'warning',
|
|
152
|
+
title: 'Декодировано не значит проверено',
|
|
153
|
+
html: 'Любой может декодировать JWT из base64url. Доверие начинается только после того, как ваше приложение проверит подпись с правильным секретом, открытым ключом или JWKS, а затем проверит издателя, аудиторию, срок действия и специфичные для домена claims. Используйте этот инструмент для проверки данных, а не для принятия токена как подлинного.',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
type: 'title',
|
|
157
|
+
text: 'Что говорит каждый сегмент JWT',
|
|
158
|
+
level: 3,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
type: 'table',
|
|
162
|
+
headers: ['Сегмент', 'Типичное содержимое', 'Ценность для отладки'],
|
|
163
|
+
rows: [
|
|
164
|
+
['Заголовок', 'Алгоритм, тип токена и опциональный ID ключа', 'Показывает, ожидает ли токен HS256, RS256, ES256 или другую стратегию проверки.'],
|
|
165
|
+
['Payload', 'Зарегистрированные claims и прикладные claims', 'Раскрывает идентификатор, арендатора, разрешения, роли, срок действия и несоответствия аудитории.'],
|
|
166
|
+
['Подпись', 'Криптографические байты подписи в кодировке base64url', 'Подтверждает, что сегмент подписи существует, но должен быть проверен с правильным ключом отдельно.'],
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'title',
|
|
171
|
+
text: 'Claims, которые обычно объясняют сбои аутентификации',
|
|
172
|
+
level: 3,
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
type: 'list',
|
|
176
|
+
items: [
|
|
177
|
+
'<strong>exp:</strong> если токен истёк, логика обновления или настройки часов могут быть неверными.',
|
|
178
|
+
'<strong>nbf:</strong> если токен ещё не активен, часы сервера и провайдера идентификации могут быть рассинхронизированы.',
|
|
179
|
+
'<strong>iss:</strong> если URL издателя отличается от конфигурации, токен может быть из неверного арендатора или окружения.',
|
|
180
|
+
'<strong>aud:</strong> если аудитория не совпадает с идентификатором API, токен был выпущен для другого ресурса.',
|
|
181
|
+
'<strong>alg:</strong> если алгоритм неожиданный, ваш верификатор может отклонить токен или выявить опасную ошибку конфигурации.',
|
|
182
|
+
],
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: 'title',
|
|
186
|
+
text: 'Сценарии использования парсера JWT при разработке',
|
|
187
|
+
level: 3,
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
type: 'comparative',
|
|
191
|
+
columns: 3,
|
|
192
|
+
items: [
|
|
193
|
+
{
|
|
194
|
+
title: 'Отладка фронтенда',
|
|
195
|
+
description: 'Проверяйте ID токены и access токены, полученные после входа, чтобы подтвердить разрешения, роли и claims профиля.',
|
|
196
|
+
icon: 'mdi:monitor-dashboard',
|
|
197
|
+
points: ['Проверка claims профиля', 'Подтверждение разрешений и ролей', 'Сравнение окружений входа'],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
title: 'QA бэкенд API',
|
|
201
|
+
description: 'Сравнивайте ожидаемые значения издателя и аудитории с токеном, фактически отправленным в заголовке Authorization.',
|
|
202
|
+
icon: 'mdi:api',
|
|
203
|
+
highlight: true,
|
|
204
|
+
points: ['Проверка формы аудитории', 'Выявление несоответствий издателя', 'Проверка bearer токенов'],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
title: 'Настройка провайдера идентификации',
|
|
208
|
+
description: 'Проверяйте, соответствуют ли claims от Auth0, Azure AD, Cognito, Keycloak или пользовательского провайдера ожидаемой структуре вашего приложения.',
|
|
209
|
+
icon: 'mdi:account-key',
|
|
210
|
+
points: ['Проверка данных арендатора', 'Проверка пользовательских claims', 'Сравнение сопоставлений провайдера'],
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
type: 'title',
|
|
216
|
+
text: 'Частые ошибки JWT, которые делает очевидными этот инспектор',
|
|
217
|
+
level: 3,
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'proscons',
|
|
221
|
+
title: 'Быстрые проверки против решений о доверии',
|
|
222
|
+
items: [
|
|
223
|
+
{
|
|
224
|
+
pro: 'Сразу видите некорректные токены.',
|
|
225
|
+
con: 'Он не знает вашу ожидаемую аудиторию или издателя.',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
pro: 'Преобразует claims с Unix timestamp в читаемые даты.',
|
|
229
|
+
con: 'Он не может проверить подпись без реального ключевого материала.',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
pro: 'Выявляет отсутствующие значения издателя, аудитории, субъекта или типа.',
|
|
233
|
+
con: 'Он не может доказать, что разрешения и роли безопасны для вашего приложения.',
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
type: 'summary',
|
|
239
|
+
title: 'Рекомендуемый рабочий процесс',
|
|
240
|
+
items: [
|
|
241
|
+
'Декодируйте токен, чтобы понять, что клиент или API фактически получили.',
|
|
242
|
+
'Проверьте exp, nbf, iss, aud, sub и alg прежде чем углубляться в логику приложения.',
|
|
243
|
+
'Проверяйте подписи и решения о доверии только в вашем слое аутентификации.',
|
|
244
|
+
'Избегайте передачи чувствительных производственных JWT в тикетах, логах или скриншотах.',
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
};
|
|
@@ -0,0 +1,248 @@
|
|
|
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-dekoder-tolk-och-anspraksinspektor';
|
|
7
|
+
const title = 'JWT Avkodare, Tolk och Anspraksinspektor';
|
|
8
|
+
const description = 'Klistra in en JSON Web Token, avkoda dess header och payload direkt, inspektera registrerade claims, upptack utgångna tokens och kopiera ren JSON for att felsoka autentiseringsfloden.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Klistra in JWTn',
|
|
13
|
+
text: 'Kopiera en token från en Authorization header, cookie, loggpost eller identitetsleverantor och klistra in den i inmatningsfaltet.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Las den avkodade headern och payloaden',
|
|
17
|
+
text: 'Verktyget delar upp token i header, payload och signatur och visar sedan JSON segmenten i separata paneler for snabb inspektion.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Kontrollera viktiga claims',
|
|
21
|
+
text: 'Granska algoritm, utfordare, publik, amne, utfardandetid, giltigt från tid och utgångstid utan att manuellt konvertera Unix tidsstamplar.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Kopiera den data du behover',
|
|
25
|
+
text: 'Kopiera ett avkodat avsnitt eller hela den avkodade utmatningen nar du behover dela en sanerad felsokningsogonblicksbild med ditt team.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: 'Bevisar avkodning av en JWT att tokenen ar giltig?',
|
|
32
|
+
answer: 'Nej. Avkodning visar bara den base64url kodade headern och payloaden. En token ar trovordig forst nar signaturen, utfordaren, publiken, utgångstiden och relaterade claims har validerats av applikationen eller identitetsleverantoren.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: 'Kan jag anvanda denna JWT avkodare for access tokens och ID tokens?',
|
|
36
|
+
answer: 'Ja. Avkodaren ar anvandbar for att inspektera OAuth access tokens, OpenID Connect ID tokens, sessionstokens och tjanst till tjanst tokens, sa lange de anvander det standardiserade tredelade JWT formatet.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'Varfor verifierar inte signaturpanelen tokenet?',
|
|
40
|
+
answer: 'JWT verifiering kraver ratt hemlighet, publik nyckel eller JWKS konfiguration. Detta verktyg fokuserar avsiktligt på avkodning och inspektion så att utvecklare kan se tokeninnehållet utan att låtsas att en synlig signaturstrang ar bevis på giltighet.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: 'Vad bor jag kontrollera forst nar jag felsoker en JWT?',
|
|
44
|
+
answer: 'Borja med exp, nbf, iss, aud och alg. De flesta verkliga produktionsproblem kommer från utgångna tokens, klockskevning, felaktiga publikvarden, ovantade utfordar URLer eller osakra algoritmantaganden.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: JwtDecoderUI = {
|
|
49
|
+
tokenLabel: 'JWT token',
|
|
50
|
+
tokenPlaceholder: 'Klistra in en JWT har: header.payload.signatur',
|
|
51
|
+
sampleButton: 'Ladda exempel',
|
|
52
|
+
clearButton: 'Rensa',
|
|
53
|
+
statusWaiting: 'Klistra in en token for att avkoda dess JSON header, payload och claims.',
|
|
54
|
+
statusValid: 'JWT avkodad.',
|
|
55
|
+
statusInvalid: 'Detta ser inte ut som en giltig tredelad JWT.',
|
|
56
|
+
statusExpired: 'JWT avkodad, men exp claim har redan gått ut.',
|
|
57
|
+
statusUnsigned: 'JWT avkodad, men den ar osignerad eller anvander algoritmen none.',
|
|
58
|
+
headerTitle: 'Header',
|
|
59
|
+
payloadTitle: 'Payload',
|
|
60
|
+
signatureTitle: 'Signatur',
|
|
61
|
+
claimsTitle: 'Registrerade claims',
|
|
62
|
+
copyHeader: 'Kopiera avkodad header',
|
|
63
|
+
copyPayload: 'Kopiera avkodad payload',
|
|
64
|
+
copySignature: 'Kopiera signatur',
|
|
65
|
+
copyAll: 'Kopiera allt',
|
|
66
|
+
copiedLabel: 'Kopierad',
|
|
67
|
+
invalidTokenTitle: 'Ogiltig JWT',
|
|
68
|
+
invalidTokenBody: 'Kontrollera att token har tre punktseparerade base64url segment.',
|
|
69
|
+
invalidSegmentError: 'Kontrollera att token har tre punktseparerade base64url segment.',
|
|
70
|
+
invalidDecodeError: 'Header eller payload kunde inte avkodas som giltig JSON.',
|
|
71
|
+
emptyJson: '{}',
|
|
72
|
+
signaturePresent: 'Signatursegment finns; verifiera det i ditt autentiseringslager med ratt nyckel.',
|
|
73
|
+
signatureMissing: 'Inget signatursegment',
|
|
74
|
+
algorithmLabel: 'Algoritm',
|
|
75
|
+
typeLabel: 'Typ',
|
|
76
|
+
issuerLabel: 'Utfordare',
|
|
77
|
+
subjectLabel: 'Amne',
|
|
78
|
+
audienceLabel: 'Publik',
|
|
79
|
+
issuedAtLabel: 'Utfordad',
|
|
80
|
+
notBeforeLabel: 'Giltig från',
|
|
81
|
+
expiresAtLabel: 'Galler till',
|
|
82
|
+
claimMissing: 'Saknas',
|
|
83
|
+
privacyNote: 'Avkodning sker i din webblasarsession. Klistra inte in produktionshemligheter i något verktyg om inte din sakerhetspolicy tillåter det.',
|
|
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
|
+
inLanguage: 'sv',
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export const content: ToolLocaleContent<JwtDecoderUI> = {
|
|
129
|
+
slug,
|
|
130
|
+
title,
|
|
131
|
+
description,
|
|
132
|
+
ui,
|
|
133
|
+
faqTitle: 'Vanliga frågor om JWT avkodaren',
|
|
134
|
+
faq,
|
|
135
|
+
bibliographyTitle: 'JWT specifikationer och sakerhetsreferenser',
|
|
136
|
+
bibliography,
|
|
137
|
+
howTo,
|
|
138
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
139
|
+
seo: [
|
|
140
|
+
{
|
|
141
|
+
type: 'title',
|
|
142
|
+
text: 'Avkoda JWT utan att forlora sakerhetskontexten',
|
|
143
|
+
level: 2,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'paragraph',
|
|
147
|
+
html: 'En JSON Web Token ser kompakt ut, men innehåller ofta just den detalj som forklarar ett autentiseringsfel: signaturalgoritmen, utfordare, publik, amne, utfardandetid, giltigt från tid, utgångstid och applikationsspecifika auktoriseringsclaims. Denna <strong>JWT avkodare, tolk och anspraksinspektor</strong> omvandlar de tre tokensegmenten till lasbar JSON så att du kan felsoka autentiseringsfloden snabbare.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: 'diagnostic',
|
|
151
|
+
variant: 'warning',
|
|
152
|
+
title: 'Avkodad betyder inte trovordig',
|
|
153
|
+
html: 'Vem som helst kan base64url avkoda en JWT. Fortroende borjar forst nar din applikation har verifierat signaturen med ratt hemlighet, publik nyckel eller JWKS och sedan validerat utfordare, publik, utgångstid och eventuella domanspecifika claims. Anvand detta verktyg for att inspektera data, inte for att acceptera en token som autentisk.',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
type: 'title',
|
|
157
|
+
text: 'Vad varje JWT segment berattar',
|
|
158
|
+
level: 3,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
type: 'table',
|
|
162
|
+
headers: ['Segment', 'Typiskt innehåll', 'Felsokningsvarde'],
|
|
163
|
+
rows: [
|
|
164
|
+
['Header', 'Algoritm, tokentyp och valfritt nyckel ID', 'Visar om tokenen forvantar HS256, RS256, ES256 eller en annan verifieringsstrategi.'],
|
|
165
|
+
['Payload', 'Registrerade claims och applikationsclaims', 'Avslojar identitet, klientorganisation, scopar, roller, utgångstid och publikavvikelser.'],
|
|
166
|
+
['Signatur', 'Kryptografiska signaturbytes kodade som base64url', 'Bekraftar att ett signatursegment finns, men måste verifieras med ratt nyckel på annat håll.'],
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'title',
|
|
171
|
+
text: 'Claims som oftast forklarar trasig autentisering',
|
|
172
|
+
level: 3,
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
type: 'list',
|
|
176
|
+
items: [
|
|
177
|
+
'<strong>exp:</strong> om tokenen har gått ut kan uppdateringslogiken eller klockinstallningarna vara felaktiga.',
|
|
178
|
+
'<strong>nbf:</strong> om tokenen annu inte ar aktiv kan server och identitetsleverantors klockor vara osynkroniserade.',
|
|
179
|
+
'<strong>iss:</strong> om utfordar URLen skiljer sig från konfigurationen kan tokenen komma från fel klientorganisation eller miljo.',
|
|
180
|
+
'<strong>aud:</strong> om publiken inte matchar API identifikatorn skapades tokenen for en annan resurs.',
|
|
181
|
+
'<strong>alg:</strong> om algoritmen ar ovantad kan din verifierare avvisa tokenen eller blottlagga ett farligt konfigurationsmisstag.',
|
|
182
|
+
],
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: 'title',
|
|
186
|
+
text: 'Anvandningsfall for en JWT tolk under utveckling',
|
|
187
|
+
level: 3,
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
type: 'comparative',
|
|
191
|
+
columns: 3,
|
|
192
|
+
items: [
|
|
193
|
+
{
|
|
194
|
+
title: 'Frontend felsokning',
|
|
195
|
+
description: 'Inspektera ID tokens och access tokens som tas emot efter inloggning for att bekrafta scopar, roller och profilclaims.',
|
|
196
|
+
icon: 'mdi:monitor-dashboard',
|
|
197
|
+
points: ['Kontrollera profilclaims', 'Bekrafta scopar och roller', 'Jamfor inloggningsmiljoer'],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
title: 'Backend API QA',
|
|
201
|
+
description: 'Jamfor forvantade utfordar och publikvarden med den token som faktiskt skickas i en Authorization header.',
|
|
202
|
+
icon: 'mdi:api',
|
|
203
|
+
highlight: true,
|
|
204
|
+
points: ['Validera publikens utformning', 'Upptack utfordaravvikelser', 'Inspektera bearer tokens'],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
title: 'Identitetsleverantor installation',
|
|
208
|
+
description: 'Kontrollera om claims från Auth0, Azure AD, Cognito, Keycloak eller en anpassad leverantor ar utformade som din app forvantar sig.',
|
|
209
|
+
icon: 'mdi:account-key',
|
|
210
|
+
points: ['Granska klientorganisationsdata', 'Kontrollera anpassade claims', 'Jamfor leverantorsmappningar'],
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
type: 'title',
|
|
216
|
+
text: 'Vanliga JWT misstag som denna inspektor gor uppenbara',
|
|
217
|
+
level: 3,
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'proscons',
|
|
221
|
+
title: 'Snabba kontroller mot fortroendebeslut',
|
|
222
|
+
items: [
|
|
223
|
+
{
|
|
224
|
+
pro: 'Se felaktiga tokens omedelbart.',
|
|
225
|
+
con: 'Den kan inte kanna till din forvantade publik eller utfordare.',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
pro: 'Konvertera Unix tidsstampel claims till lasbara datum.',
|
|
229
|
+
con: 'Den kan inte verifiera en signatur utan det verkliga nyckelmaterialet.',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
pro: 'Upptack saknade utfordar, publik, amnes eller typvarden.',
|
|
233
|
+
con: 'Den kan inte bevisa att scopar och roller ar sakra for din applikation.',
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
type: 'summary',
|
|
239
|
+
title: 'Rekommenderat arbetsflode',
|
|
240
|
+
items: [
|
|
241
|
+
'Avkoda tokenen for att forstå vad klienten eller APIet faktiskt tog emot.',
|
|
242
|
+
'Kontrollera exp, nbf, iss, aud, sub och alg innan du går vidare med applikationslogiken.',
|
|
243
|
+
'Verifiera signaturer och fortroendebeslut endast i ditt autentiseringslager.',
|
|
244
|
+
'Undvik att dela kansliga produktions JWTer i arenden, loggar eller skarmdumpar.',
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
};
|