Something went wrong. Try again.
FlockOff is a mass-block tool for the Atmosphere flockoff.app
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940import { getOAuthClient, BASE_SCOPES } from '@/lib/oauth'import { checkRateLimit, getClientIp } from '@/lib/rate-limit'
export async function GET(request: Request) { const { searchParams } = new URL(request.url) const handle = searchParams.get('handle')?.trim()
if (!handle) { return Response.json({ error: 'handle is required' }, { status: 400 }) }
const rateLimit = checkRateLimit(`login:${getClientIp(request)}`, { limit: 20, windowMs: 10 * 60 * 1000, }) if (!rateLimit.allowed) { return Response.json( { error: 'Too many login attempts. Please wait before trying again.' }, { status: 429, headers: { 'Retry-After': String(rateLimit.retryAfterSeconds) } } ) }
try { const client = await getOAuthClient() // Base scopes only — list scopes are requested on demand via /api/oauth/upgrade const url = await client.authorize(handle, { scope: BASE_SCOPES }) return Response.redirect(url.toString(), 302) } catch (err) { console.error('[login] authorize failed:', err) const rawMessage = err instanceof Error ? err.message : 'Authorization failed' const message = /invalid[ _-]?scope|unsupported[^\n]*scope/i.test(rawMessage) ? 'pds_scope_unsupported' : rawMessage // Redirect back to login page with an error const loginUrl = new URL('/login', process.env.NEXT_PUBLIC_APP_URL!) loginUrl.searchParams.set('error', message) return Response.redirect(loginUrl.toString(), 302) }}