(request: Request)
| 169 | }; |
| 170 | |
| 171 | const handleLogin = async (request: Request) => { |
| 172 | const url = new URL(request.url); |
| 173 | const transactionId = url.searchParams.get("transaction"); |
| 174 | const transaction = transactionId ? transactions.get(transactionId) : undefined; |
| 175 | if (!transactionId || !transaction) return json({ error: "invalid_request" }, { status: 400 }); |
| 176 | if (request.method === "GET") return text("OAuth test login"); |
| 177 | |
| 178 | const basic = decodeBasic(request.headers.get("authorization")); |
| 179 | if (!basic || basic.username !== "alice" || basic.password !== "password") { |
| 180 | return json( |
| 181 | { error: "access_denied" }, |
| 182 | { status: 401, headers: { "www-authenticate": 'Basic realm="Executor test servers"' } }, |
| 183 | ); |
| 184 | } |
| 185 | const code = `code_${crypto.randomUUID()}`; |
| 186 | transactions.delete(transactionId); |
| 187 | authorizationCodes.set(code, { ...transaction, username: basic.username }); |
| 188 | const callback = new URL(transaction.redirectUri); |
| 189 | callback.searchParams.set("code", code); |
| 190 | callback.searchParams.set("state", transaction.state); |
| 191 | return redirect(callback.toString()); |
| 192 | }; |
| 193 | |
| 194 | const handleToken = async (request: Request) => { |
| 195 | const params = new URLSearchParams(await request.text()); |
no test coverage detected