|
|
import { NextRequest, NextResponse } from "next/server"; |
|
|
|
|
|
|
|
|
|
|
|
export async function GET() { |
|
|
const redirect_uri = process.env.REDIRECT_URI; |
|
|
const loginRedirectUrl = `https://huggingface.co/oauth/authorize?client_id=${process.env.HUGGINGFACE_CLIENT_ID}&redirect_uri=${redirect_uri}&response_type=code&scope=openid%20profile%20write-repos%20manage-repos%20inference-api&prompt=consent&state=1234567890`; |
|
|
|
|
|
return NextResponse.json( |
|
|
{ |
|
|
redirect: loginRedirectUrl, |
|
|
}, |
|
|
{ |
|
|
status: 200, |
|
|
headers: { |
|
|
"Content-Type": "application/json", |
|
|
}, |
|
|
} |
|
|
); |
|
|
} |
|
|
|
|
|
export async function POST(req: NextRequest) { |
|
|
const body = await req.json(); |
|
|
const { code } = body; |
|
|
|
|
|
if (!code) { |
|
|
return NextResponse.json( |
|
|
{ error: "Code is required" }, |
|
|
{ |
|
|
status: 400, |
|
|
headers: { |
|
|
"Content-Type": "application/json", |
|
|
}, |
|
|
} |
|
|
); |
|
|
} |
|
|
|
|
|
const Authorization = `Basic ${Buffer.from( |
|
|
`${process.env.HUGGINGFACE_CLIENT_ID}:${process.env.HUGGINGFACE_CLIENT_SECRET}` |
|
|
).toString("base64")}`; |
|
|
|
|
|
const redirect_uri = process.env.REDIRECT_URI as string; |
|
|
const request_auth = await fetch("https://huggingface.co/oauth/token", { |
|
|
method: "POST", |
|
|
headers: { |
|
|
"Content-Type": "application/x-www-form-urlencoded", |
|
|
Authorization, |
|
|
}, |
|
|
body: new URLSearchParams({ |
|
|
grant_type: "authorization_code", |
|
|
code, |
|
|
redirect_uri, |
|
|
}), |
|
|
}); |
|
|
|
|
|
const response = await request_auth.json(); |
|
|
if (!response.access_token) { |
|
|
return NextResponse.json( |
|
|
{ error: "Failed to retrieve access token" }, |
|
|
{ |
|
|
status: 400, |
|
|
headers: { |
|
|
"Content-Type": "application/json", |
|
|
}, |
|
|
} |
|
|
); |
|
|
} |
|
|
|
|
|
const userResponse = await fetch("https://huggingface.co/api/whoami-v2", { |
|
|
headers: { |
|
|
Authorization: `Bearer ${response.access_token}`, |
|
|
}, |
|
|
}); |
|
|
|
|
|
if (!userResponse.ok) { |
|
|
return NextResponse.json( |
|
|
{ user: null, errCode: userResponse.status }, |
|
|
{ status: userResponse.status } |
|
|
); |
|
|
} |
|
|
const user = await userResponse.json(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return NextResponse.json( |
|
|
{ |
|
|
access_token: response.access_token, |
|
|
expires_in: response.expires_in, |
|
|
user, |
|
|
}, |
|
|
{ |
|
|
status: 200, |
|
|
headers: { |
|
|
"Content-Type": "application/json", |
|
|
}, |
|
|
} |
|
|
); |
|
|
} |
|
|
|