Create game token verification endpoint
cgen-c88dbcd85cbf48dcb82de934e825f1c2
This commit is contained in:
parent
ddc07569dd
commit
d3c7c87ed7
1 changed files with 69 additions and 0 deletions
69
api/games/verify-token.ts
Normal file
69
api/games/verify-token.ts
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
import type { VercelRequest, VercelResponse } from "@vercel/node";
|
||||||
|
import { createClient } from "@supabase/supabase-js";
|
||||||
|
|
||||||
|
const supabase = createClient(
|
||||||
|
process.env.SUPABASE_URL || "",
|
||||||
|
process.env.SUPABASE_SERVICE_ROLE || "",
|
||||||
|
);
|
||||||
|
|
||||||
|
export default async function handler(req: VercelRequest, res: VercelResponse) {
|
||||||
|
if (req.method !== "POST" && req.method !== "GET") {
|
||||||
|
res.setHeader("Allow", "POST, GET");
|
||||||
|
return res.status(405).json({ error: "Method not allowed" });
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { session_token, game } = req.method === "POST" ? req.body : req.query;
|
||||||
|
|
||||||
|
if (!session_token) {
|
||||||
|
return res.status(400).json({ error: "session_token is required" });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the session
|
||||||
|
const { data: sessionData, error: sessionError } = await supabase
|
||||||
|
.from("game_sessions")
|
||||||
|
.select("*, user_profiles!inner(id, username, email, full_name, metadata)")
|
||||||
|
.eq("session_token", String(session_token))
|
||||||
|
.single();
|
||||||
|
|
||||||
|
if (sessionError || !sessionData) {
|
||||||
|
return res.status(401).json({ error: "Invalid or expired token" });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if session is expired
|
||||||
|
const expiresAt = new Date(sessionData.expires_at);
|
||||||
|
if (expiresAt < new Date()) {
|
||||||
|
return res.status(401).json({ error: "Session has expired" });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional: Verify game matches if provided
|
||||||
|
if (game && sessionData.game !== String(game).toLowerCase()) {
|
||||||
|
return res.status(403).json({ error: "Token is not valid for this game" });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update last activity
|
||||||
|
await supabase
|
||||||
|
.from("game_sessions")
|
||||||
|
.update({ last_activity: new Date().toISOString() })
|
||||||
|
.eq("session_token", String(session_token));
|
||||||
|
|
||||||
|
const user = sessionData.user_profiles;
|
||||||
|
|
||||||
|
return res.status(200).json({
|
||||||
|
valid: true,
|
||||||
|
user_id: user.id,
|
||||||
|
username: user.username,
|
||||||
|
email: user.email,
|
||||||
|
full_name: user.full_name,
|
||||||
|
game: sessionData.game,
|
||||||
|
platform: sessionData.platform,
|
||||||
|
expires_at: sessionData.expires_at,
|
||||||
|
metadata: user.metadata || {},
|
||||||
|
});
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error("Token verification error:", error);
|
||||||
|
return res.status(500).json({
|
||||||
|
error: error?.message || "Verification failed",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue