Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
1.9 kB · 57 lines
TypeScript
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758import * as Effect from "effect/Effect";import { endpoints } from "./cloudflare.ts";import { configuration, type Env } from "./config.ts";import { hash, random } from "./crypto.ts";import { redirect } from "./http-response.ts";import { cookie, readCookie, SESSION_COOKIE, TRANSACTION_COOKIE, vault,} from "./session.ts";import type { BridgeRequest } from "./vault.ts";
export function beginOAuth( request: Request, env: Env, bridge?: BridgeRequest, providerInstallationId?: string, domainInstallationId?: string,) { return Effect.gen(function* () { const config = yield* configuration(env); const state = random(); const binding = random(); const verifier = random(); const continuationRef = bridge ? random() : undefined; if (bridge && continuationRef) yield* vault(env, "continuation", continuationRef).createContinuation({ ...bridge, bindingHash: yield* hash(binding), }); yield* vault(env, "transaction", state).createTransaction({ bindingHash: yield* hash(binding), verifier, previousSession: readCookie(request, SESSION_COOKIE), returnTo: "/connect", ...(providerInstallationId ? { providerInstallationId } : {}), ...(domainInstallationId ? { domainInstallationId } : {}), ...(continuationRef ? { bridgeContinuation: continuationRef } : {}), expiresAt: Date.now() + 10 * 60_000, }); const destination = new URL(endpoints.authorization); destination.search = new URLSearchParams({ response_type: "code", client_id: config.oauthClientId, redirect_uri: config.oauthRedirectUri, scope: config.oauthScopes.join(" "), state, code_challenge: yield* hash(verifier), code_challenge_method: "S256", }).toString(); return redirect(destination.href, [ cookie(TRANSACTION_COOKIE, binding, 600), ]); });}