mirror of
https://github.com/fosrl/pangolin.git
synced 2025-12-16 13:06:27 +00:00
respond with relative code expiration time
This commit is contained in:
@@ -22,7 +22,7 @@ export type StartDeviceWebAuthBody = z.infer<typeof bodySchema>;
|
|||||||
|
|
||||||
export type StartDeviceWebAuthResponse = {
|
export type StartDeviceWebAuthResponse = {
|
||||||
code: string;
|
code: string;
|
||||||
expiresAt: number;
|
expiresInSeconds: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper function to generate device code in format A1AJ-N5JD
|
// Helper function to generate device code in format A1AJ-N5JD
|
||||||
@@ -131,10 +131,13 @@ export async function startDeviceWebAuth(
|
|||||||
createdAt: Date.now()
|
createdAt: Date.now()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// calculate relative expiration in seconds
|
||||||
|
const expiresInSeconds = Math.floor((expiresAt - Date.now()) / 1000);
|
||||||
|
|
||||||
return response<StartDeviceWebAuthResponse>(res, {
|
return response<StartDeviceWebAuthResponse>(res, {
|
||||||
data: {
|
data: {
|
||||||
code,
|
code,
|
||||||
expiresAt
|
expiresInSeconds
|
||||||
},
|
},
|
||||||
success: true,
|
success: true,
|
||||||
error: false,
|
error: false,
|
||||||
|
|||||||
@@ -15,8 +15,6 @@ export default async function DeviceLoginPage({ searchParams }: Props) {
|
|||||||
const params = await searchParams;
|
const params = await searchParams;
|
||||||
const code = params.code || "";
|
const code = params.code || "";
|
||||||
|
|
||||||
console.log("user", user);
|
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
const redirectDestination = code
|
const redirectDestination = code
|
||||||
? `/auth/login/device?code=${encodeURIComponent(code)}`
|
? `/auth/login/device?code=${encodeURIComponent(code)}`
|
||||||
|
|||||||
@@ -84,6 +84,9 @@ export default function DeviceLoginForm({
|
|||||||
if (!data.code.includes("-") && data.code.length === 8) {
|
if (!data.code.includes("-") && data.code.length === 8) {
|
||||||
data.code = data.code.slice(0, 4) + "-" + data.code.slice(4);
|
data.code = data.code.slice(0, 4) + "-" + data.code.slice(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 300));
|
||||||
|
|
||||||
// First check - get metadata
|
// First check - get metadata
|
||||||
const res = await api.post(
|
const res = await api.post(
|
||||||
"/device-web-auth/verify?forceLogin=true",
|
"/device-web-auth/verify?forceLogin=true",
|
||||||
@@ -93,8 +96,6 @@ export default function DeviceLoginForm({
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 500)); // artificial delay for better UX
|
|
||||||
|
|
||||||
if (res.data.success && res.data.data.metadata) {
|
if (res.data.success && res.data.data.metadata) {
|
||||||
setMetadata(res.data.data.metadata);
|
setMetadata(res.data.data.metadata);
|
||||||
setCode(data.code.toUpperCase());
|
setCode(data.code.toUpperCase());
|
||||||
@@ -116,14 +117,14 @@ export default function DeviceLoginForm({
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 300));
|
||||||
|
|
||||||
// Final verify
|
// Final verify
|
||||||
await api.post("/device-web-auth/verify", {
|
await api.post("/device-web-auth/verify", {
|
||||||
code: code,
|
code: code,
|
||||||
verify: true
|
verify: true
|
||||||
});
|
});
|
||||||
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 500)); // artificial delay for better UX
|
|
||||||
|
|
||||||
// Redirect to success page
|
// Redirect to success page
|
||||||
router.push("/auth/login/device/success");
|
router.push("/auth/login/device/success");
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
|
|||||||
Reference in New Issue
Block a user