Skip to content

Commit 98542e9

Browse files
kixelatedclaude
andauthored
Replace guest access with programmatic public access config (#1233)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent b134663 commit 98542e9

12 files changed

Lines changed: 436 additions & 244 deletions

File tree

Cargo.lock

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo/relay/justfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ leaf1: auth-token
3333
auth-key:
3434
@if [ ! -f "dev.jwk" ]; then \
3535
rm -f *.jwt; \
36-
cargo run --bin moq-token-cli -- generate --out "dev.jwk" --guest anon --guest-subscribe demo; \
36+
cargo run --bin moq-token-cli -- generate --out "dev.jwk"; \
3737
fi
3838

3939
# Generate authentication tokens for local development.

demo/relay/root.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,8 @@ listen = "[::]:4443"
3030
# If you want to disable authentication, don't specify a key.
3131
key = "dev.jwk"
3232

33-
# Allow anonymous publishing and subscribing for anon/**
34-
public = "anon"
33+
# Allow anonymous subscribing for anon/** and demo/**
34+
# Allow anonymous publishing for anon/** only
35+
[auth.public]
36+
subscribe = ["anon", "demo"]
37+
publish = "anon"

js/token/src/cli.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,10 @@ program
2121
.option("--id <id>", "Key ID (randomly generated if not provided)")
2222
.option("--public <path>", "Path to save the public key (for asymmetric algorithms)")
2323
.option("--base64", "Output as base64url instead of JSON", false)
24-
.option("--guest-subscribe <path...>", "Path prefixes for unauthenticated subscribe access")
25-
.option("--guest-publish <path...>", "Path prefixes for unauthenticated publish access")
26-
.option("--guest <path...>", "Path prefixes for both unauthenticated subscribe and publish access")
2724
.action(async (options) => {
2825
try {
2926
const algorithm = options.algorithm as Algorithm;
30-
const key = await generate(algorithm, options.id, {
31-
...(options.guest?.length && { guest: options.guest }),
32-
...(options.guestSubscribe?.length && { guest_sub: options.guestSubscribe }),
33-
...(options.guestPublish?.length && { guest_pub: options.guestPublish }),
34-
});
27+
const key = await generate(algorithm, options.id);
3528

3629
const encodeKey = (k: object): string => {
3730
const json = JSON.stringify(k, null, 2);

js/token/src/generate.ts

Lines changed: 13 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,29 @@ function randomKid(): KeyId {
1717
* Generate a new key for the given algorithm.
1818
* A random key ID is assigned if none is provided.
1919
*/
20-
export async function generate(
21-
algorithm: Algorithm,
22-
kid?: string,
23-
options?: { guest?: string[]; guest_sub?: string[]; guest_pub?: string[] },
24-
): Promise<Key> {
20+
export async function generate(algorithm: Algorithm, kid?: string): Promise<Key> {
2521
const validKid: KeyId = kid?.trim() ? KeyIdSchema.parse(kid.trim()) : randomKid();
2622
switch (algorithm) {
2723
case "HS256":
28-
return generateHmacKey(algorithm, 32, validKid, options);
24+
return generateHmacKey(algorithm, 32, validKid);
2925
case "HS384":
30-
return generateHmacKey(algorithm, 48, validKid, options);
26+
return generateHmacKey(algorithm, 48, validKid);
3127
case "HS512":
32-
return generateHmacKey(algorithm, 64, validKid, options);
28+
return generateHmacKey(algorithm, 64, validKid);
3329
case "RS256":
3430
case "RS384":
3531
case "RS512":
36-
return generateRsaKey(algorithm, "RSASSA-PKCS1-v1_5", validKid, options);
32+
return generateRsaKey(algorithm, "RSASSA-PKCS1-v1_5", validKid);
3733
case "PS256":
3834
case "PS384":
3935
case "PS512":
40-
return generateRsaKey(algorithm, "RSA-PSS", validKid, options);
36+
return generateRsaKey(algorithm, "RSA-PSS", validKid);
4137
case "ES256":
42-
return generateEcKey(algorithm, "P-256", validKid, options);
38+
return generateEcKey(algorithm, "P-256", validKid);
4339
case "ES384":
44-
return generateEcKey(algorithm, "P-384", validKid, options);
40+
return generateEcKey(algorithm, "P-384", validKid);
4541
case "EdDSA":
46-
return generateEdDsaKey(algorithm, validKid, options);
42+
return generateEdDsaKey(algorithm, validKid);
4743
default:
4844
throw new Error(`Unsupported algorithm: ${algorithm}`);
4945
}
@@ -52,12 +48,7 @@ export async function generate(
5248
/**
5349
* Generate an HMAC symmetric key
5450
*/
55-
async function generateHmacKey(
56-
alg: Algorithm,
57-
byteLength: number,
58-
kid: KeyId,
59-
options?: { guest?: string[]; guest_sub?: string[]; guest_pub?: string[] },
60-
): Promise<Key> {
51+
async function generateHmacKey(alg: Algorithm, byteLength: number, kid: KeyId): Promise<Key> {
6152
const bytes = new Uint8Array(byteLength);
6253
crypto.getRandomValues(bytes);
6354

@@ -69,21 +60,13 @@ async function generateHmacKey(
6960
k,
7061
kid,
7162
key_ops: ["sign", "verify"],
72-
guest: options?.guest ?? [],
73-
guest_sub: options?.guest_sub ?? [],
74-
guest_pub: options?.guest_pub ?? [],
7563
};
7664
}
7765

7866
/**
7967
* Generate an RSA asymmetric key pair
8068
*/
81-
async function generateRsaKey(
82-
alg: Algorithm,
83-
name: "RSASSA-PKCS1-v1_5" | "RSA-PSS",
84-
kid: KeyId,
85-
options?: { guest?: string[]; guest_sub?: string[]; guest_pub?: string[] },
86-
): Promise<Key> {
69+
async function generateRsaKey(alg: Algorithm, name: "RSASSA-PKCS1-v1_5" | "RSA-PSS", kid: KeyId): Promise<Key> {
8770
const keyPair = await crypto.subtle.generateKey(
8871
{
8972
name,
@@ -121,21 +104,13 @@ async function generateRsaKey(
121104
qi: jwk.qi,
122105
kid,
123106
key_ops: ["sign", "verify"],
124-
guest: options?.guest ?? [],
125-
guest_sub: options?.guest_sub ?? [],
126-
guest_pub: options?.guest_pub ?? [],
127107
};
128108
}
129109

130110
/**
131111
* Generate an elliptic curve asymmetric key pair
132112
*/
133-
async function generateEcKey(
134-
alg: "ES256" | "ES384",
135-
namedCurve: "P-256" | "P-384",
136-
kid: KeyId,
137-
options?: { guest?: string[]; guest_sub?: string[]; guest_pub?: string[] },
138-
): Promise<Key> {
113+
async function generateEcKey(alg: "ES256" | "ES384", namedCurve: "P-256" | "P-384", kid: KeyId): Promise<Key> {
139114
const keyPair = await crypto.subtle.generateKey(
140115
{
141116
name: "ECDSA",
@@ -163,20 +138,13 @@ async function generateEcKey(
163138
d: jwk.d,
164139
kid,
165140
key_ops: ["sign", "verify"],
166-
guest: options?.guest ?? [],
167-
guest_sub: options?.guest_sub ?? [],
168-
guest_pub: options?.guest_pub ?? [],
169141
};
170142
}
171143

172144
/**
173145
* Generate an EdDSA key pair using Ed25519
174146
*/
175-
async function generateEdDsaKey(
176-
alg: "EdDSA",
177-
kid: KeyId,
178-
options?: { guest?: string[]; guest_sub?: string[]; guest_pub?: string[] },
179-
): Promise<Key> {
147+
async function generateEdDsaKey(alg: "EdDSA", kid: KeyId): Promise<Key> {
180148
const keyPair = await crypto.subtle.generateKey(
181149
{
182150
name: "Ed25519",
@@ -201,9 +169,6 @@ async function generateEdDsaKey(
201169
d: jwk.d,
202170
kid,
203171
key_ops: ["sign", "verify"],
204-
guest: options?.guest ?? [],
205-
guest_sub: options?.guest_sub ?? [],
206-
guest_pub: options?.guest_pub ?? [],
207172
};
208173
}
209174

js/token/src/key.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,10 @@ const Base64FieldSchema = z.string().check(
3535
}),
3636
);
3737

38-
const StringOrArray = z._default(
39-
z.union([
40-
z.pipe(
41-
z.string(),
42-
z.transform((s) => [s]),
43-
),
44-
z.array(z.string()),
45-
]),
46-
[],
47-
);
48-
4938
const BaseKeySchema = z.object({
5039
alg: AlgorithmSchema,
5140
key_ops: z.array(OperationSchema).check(z.minLength(1)),
5241
kid: z.optional(KeyIdSchema),
53-
guest: StringOrArray,
54-
guest_sub: StringOrArray,
55-
guest_pub: StringOrArray,
5642
});
5743

5844
const OctKeySchema = z.extend(BaseKeySchema, {

rs/moq-relay/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ rustls = { version = "0.23", features = [
4949
"aws-lc-rs",
5050
], default-features = false }
5151
serde = { version = "1", features = ["derive"] }
52+
serde_json = "1"
5253
serde_with = { version = "3", features = ["json", "base64"] }
5354
thiserror = "2"
5455
tikv-jemalloc-ctl = { version = "0.6", optional = true }

0 commit comments

Comments
 (0)