2024-05-28 16:45:34 +00:00
|
|
|
import * as plugins from '../plugins.js';
|
2024-05-30 20:49:39 +00:00
|
|
|
|
|
|
|
import type { Cloudly } from '../classes.cloudly.js';
|
|
|
|
import { logger } from '../logger.js';
|
2024-05-28 16:45:34 +00:00
|
|
|
import { Authorization } from './classes.authorization.js';
|
|
|
|
import { User } from './classes.user.js';
|
|
|
|
|
2024-05-30 20:49:39 +00:00
|
|
|
|
|
|
|
export interface IJwtData {
|
|
|
|
userId: string;
|
|
|
|
status: 'loggedIn' | 'loggedOut';
|
|
|
|
}
|
|
|
|
|
|
|
|
export class CloudlyAuthManager {
|
2024-05-28 16:45:34 +00:00
|
|
|
cloudlyRef: Cloudly
|
|
|
|
public get db() {
|
|
|
|
return this.cloudlyRef.mongodbConnector.smartdataDb;
|
|
|
|
}
|
|
|
|
public CUser = plugins.smartdata.setDefaultManagerForDoc(this, User);
|
|
|
|
public CAuthorization = plugins.smartdata.setDefaultManagerForDoc(this, Authorization);
|
|
|
|
|
2024-05-30 20:49:39 +00:00
|
|
|
public typedrouter = new plugins.typedrequest.TypedRouter();
|
|
|
|
public smartjwtInstance: plugins.smartjwt.SmartJwt<IJwtData>;
|
|
|
|
|
2024-05-28 16:45:34 +00:00
|
|
|
constructor(cloudlyRef: Cloudly) {
|
|
|
|
this.cloudlyRef = cloudlyRef;
|
2024-05-30 20:49:39 +00:00
|
|
|
this.cloudlyRef.typedrouter.addTypedRouter(this.typedrouter);
|
2024-05-28 16:45:34 +00:00
|
|
|
}
|
2024-05-30 20:49:39 +00:00
|
|
|
|
|
|
|
public async start() {
|
|
|
|
// lets setup the smartjwtInstance
|
|
|
|
this.smartjwtInstance = new plugins.smartjwt.SmartJwt();
|
2024-06-01 03:48:57 +00:00
|
|
|
await this.smartjwtInstance.init();
|
2024-05-30 20:49:39 +00:00
|
|
|
const kvStore = await this.cloudlyRef.config.appData.getKvStore();
|
|
|
|
|
|
|
|
const existingJwtKeys: plugins.tsclass.network.IJwtKeypair = await kvStore.readKey('jwtKeys');
|
|
|
|
|
|
|
|
if (!existingJwtKeys) {
|
|
|
|
await this.smartjwtInstance.createNewKeyPair();
|
|
|
|
const newJwtKeys = this.smartjwtInstance.getKeyPairAsJson();
|
|
|
|
await kvStore.writeKey('jwtKeys', newJwtKeys);
|
|
|
|
} else {
|
|
|
|
this.smartjwtInstance.setKeyPairAsJson(existingJwtKeys);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.typedrouter.addTypedHandler(
|
|
|
|
new plugins.typedrequest.TypedHandler<plugins.servezoneInterfaces.requests.secret.IReq_Admin_LoginWithUsernameAndPassword>(
|
|
|
|
'adminLoginWithUsernameAndPassword',
|
|
|
|
async (dataArg) => {
|
|
|
|
let jwt: string;
|
|
|
|
const user = await User.findUserByUsernameAndPassword(dataArg.username, dataArg.password);
|
|
|
|
if (!user) {
|
|
|
|
logger.log('warn', 'login failed');
|
|
|
|
} else {
|
2024-06-01 03:48:57 +00:00
|
|
|
jwt = await this.smartjwtInstance.createJWT({
|
2024-05-30 20:49:39 +00:00
|
|
|
userId: user.id,
|
|
|
|
status: 'loggedIn',
|
|
|
|
});
|
|
|
|
logger.log('success', 'login successful');
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
jwt,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public async stop () {}
|
|
|
|
|
|
|
|
public adminJwtGuard = new plugins.smartguard.Guard<{jwt: string}>(async (dataArg) => {
|
|
|
|
const jwt = dataArg.jwt;
|
2024-06-01 03:48:57 +00:00
|
|
|
const jwtData: IJwtData = await this.smartjwtInstance.verifyJWTAndGetData(jwt);
|
2024-05-30 20:49:39 +00:00
|
|
|
const user = await this.CUser.getInstance({id: jwtData.userId});
|
2024-06-01 03:48:57 +00:00
|
|
|
const isAdminBool = user.data.role === 'admin';
|
|
|
|
console.log(`user is admin: ${isAdminBool}`);
|
|
|
|
return isAdminBool;
|
|
|
|
}, {
|
|
|
|
failedHint: 'user is not admin.'
|
2024-05-30 20:49:39 +00:00
|
|
|
})
|
2024-05-28 16:45:34 +00:00
|
|
|
}
|