update cloudflare context

This commit is contained in:
2025-12-17 23:52:08 -03:00
parent d683feb85f
commit be1ae656d3
25 changed files with 222 additions and 94 deletions

View File

@@ -13,10 +13,10 @@
"remix-auth-oauth2": "^3.4.1"
},
"devDependencies": {
"react-router": "^7.10.1",
"@types/node": "^24.10.1",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"react-router": "^7.10.1",
"typescript": "^5.9.3"
}
}

View File

@@ -13,13 +13,16 @@ export type User = {
refreshToken: string
}
export function createAuth(env, redirectURI = null) {
export function createAuth(
env: Record<string, any>,
redirectURI: string | null = null
) {
const authenticator = new Authenticator()
const strategy = new OAuth2Strategy(
{
clientId: env.CLIENT_ID,
clientSecret: env.CLIENT_SECRET,
redirectURI: redirectURI ?? env.REDIRECT_URI,
redirectURI: (env?.REDIRECT_URI ?? redirectURI) || undefined,
authorizationEndpoint: `${env.ISSUER_URL}/authorize`,
tokenEndpoint: `${env.ISSUER_URL}/token`,
tokenRevocationEndpoint: `${env.ISSUER_URL}/revoke`,

View File

@@ -1,5 +1,18 @@
import type { User } from '@/auth'
import { createContext } from 'react-router'
import type { User } from './auth'
export const userContext = createContext<User | null>(null)
export const requestIdContext = createContext<string | null>(null)
export interface CloudflareEnv {}
export interface CloudflareCtx {}
export type CloudflareContextType = {
env: CloudflareEnv extends Record<string, never>
? Record<string, unknown>
: CloudflareEnv
ctx: CloudflareCtx extends Record<string, never> ? unknown : CloudflareCtx
}
export const cloudflareContext = createContext<CloudflareContextType>()

View File

@@ -1,17 +1,18 @@
import { requestIdContext, userContext } from '@/context'
import { createSessionStorage } from '@/session'
import { createAuth, type User } from '@/auth'
import { decodeJwt } from 'jose'
import { redirect, type LoaderFunctionArgs } from 'react-router'
import type { OAuth2Strategy } from 'remix-auth-oauth2'
import { requestIdContext, userContext, cloudflareContext } from '../context'
import { createSessionStorage } from '../session'
import { createAuth, type User } from '../auth'
export const authMiddleware = async (
{ request, context }: LoaderFunctionArgs,
next: () => Promise<Response>
): Promise<Response> => {
const sessionStorage = createSessionStorage(context.cloudflare.env)
const authenticator = createAuth(context.cloudflare.env)
const cloudflare = context.get(cloudflareContext)
const sessionStorage = createSessionStorage(cloudflare.env)
const authenticator = createAuth(cloudflare.env)
const strategy = authenticator.get<OAuth2Strategy<User>>('oidc')
const session = await sessionStorage.getSession(request.headers.get('cookie'))
const requestId = context.get(requestIdContext)
@@ -51,6 +52,7 @@ export const authMiddleware = async (
session.set('user', user)
}
} catch (error) {
// @ts-ignore
console.error(`[${requestId}]`, error?.stack)
// If refreshing the token fails, remove the user from the current session

View File

@@ -1,10 +1,11 @@
import { requestIdContext } from '@/context'
import { type LoaderFunctionArgs } from 'react-router'
import { requestIdContext } from '../context'
export const loggingMiddleware = async (
{ request, context }: LoaderFunctionArgs,
next
) => {
next: () => Promise<Response>
): Promise<Response> => {
const requestId = crypto.randomUUID()
context.set(requestIdContext, requestId)

View File

@@ -1,4 +1,5 @@
import { createCookieSessionStorage } from 'react-router'
import { type User } from './auth'
type SessionData = {

View File

@@ -1,6 +1,12 @@
{
"compilerOptions": {
"module": "ESNext",
"moduleResolution": "bundler",
"target": "ES2022",
"lib": ["ES2022"],
"esModuleInterop": true,
"skipLibCheck": true,
"strict": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]