All checks were successful
ci/woodpecker/push/build-image Pipeline was successful
34 lines
1.0 KiB
TypeScript
34 lines
1.0 KiB
TypeScript
import { decodeIdToken, Google } from 'arctic';
|
|
import { env } from '$env/dynamic/private';
|
|
import { envToBool } from '$lib/utils';
|
|
import { assertGuard } from 'typia';
|
|
import type { IOAuthProvider } from '$lib/server/oauth';
|
|
|
|
const googleProvider = new Google(
|
|
env.AUTH_GOOGLE_CLIENT_ID,
|
|
env.AUTH_GOOGLE_CLIENT_SECRET,
|
|
`${env.ORIGIN}/auth/google/callback`,
|
|
);
|
|
|
|
export const google: IOAuthProvider = {
|
|
requireInvite: envToBool(env.AUTH_GOOGLE_REQUIRE_INVITE, true),
|
|
createAuthorizationURL: (state: string, codeVerifier: string) => {
|
|
const scopes = ['openid', 'profile', 'email'];
|
|
return googleProvider.createAuthorizationURL(state, codeVerifier, scopes);
|
|
},
|
|
validateAuthorizationCode: async (code: string, codeVerifier: string) => {
|
|
const tokens = await googleProvider.validateAuthorizationCode(code, codeVerifier);
|
|
const claims = decodeIdToken(tokens.idToken());
|
|
assertGuard<{
|
|
sub: string;
|
|
email: string;
|
|
name: string;
|
|
}>(claims);
|
|
return {
|
|
sub: claims.sub,
|
|
name: claims.name,
|
|
username: claims.email,
|
|
};
|
|
},
|
|
};
|