Skip to content

Commit b283f01

Browse files
Merge pull request #931 from jsonwebtoken/feature/seo-enhancements-llms-txt
Add FAQPage schema, Organization schema, and llms.txt
2 parents 36b58a5 + 7719666 commit b283f01

12 files changed

Lines changed: 195 additions & 7 deletions

File tree

public/llms.txt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# jwt.io
2+
3+
> JWT.IO allows you to decode, verify, and generate JSON Web Tokens.
4+
5+
## About
6+
7+
jwt.io is the go-to resource for JSON Web Tokens (JWTs). It provides:
8+
- An interactive JWT debugger to decode and verify tokens
9+
- A comprehensive library directory for JWT implementations
10+
- Educational content explaining JWT concepts
11+
12+
Maintained by Auth0.
13+
14+
## Quick Links
15+
16+
- Debugger: https://jwt.io
17+
- Libraries: https://jwt.io/libraries
18+
- Introduction: https://jwt.io/introduction
19+
20+
## JWT Overview
21+
22+
A JSON Web Token consists of three Base64Url-encoded parts:
23+
1. Header - algorithm and token type
24+
2. Payload - claims (registered, public, private)
25+
3. Signature - ensures token integrity
26+
27+
Format: xxxxx.yyyyy.zzzzz
28+
29+
## For AI Agents
30+
31+
Claude Code users can install JWT skills for token operations:
32+
- `/jwt-decode` - Decode and inspect JWTs
33+
- `/jwt-encode` - Create and sign JWTs
34+
- `/jwt-validate` - Verify JWT signatures and claims
35+
36+
Install: `npx skills add jsonwebtoken/jwt-skills`
37+
Repository: https://github.com/jsonwebtoken/jwt-skills
38+
39+
## Resources
40+
41+
- RFC 7519: https://datatracker.ietf.org/doc/html/rfc7519
42+
- Source: https://github.com/jsonwebtoken/jsonwebtoken.github.io

src/features/introduction/components/introduction-page/introduction-page.component.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import React from "react";
22
import { StructuredData } from "@/features/seo/components/structured-data.component";
3-
import { generateArticleStructuredData } from "@/features/seo/services/structured-data.service";
3+
import {
4+
generateArticleStructuredData,
5+
generateFaqStructuredData,
6+
} from "@/features/seo/services/structured-data.service";
47
import { Auth0CtaComponent } from "@/features/common/components/auth0-cta/auth0-cta.component";
58
import { getIntroductionDictionary } from "@/features/localization/services/language-dictionary.service";
69
import { IntroductionArticleComponent } from "@/features/introduction/components/introduction-article/introduction-article.component";
710
import { getAuth0Dictionary } from "@/features/localization/services/ui-language-dictionary.service";
11+
import { AUTH0_ORGANIZATION } from "@/features/seo/constants/organizations.constants";
812

913
interface IntroductionPageComponentProps {
1014
languageCode: string;
@@ -115,6 +119,8 @@ export const IntroductionPageComponent: React.FC<
115119
datePublished: introductionDictionary.metadata.datePublished,
116120
dateModified: introductionDictionary.metadata.dateModified,
117121
}),
122+
AUTH0_ORGANIZATION,
123+
generateFaqStructuredData(introductionDictionary.faq),
118124
]}
119125
/>
120126
<IntroductionArticleComponent

