A very simple bookmarking webapp pinboard.ing/
at chore/move-sql 71 lines 2.1 kB view raw
1import { subjects } from "@auth/subjects.ts" 2import { getClient } from "@auth/client.ts" 3import { useQuery } from "@tanstack/solid-query" 4import { client } from "../apiclient.ts" 5 6if (typeof cookieStore !== "undefined") { 7 await import("cookie-store") 8} 9 10const clientID = import.meta.env.VITE_AUTH_CLIENT_ID 11const issuerUrl = import.meta.env.VITE_AUTH_ISSUER_URL 12 13export const authClient = getClient(clientID, issuerUrl) 14 15export async function isAuthenticated() { 16 const accessToken = await cookieStore.get("access_token") 17 const refreshToken = await cookieStore.get("refresh_token") 18 19 if (!accessToken) { 20 return false 21 } 22 23 const verified = await authClient.verify(subjects, accessToken.value!, { 24 refresh: refreshToken?.value, 25 }) 26 27 if (verified.err) { 28 console.error("Error verifying token:", verified.err) 29 await cookieStore.delete("access_token") 30 await cookieStore.delete("refresh_token") 31 32 return false 33 } 34 35 if (verified.tokens) { 36 await cookieStore.set({ 37 name: "access_token", 38 value: verified.tokens.access, 39 sameSite: "lax", 40 path: "/", 41 expires: Temporal.Now.instant().add({ 42 seconds: verified.tokens.expiresIn, 43 }).epochMilliseconds, 44 }) 45 await cookieStore.set({ 46 name: "refresh_token", 47 value: verified.tokens.refresh, 48 sameSite: "lax", 49 path: "/", 50 expires: Temporal.Now.instant().add({ 51 seconds: 60 * 60 * 24 * 400, // 400 days 52 }).epochMilliseconds, 53 }) 54 } 55 56 return verified.subject 57} 58 59export function useMe() { 60 return useQuery(() => ({ 61 queryKey: [client.api.v1.account.me.$url().pathname], 62 queryFn: async () => { 63 const res = await client.api.v1.account.me.$get() 64 if (!res.ok) { 65 throw new Error("Not authenticated") 66 } 67 return await res.json() 68 }, 69 retry: false, 70 })) 71}