|
|
import { NextRequest, NextResponse } from "next/server"; |
|
|
import MY_TOKEN_KEY from "@/lib/get-cookie-name"; |
|
|
|
|
|
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.OAUTH_CLIENT_ID}:${process.env.OAUTH_CLIENT_SECRET}` |
|
|
).toString("base64")}`; |
|
|
|
|
|
const host = |
|
|
req.headers.get("host") ?? req.headers.get("origin") ?? "localhost:3000"; |
|
|
|
|
|
const url = host.includes("/spaces/enzostvs") |
|
|
? "enzostvs-deepsite.hf.space" |
|
|
: host; |
|
|
const redirect_uri = |
|
|
`${host.includes("localhost") ? "http://" : "https://"}` + |
|
|
url + |
|
|
"/auth/callback"; |
|
|
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(); |
|
|
|
|
|
const cookieName = MY_TOKEN_KEY(); |
|
|
const isProduction = process.env.NODE_ENV === "production"; |
|
|
|
|
|
|
|
|
const nextResponse = NextResponse.json( |
|
|
{ |
|
|
access_token: response.access_token, |
|
|
expires_in: response.expires_in, |
|
|
user, |
|
|
|
|
|
useLocalStorageFallback: true, |
|
|
}, |
|
|
{ |
|
|
status: 200, |
|
|
headers: { |
|
|
"Content-Type": "application/json", |
|
|
}, |
|
|
} |
|
|
); |
|
|
|
|
|
|
|
|
const cookieOptions = [ |
|
|
`${cookieName}=${response.access_token}`, |
|
|
`Max-Age=${response.expires_in || 3600}`, |
|
|
"Path=/", |
|
|
"HttpOnly", |
|
|
...(isProduction ? ["Secure", "SameSite=None"] : ["SameSite=Lax"]) |
|
|
].join("; "); |
|
|
|
|
|
nextResponse.headers.set("Set-Cookie", cookieOptions); |
|
|
|
|
|
return nextResponse; |
|
|
} |
|
|
|