refactor(server): auth (#5895)

Remove `next-auth` and implement our own Authorization/Authentication system from scratch.

## Server

- [x] tokens
  - [x] function
  - [x] encryption

- [x] AuthController
  - [x] /api/auth/sign-in
  - [x] /api/auth/sign-out
  - [x] /api/auth/session
  - [x] /api/auth/session (WE SUPPORT MULTI-ACCOUNT!)

- [x] OAuthPlugin
  - [x] OAuthController
  - [x] /oauth/login
  - [x] /oauth/callback
  - [x] Providers
    - [x] Google
    - [x] GitHub

## Client

- [x] useSession
- [x] cloudSignIn
- [x] cloudSignOut

## NOTE:

Tests will be adding in the future
This commit is contained in:
liuyi
2024-03-12 10:00:09 +00:00
parent af49e8cc41
commit fb3a0e7b8f
148 changed files with 3407 additions and 2851 deletions
@@ -0,0 +1,58 @@
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { Config } from '../../fundamentals';
import { OAuthProvider } from './providers/def';
import { OAuthProviderName } from './types';
const PROVIDERS: Map<OAuthProviderName, OAuthProvider> = new Map();
export function registerOAuthProvider(
name: OAuthProviderName,
provider: OAuthProvider
) {
PROVIDERS.set(name, provider);
}
@Injectable()
export class OAuthProviderFactory {
get providers() {
return PROVIDERS.keys();
}
get(name: OAuthProviderName): OAuthProvider | undefined {
return PROVIDERS.get(name);
}
}
export abstract class AutoRegisteredOAuthProvider
extends OAuthProvider
implements OnModuleInit
{
protected abstract AFFiNEConfig: Config;
get optionalConfig() {
return this.AFFiNEConfig.plugins.oauth?.providers?.[this.provider];
}
get config() {
const config = this.optionalConfig;
if (!config) {
throw new Error(
`OAuthProvider Config should not be used before registered`
);
}
return config;
}
onModuleInit() {
const config = this.optionalConfig;
if (config && config.clientId && config.clientSecret) {
registerOAuthProvider(this.provider, this);
new Logger(`OAuthProvider:${this.provider}`).log(
'OAuth provider registered.'
);
}
}
}