-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathgetUser.ts
37 lines (33 loc) · 1.68 KB
/
getUser.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import {cache} from "react";
import {getTokens} from "next-firebase-auth-edge";
import {filterStandardClaims} from "next-firebase-auth-edge/lib/auth/claims";
import type {ReadonlyRequestCookies} from "next/dist/server/web/spec-extension/adapters/request-cookies";
import type {RequestCookies} from "next/dist/server/web/spec-extension/cookies";
import type {AuthUser} from "./AuthContext";
export const getUser = cache(async (cookies: RequestCookies | ReadonlyRequestCookies): Promise<AuthUser | null> => {
const tokens = await getTokens(cookies, {
apiKey: process.env.NEXT_PUBLIC_FIREBASE_PUBLIC_API_KEY!,
cookieName: 'AuthCookie',
cookieSignatureKeys: [process.env.COOKIE_SECRET_CURRENT!, process.env.COOKIE_SECRET_PREVIOUS!],
serviceAccount: {
projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID!,
clientEmail: process.env.PRIVATE_FIREBASE_CLIENT_EMAIL!,
// Using JSON to handle newline problems when storing the key as a secret in Vercel. See:
// https://github.com/vercel/vercel/issues/749#issuecomment-707515089
privateKey: JSON.parse(process.env.PRIVATE_FIREBASE_PRIVATE_KEY!),
},
});
if (!tokens)
return null;
const decodedToken = tokens.decodedToken;
return {
id: decodedToken.uid,
email: decodedToken.email ?? null,
emailVerified: decodedToken.email_verified ?? false,
phoneNumber: decodedToken.phone_number ?? null,
displayName: decodedToken.name ?? null,
photoURL: decodedToken.picture ?? null,
claims: filterStandardClaims(decodedToken),
signInProvider: decodedToken.firebase.sign_in_provider,
}
});