A very simple bookmarking webapp
pinboard.ing/
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}