tangled
alpha
login
or
join now
dunkirk.sh
/
hop
6
fork
atom
blazing fast link redirects on cloudflare kv
hop.dunkirk.sh/u/tacy
6
fork
atom
overview
issues
pulls
pipelines
feat: allow api key auth too
dunkirk.sh
3 months ago
10164868
d03b25ea
verified
This commit was signed with the committer's
known signature
.
dunkirk.sh
SSH Key Fingerprint:
SHA256:DqcG0RXYExE26KiWo3VxJnsxswN1QNfTBvB+bdSpk80=
+29
-12
2 changed files
expand all
collapse all
unified
split
src
index.ts
wrangler.toml
+28
-12
src/index.ts
···
80
80
// Check auth for all other routes (except / which needs to load first)
81
81
if (url.pathname !== '/') {
82
82
const authHeader = request.headers.get('Authorization');
83
83
-
if (!authHeader || !authHeader.startsWith('Bearer ')) {
83
83
+
if (!authHeader) {
84
84
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
85
85
status: 401,
86
86
headers: { 'Content-Type': 'application/json' },
87
87
});
88
88
}
89
89
90
90
-
const token = authHeader.slice(7);
91
91
-
const sessionData = await env.HOP.get(`session:${token}`);
90
90
+
// Check for API key authentication
91
91
+
if (authHeader.startsWith('Bearer ')) {
92
92
+
const token = authHeader.slice(7);
93
93
+
94
94
+
// Check if it's an API key
95
95
+
if (token === env.API_KEY) {
96
96
+
// Valid API key, continue
97
97
+
} else {
98
98
+
// Check if it's a session token
99
99
+
const sessionData = await env.HOP.get(`session:${token}`);
92
100
93
93
-
if (!sessionData) {
94
94
-
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
95
95
-
status: 401,
96
96
-
headers: { 'Content-Type': 'application/json' },
97
97
-
});
98
98
-
}
101
101
+
if (!sessionData) {
102
102
+
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
103
103
+
status: 401,
104
104
+
headers: { 'Content-Type': 'application/json' },
105
105
+
});
106
106
+
}
99
107
100
100
-
const session = JSON.parse(sessionData);
101
101
-
if (session.expiresAt < Date.now()) {
102
102
-
await env.HOP.delete(`session:${token}`);
108
108
+
const session = JSON.parse(sessionData);
109
109
+
if (session.expiresAt < Date.now()) {
110
110
+
await env.HOP.delete(`session:${token}`);
111
111
+
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
112
112
+
status: 401,
113
113
+
headers: { 'Content-Type': 'application/json' },
114
114
+
});
115
115
+
}
116
116
+
}
117
117
+
} else {
103
118
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
104
119
status: 401,
105
120
headers: { 'Content-Type': 'application/json' },
···
277
292
interface Env {
278
293
HOP: KVNamespace;
279
294
AUTH_PASSWORD: string;
295
295
+
API_KEY: string;
280
296
}
+1
wrangler.toml
···
18
18
19
19
[vars]
20
20
AUTH_PASSWORD = "changeme"
21
21
+
API_KEY = "your-api-key-here"
21
22
22
23
[[rules]]
23
24
type = "Text"