Files
template/api/src/integrations/auth0-integration.ts
T
2026-06-19 23:55:45 -07:00

57 lines
1.5 KiB
TypeScript

import axios from "axios"
import { AUTH0_DOMAIN } from "@/config"
const auth0Api = axios.create({
baseURL: AUTH0_DOMAIN,
})
export interface Auth0UserInfo {
email: string
firstName: string
lastName: string
auth0Subject: string
}
export interface Auth0Response {
sub: string // "auth0|6241ec44e5b4a700693df293"
given_name: string // "Jane"
family_name: string // "Doe"
nickname: string // "Jane"
name: string // "Jane Doe"
picture: string // https://s.gravatar.com/avatar/1234567890abcdef1234567890abcdef?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fmb.png
updated_at: string // "2023-10-30T17:25:52.975Z"
email: string // "janedoe@gmail.com"
email_verified: boolean // true
oid?: string // 11111111-2222-3333-4444-555555555555"
}
export class Auth0PayloadError extends Error {
constructor(data: unknown) {
super(`Payload from Auth0 is strange or failed for: ${JSON.stringify(data)}`)
this.name = "Auth0PayloadError"
}
}
export const auth0Integration = {
async getUserInfo(token: string): Promise<Auth0UserInfo> {
const { data }: { data: Auth0Response } = await auth0Api.get("/userinfo", {
headers: { authorization: token },
})
const firstName = data.given_name || "UNKNOWN"
const lastName = data.family_name || "UNKNOWN"
const fallbackEmail = `${firstName}.${lastName}@yukon-no-email.ca`
const email = data.email || fallbackEmail
return {
auth0Subject: data.sub,
email,
firstName,
lastName,
}
},
}
export default auth0Integration