Skip to content
This repository was archived by the owner on Sep 22, 2024. It is now read-only.

Commit 5f44325

Browse files
committed
feat(plugins/auth): add netzolabs provider (via google oauth)
1 parent a5d2f13 commit 5f44325

File tree

4 files changed

+60
-1
lines changed

4 files changed

+60
-1
lines changed

lib/plugins/auth/islands/auth-form.tsx

+6
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,12 @@ export function AuthForm(props: AuthFormProps) {
186186
</ButtonOAuth2>
187187
)} */
188188
}
189+
190+
{!!providers?.netzolabs && (
191+
<ButtonNetzo text={`${i18n.authForm.text} NetzoLabs`} href="/auth/netzolabs/signin">
192+
<div className="mr-4 w-22px h-22px i-netzo-symbol" />
193+
</ButtonNetzo>
194+
)}
189195
</div>
190196
</>
191197
);

lib/plugins/auth/plugin.ts

+5
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ export type AuthConfig = {
7171
clientSecret?: string;
7272
oktaDomain?: string; // must set OKTA_DOMAIN environment variable
7373
};
74+
netzolabs?: AuthConfigProvider & {
75+
clientId?: string;
76+
clientSecret?: string;
77+
};
7478
};
7579
/** A function to check if a user is authorized to sign in. The function should
7680
* throw an Error with an optional error message if not authorized.
@@ -132,6 +136,7 @@ export const auth = (config: AuthConfig): Plugin<NetzoState> => {
132136
"gitlab",
133137
"auth0",
134138
"okta",
139+
"netzolabs",
135140
].some((key) => !!config?.providers?.[key as AuthProvider]);
136141
if (!authEnabled) return { name: "netzo.auth" }; // skip if auth but no providers are set
137142

lib/plugins/auth/utils/providers/mod.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { getUserGithub } from "./github.ts";
1717
import { getUserGitlab } from "./gitlab.ts";
1818
import { getUserGoogle } from "./google.ts";
1919
import { getUserNetzo, handleCallbackNetzo, signInNetzo } from "./netzo.ts";
20+
import { getUserNetzolabs } from "./netzolabs.ts";
2021
import { getUserOkta } from "./okta.ts";
2122
import { getUserSlack } from "./slack.ts";
2223

@@ -36,7 +37,10 @@ export const getAuthConfig = (provider: AuthProvider, ctx: FreshContext) => {
3637
case "google": {
3738
return createGoogleOAuthConfig({
3839
redirectUri,
39-
scope: "https://www.googleapis.com/auth/userinfo.profile",
40+
scope: [
41+
"https://www.googleapis.com/auth/userinfo.profile",
42+
"https://www.googleapis.com/auth/userinfo.email",
43+
],
4044
});
4145
}
4246
case "github": {
@@ -70,6 +74,21 @@ export const getAuthConfig = (provider: AuthProvider, ctx: FreshContext) => {
7074
// case "discord":
7175
// case "dropbox":
7276
// case "facebook":
77+
case "netzolabs": {
78+
return {
79+
clientId: Deno.env.get("NETZOLABS_CLIENT_ID")!,
80+
clientSecret: Deno.env.get("NETZOLABS_CLIENT_SECRET")!,
81+
authorizationEndpointUri: "https://accounts.google.com/o/oauth2/v2/auth",
82+
tokenUri: "https://oauth2.googleapis.com/token",
83+
redirectUri,
84+
defaults: {
85+
scope: [
86+
"https://www.googleapis.com/auth/userinfo.profile",
87+
"https://www.googleapis.com/auth/userinfo.email",
88+
],
89+
},
90+
}; // MUST be set if using Netzo Auth Provider
91+
}
7392
default:
7493
throw new Error(`Provider ${provider} not supported`);
7594
}
@@ -107,6 +126,8 @@ export const getUserByProvider = async (
107126
return await getUserAuth0(accessToken);
108127
case "okta":
109128
return await getUserOkta(accessToken);
129+
case "netzolabs":
130+
return await getUserNetzolabs(accessToken);
110131
default:
111132
throw new Error(`Provider ${provider} not supported`);
112133
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import type { AuthUserFromProvider } from "../types.ts";
2+
import { UserGoogle } from "./google.ts";
3+
4+
export type UserNetzolabs = UserGoogle;
5+
6+
export async function getUserNetzolabs(
7+
accessToken: string,
8+
): Promise<AuthUserFromProvider> {
9+
const response = await fetch(
10+
"https://www.googleapis.com/oauth2/v3/userinfo",
11+
{
12+
headers: { authorization: `Bearer ${accessToken}` },
13+
},
14+
);
15+
if (!response.ok) {
16+
const { message } = await response.json();
17+
throw new Error(`${response.status}: ${message}`);
18+
}
19+
const userNetzolabs: UserNetzolabs = await response.json();
20+
return {
21+
provider: "netzolabs",
22+
authId: userNetzolabs.sub,
23+
name: userNetzolabs.name,
24+
email: userNetzolabs.email,
25+
avatar: userNetzolabs.picture,
26+
};
27+
}

0 commit comments

Comments
 (0)