mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-19 11:06:25 +08:00
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:
@@ -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.'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user