src/features/localization/dictionaries/introduction/en.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,43 @@ export const enIntroductionDictionary: IntroductionDictionaryModel = {
7676
},
7777
],
7878
},
79+
faq: {
80+
items: [
81+
{
82+
question: "What is JSON Web Token?",
83+
answer:
84+
"JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA.",
85+
},
86+
{
87+
question: "When should you use JSON Web Tokens?",
88+
answer:
89+
"JWTs are useful for Authorization (allowing users to access routes, services, and resources after login using Single Sign-On) and Information Exchange (securely transmitting information between parties with verified signatures that ensure the content hasn't been tampered with).",
90+
},
91+
{
92+
question: "What is the JSON Web Token structure?",
93+
answer:
94+
"A JWT consists of three parts separated by dots: Header (contains the token type and signing algorithm), Payload (contains the claims - statements about the user and additional data), and Signature (ensures the token hasn't been altered). Each part is Base64Url encoded, resulting in the format: xxxxx.yyyyy.zzzzz",
95+
},
96+
{
97+
question: "How do JSON Web Tokens work?",
98+
answer:
99+
"When a user logs in, they receive a JWT. For subsequent requests, the token is sent in the Authorization header using the Bearer schema. The server verifies the token's signature and grants access to protected resources. This stateless mechanism allows the token to be used across different domains.",
100+
},
101+
{
102+
question: "Why should we use JSON Web Tokens?",
103+
answer:
104+
"JWTs are more compact than SAML tokens (XML-based), making them ideal for HTML and HTTP environments. JSON is simpler to parse than XML and maps directly to objects in most programming languages. JWTs support asymmetric signing and work seamlessly across different platforms and devices.",
105+
},
106+
{
107+
question: "What is the difference between validating and verifying a JWT?",
108+
answer:
109+
"Validation checks the token's structure, format, and claims (like expiration time and required fields). Verification confirms the cryptographic signature to ensure the token was issued by a trusted party and hasn't been tampered with. Both steps are essential for secure JWT processing.",
110+
},
111+
{
112+
question: "What is the difference between decoding and encoding a JWT?",
113+
answer:
114+
"Encoding is the process of creating a JWT: converting the header and payload to JSON, Base64Url encoding them, and generating the signature. Decoding reverses this process: splitting the token, Base64Url decoding each part, and parsing the JSON. Decoding alone doesn't verify the signature.",
115+
},
116+
],
117+
},
79118
};

src/features/localization/dictionaries/introduction/ja.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,44 @@ export const jaIntroductionDictionary: IntroductionDictionaryModel = {
7777
},
7878
],
7979
},
80+
faq: {
81+
items: [
82+
{
83+
question: "JSON Web Tokenとは?",
84+
answer:
85+
"JSON Web Token(JWT)は、当事者間で情報をJSONオブジェクトとして安全に伝送するためのコンパクトで自己完結型の方法を定義するオープンスタンダード(RFC 7519)です。この情報は、秘密鍵(HMACアルゴリズム)またはRSAやECDSAを使用した公開鍵/秘密鍵のペアでデジタル署名されているため、検証および信頼できます。",
86+
},
87+
{
88+
question: "JSON Web Tokenはいつ使用すべきか?",
89+
answer:
90+
"JWTは、認可(シングルサインオンを使用してログイン後にルート、サービス、リソースへのアクセスを許可する)および情報交換(改ざんされていないことを確認できる検証済み署名で当事者間で安全に情報を伝送する)に役立ちます。",
91+
},
92+
{
93+
question: "JSON Web Tokenの構成は?",
94+
answer:
95+
"JWTはドットで区切られた3つの部分で構成されます:ヘッダー(トークンタイプと署名アルゴリズムを含む)、ペイロード(クレーム - ユーザーに関する記述と追加データを含む)、署名(トークンが改ざんされていないことを保証)。各部分はBase64Urlエンコードされ、xxxxx.yyyyy.zzzzzの形式になります。",
96+
},
97+
{
98+
question: "JSON Web Tokenの仕組みとは?",
99+
answer:
100+
"ユーザーがログインすると、JWTを受け取ります。その後のリクエストでは、Bearerスキーマを使用してAuthorizationヘッダーでトークンが送信されます。サーバーはトークンの署名を検証し、保護されたリソースへのアクセスを許可します。このステートレスな仕組みにより、トークンは異なるドメイン間で使用できます。",
101+
},
102+
{
103+
question: "JSON Web Tokenを使用すべき理由とは?",
104+
answer:
105+
"JWTはSAMLトークン(XMLベース)よりもコンパクトで、HTMLおよびHTTP環境に最適です。JSONはXMLよりも解析が簡単で、ほとんどのプログラミング言語でオブジェクトに直接マッピングされます。JWTは非対称署名をサポートし、さまざまなプラットフォームやデバイス間でシームレスに動作します。",
106+
},
107+
{
108+
question:
109+
"JWTのバリデーション(妥当性確認)とベリフィケーション(検証)の違いとは?",
110+
answer:
111+
"バリデーションは、トークンの構造、形式、クレーム(有効期限や必須フィールドなど)をチェックします。ベリフィケーションは、トークンが信頼できる発行者によって発行され、改ざんされていないことを確認するために暗号署名を確認します。両方のステップは、安全なJWT処理に不可欠です。",
112+
},
113+
{
114+
question: "JWTのデコーディングとエンコーディングの違いとは?",
115+
answer:
116+
"エンコーディングはJWTを作成するプロセスです:ヘッダーとペイロードをJSONに変換し、Base64Urlエンコードして署名を生成します。デコーディングはこのプロセスを逆にします:トークンを分割し、各部分をBase64Urlデコードして、JSONを解析します。デコーディングだけでは署名は検証されません。",
117+
},
118+
],
119+
},
80120
};
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { PageMetadataModel } from "@/features/common/models/page-metadata.model";
22
import { HeroMetadataModel } from "@/features/common/models/hero-metadata.model";
3+
import { FaqMetadataModel } from "@/features/seo/models/faq-metadata.model";
34

