This repository has been archived on 2024-10-29. You can view files and clone it, but cannot push or open issues or pull requests.

60 lines
1.6 KiB
TypeScript

import querystring from "node:querystring"
import axios from "axios"
import { OAuthStrategy } from "#src/tools/utils/OAuthStrategy.js"
export const GOOGLE_PROVIDER = "Google"
export const GOOGLE_BASE_URL = "https://accounts.google.com/o/oauth2/v2/auth"
export const GOOGLE_OAUTH2_TOKEN = "https://oauth2.googleapis.com/token"
export const GOOGLE_USERINFO =
"https://www.googleapis.com/oauth2/v1/userinfo?alt=json"
export const GOOGLE_CLIENT_ID =
process.env["GOOGLE_CLIENT_ID"] ?? "GOOGLE_CLIENT_ID"
export const GOOGLE_CLIENT_SECRET =
process.env["GOOGLE_CLIENT_SECRET"] ?? "GOOGLE_CLIENT_SECRET"
export const googleStrategy = new OAuthStrategy(GOOGLE_PROVIDER)
export interface GoogleUser {
id: string
name: string
given_name: string
link: string
picture: string
locale: string
}
export interface GoogleTokens {
access_token: string
expires_in: number
token_type: string
scope: string
refresh_token?: string
}
export const getGoogleUserData = async (
code: string,
redirectURI: string,
): Promise<GoogleUser> => {
const { data: token } = await axios.post<GoogleTokens>(
GOOGLE_OAUTH2_TOKEN,
querystring.stringify({
client_id: GOOGLE_CLIENT_ID,
client_secret: GOOGLE_CLIENT_SECRET,
code,
redirect_uri: redirectURI,
grant_type: "authorization_code",
}),
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",
},
},
)
const { data: googleUser } = await axios.get<GoogleUser>(
`${GOOGLE_USERINFO}&access_token=${token.access_token}`,
)
return googleUser
}