Skip to content

Commit

Permalink
Fix lint
Browse files Browse the repository at this point in the history
  • Loading branch information
Brooooooklyn committed May 21, 2024
1 parent 6677a3d commit 977b029
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 63 deletions.
71 changes: 34 additions & 37 deletions packages/backend/server/src/config/affine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,40 +132,37 @@ AFFiNE.port = 3010;
// AFFiNE.storage.storages.avatar.provider = 'r2';
//
/* OAuth Plugin */
AFFiNE.plugins.use('oauth', {
providers: {
github: {
issuer: '',
clientId: '',
clientSecret: '',
// See https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps
args: {
scope: 'user',
},
},
google: {
issuer: '',
clientId: '',
clientSecret: '',
args: {
// See https://developers.google.com/identity/protocols/oauth2
scope: 'openid email profile',
promot: 'select_account',
access_type: 'offline',
},
},
oidc: {
// OpenID Connect
issuer: '',
clientId: '',
clientSecret: '',
args: {
scope: 'openid email profile',
claim_id: 'preferred_username',
claim_email: 'email',
claim_name: 'name',
},
},
}
}
);
// AFFiNE.plugins.use('oauth', {
// providers: {
// github: {
// clientId: '',
// clientSecret: '',
// // See https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps
// args: {
// scope: 'user',
// },
// },
// google: {
// clientId: '',
// clientSecret: '',
// args: {
// // See https://developers.google.com/identity/protocols/oauth2
// scope: 'openid email profile',
// promot: 'select_account',
// access_type: 'offline',
// },
// },
// oidc: {
// // OpenID Connect
// issuer: '',
// clientId: '',
// clientSecret: '',
// args: {
// scope: 'openid email profile',
// claim_id: 'preferred_username',
// claim_email: 'email',
// claim_name: 'name',
// },
// },
// },
// });
2 changes: 1 addition & 1 deletion packages/backend/server/src/fundamentals/config/def.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export type ConfigPaths = LeafPaths<
| 'origin'
>,
'',
'.....'
'......'
>;

