File size: 1,246 Bytes
f555806
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import { randomUUID } from 'crypto';
import { NextRequest, NextResponse } from 'next/server';

const HF_AUTHORIZE_URL = 'https://huggingface.co/oauth/authorize';
const STATE_COOKIE = 'hf_oauth_state';

export async function GET(request: NextRequest) {
  const clientId = process.env.HF_OAUTH_CLIENT_ID || process.env.NEXT_PUBLIC_HF_OAUTH_CLIENT_ID;
  if (!clientId) {
    return NextResponse.json({ error: 'OAuth client ID not configured' }, { status: 500 });
  }

  const state = randomUUID();
  const origin = request.nextUrl.origin;
  const redirectUri = `${origin}/api/auth/hf/callback`;

  const authorizeUrl = new URL(HF_AUTHORIZE_URL);
  authorizeUrl.searchParams.set('response_type', 'code');
  authorizeUrl.searchParams.set('client_id', clientId);
  authorizeUrl.searchParams.set('redirect_uri', redirectUri);
  authorizeUrl.searchParams.set('scope', 'openid profile read-repos');
  authorizeUrl.searchParams.set('state', state);

  const response = NextResponse.redirect(authorizeUrl.toString(), { status: 302 });
  response.cookies.set({
    name: STATE_COOKIE,
    value: state,
    httpOnly: true,
    sameSite: 'lax',
    secure: process.env.NODE_ENV === 'production',
    maxAge: 60 * 5,
    path: '/',
  });

  return response;
}