45
export interface IntroductionDictionaryModel {
56
metadata: PageMetadataModel;
67
hero: HeroMetadataModel;
78
content: {
89
headings: {
9-
title: string,
10-
id: string
11-
}[]
12-
}
10+
title: string;
11+
id: string;
12+
}[];
13+
};
14+
faq: FaqMetadataModel;
1315
}

src/features/seo/components/structured-data.component.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,23 @@ import { ArticleStructuredDataModel } from "@/features/seo/models/article-struct
33
import { BreadcrumbStructuredDataModel } from "@/features/seo/models/breadcrumb-structured-data.model";
44
import { HowToStructuredDataModel } from "@/features/seo/models/how-to-structured-data.model";
55
import { WebsiteStructuredDataModel } from "@/features/seo/models/website-structured-data.model";
6+
import { OrganizationStructuredDataModel } from "@/features/seo/models/organization-structured-data.model";
7+
import { FaqStructuredDataModel } from "@/features/seo/models/faq-structured-data.model";
68

79
interface StructuredDataProps {
810
data:
911
| ArticleStructuredDataModel
1012
| BreadcrumbStructuredDataModel
1113
| HowToStructuredDataModel
14+
| OrganizationStructuredDataModel
15+
| FaqStructuredDataModel
1216
| Array<
1317
| ArticleStructuredDataModel
1418
| BreadcrumbStructuredDataModel
1519
| HowToStructuredDataModel
1620
| WebsiteStructuredDataModel
21+
| OrganizationStructuredDataModel
22+
| FaqStructuredDataModel
1723
>;
1824
}
1925

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { OrganizationStructuredDataModel } from "@/features/seo/models/organization-structured-data.model";
2+
3+
export const AUTH0_ORGANIZATION: OrganizationStructuredDataModel = {
4+
"@context": "https://schema.org",
5+
"@type": "Organization",
6+
name: "Auth0",
7+
legalName: "Auth0 Inc.",
8+
url: "https://auth0.com/",
9+
logo: "https://cdn.auth0.com/website/assets/pages/press/img/resources/auth0-logo-main-6001cece68.svg",
10+
foundingDate: "2013",
11+
sameAs: [
12+
"https://twitter.com/auth0",
13+
"https://www.facebook.com/getauth0/",
14+
"https://www.linkedin.com/company/auth0",
15+
],
16+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export interface FaqItemMetadataModel {
2+
question: string;
3+
answer: string;
4+
}
5+
6+
export interface FaqMetadataModel {
7+
items: FaqItemMetadataModel[];
8+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { FAQPage, WithContext } from "schema-dts";
2+
3+
export type FaqStructuredDataModel = WithContext<FAQPage>;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { Organization, WithContext } from "schema-dts";
2+
3+
export type OrganizationStructuredDataModel = WithContext<Organization>;

0 commit comments

Comments
 (0)