/**
Expand Down
6 changes: 5 additions & 1 deletion packages/backend/server/src/plugins/oauth/providers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,8 @@ import { GithubOAuthProvider } from './github';
import { GoogleOAuthProvider } from './google';
import { OIDCProvider } from './oidc';

export const OAuthProviders = [GoogleOAuthProvider, GithubOAuthProvider,OIDCProvider];
export const OAuthProviders = [
GoogleOAuthProvider,
GithubOAuthProvider,
OIDCProvider,
];
57 changes: 37 additions & 20 deletions packages/backend/server/src/plugins/oauth/providers/oidc.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common';

import { Config, URLHelper } from '../../../fundamentals';
import { AutoRegisteredOAuthProvider } from '../register';
import {OAuthAccount} from './def';
import { OAuthProviderName } from '../types';
import { OAuthOIDCProviderConfig, OAuthProviderName } from '../types';
import { OAuthAccount } from './def';

interface OIDCTokenResponse {
access_token: string;
Expand Down Expand Up @@ -32,16 +33,22 @@ export class OIDCProvider extends AutoRegisteredOAuthProvider {
private oidcConfig: OIDCConfiguration | null = null;
private readonly logger = new Logger(OIDCProvider.name);

override get config() {
return super.config as OAuthOIDCProviderConfig;
}

constructor(
protected readonly AFFiNEConfig: Config,
private readonly url: URLHelper,
private readonly url: URLHelper
) {
super();
this.loadOIDCConfigurationAsync().then(() => {
this.logger.log('OIDC configuration loaded.');
}).catch(error => {
this.logger.error('Failed to load OIDC configuration:', error);
});
this.loadOIDCConfigurationAsync()
.then(() => {
this.logger.log('OIDC configuration loaded.');
})
.catch(error => {
this.logger.error('Failed to load OIDC configuration:', error);
});
}

private async loadOIDCConfigurationAsync(): Promise<void> {
Expand All @@ -61,7 +68,9 @@ export class OIDCProvider extends AutoRegisteredOAuthProvider {
});

if (!response.ok) {
throw new Error(`Failed to fetch OIDC configuration: ${response.statusText}`);
throw new Error(
`Failed to fetch OIDC configuration: ${response.statusText}`
);
}

const fullConfig = await response.json();
Expand All @@ -72,33 +81,39 @@ export class OIDCProvider extends AutoRegisteredOAuthProvider {
end_session_endpoint: fullConfig.end_session_endpoint,
};
} catch (error) {
this.logger.error(`Failed to fetch OIDC configuration: ${(error as Error).message}`);
this.logger.error(
`Failed to fetch OIDC configuration: ${(error as Error).message}`
);
}
}

private mapUserInfo(user: Record<string, any>, claimsMap: Record<string, string>): UserInfo {
private mapUserInfo(
user: Record<string, any>,
claimsMap: Record<string, string>
): UserInfo {
const mappedUser: Partial<UserInfo> = {};
for (const [key, value] of Object.entries(claimsMap)) {
if (user[value] !== undefined) {
mappedUser[key] = user[value];
mappedUser[key as keyof UserInfo] = user[value];
}
}
return mappedUser as UserInfo;
}

private checkOIDCConfig(): void {
if (!this.oidcConfig) {
private checkOIDCConfig(
oidcConfig: OIDCConfiguration | null
): asserts oidcConfig is OIDCConfiguration {
if (!oidcConfig) {
throw new Error('OIDC configuration has not been loaded yet.');
}
}

getAuthUrl(state: string): string {
this.checkOIDCConfig();
this.checkOIDCConfig(this.oidcConfig);
return `${this.oidcConfig.authorization_endpoint}?${this.url.stringify({
client_id: this.config.clientId,
redirect_uri: this.url.link('/oauth/callback'),
response_type: 'code',
scope: this.config.args.scope,
...this.config.args,
state,
})}`;
Expand All @@ -110,7 +125,7 @@ export class OIDCProvider extends AutoRegisteredOAuthProvider {
expiresAt: Date;
scope: string;
}> {
this.checkOIDCConfig();
this.checkOIDCConfig(this.oidcConfig);
try {
const response = await fetch(this.oidcConfig.token_endpoint, {
method: 'POST',
Expand Down Expand Up @@ -151,7 +166,7 @@ export class OIDCProvider extends AutoRegisteredOAuthProvider {
}

async getUser(token: string): Promise<OAuthAccount> {
this.checkOIDCConfig();
this.checkOIDCConfig(this.oidcConfig);
try {
const response = await fetch(this.oidcConfig.userinfo_endpoint, {
method: 'GET',
Expand All @@ -170,11 +185,13 @@ export class OIDCProvider extends AutoRegisteredOAuthProvider {
const userinfo = this.mapUserInfo(user, claimsMap);
return {
id: userinfo.id,
email: userinfo.email
email: userinfo.email,
};
} else {
const errorText = await response.text();
throw new Error(`Server responded with non-success code ${response.status} ${errorText}`);
throw new Error(
`Server responded with non-success code ${response.status} ${errorText}`
);
}
} catch (e) {
throw new HttpException(
Expand Down
22 changes: 18 additions & 4 deletions packages/backend/server/src/plugins/oauth/types.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,31 @@
export interface OAuthProviderConfig {
issuer?: string;
clientId: string;
clientSecret: string;
args?: Record<string, string>;
args: {
scope?: string;
claim_id?: string;
claim_email?: string;
claim_name?: string;
promot?: string;
access_type?: string;
} & Record<string, string>;
}

export interface OAuthOIDCProviderConfig extends OAuthProviderConfig {
issuer: string;
}

export enum OAuthProviderName {
Google = 'google',
GitHub = 'github',
OIDC = 'oidc',
OIDC = 'oidc',
}

export interface OAuthConfig {
enabled: boolean;
providers: Partial<{ [key in OAuthProviderName]: OAuthProviderConfig }>;
providers: Partial<
{ [key in OAuthProviderName]: OAuthProviderConfig } & {
oidc: OAuthOIDCProviderConfig;
}
>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { GithubIcon, GoogleDuotoneIcon } from '@blocksuite/icons';
import { useLiveData, useService } from '@toeverything/infra';
import type { ReactElement } from 'react';
import { useState } from 'react';

import { AuthService, ServerConfigService } from '../../../modules/cloud';
import { mixpanel } from '../../../utils';

Expand Down

0 comments on commit 977b029

Please sign in to comment.