feat(reception): persist email action tokens and registration sessions for authentication and signup flows
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
import * as plugins from '../plugins.js';
|
||||
import { LoginSessionManager } from './classes.loginsessionmanager.js';
|
||||
|
||||
@plugins.smartdata.Manager()
|
||||
export class EmailActionToken extends plugins.smartdata.SmartDataDbDoc<
|
||||
EmailActionToken,
|
||||
plugins.idpInterfaces.data.IEmailActionToken,
|
||||
LoginSessionManager
|
||||
> {
|
||||
public static hashToken(tokenArg: string) {
|
||||
return plugins.smarthash.sha256FromStringSync(tokenArg);
|
||||
}
|
||||
|
||||
public static createOpaqueToken(actionArg: plugins.idpInterfaces.data.TEmailActionTokenAction) {
|
||||
return `${actionArg}_${plugins.crypto.randomBytes(32).toString('base64url')}`;
|
||||
}
|
||||
|
||||
@plugins.smartdata.unI()
|
||||
public id: string;
|
||||
|
||||
@plugins.smartdata.svDb()
|
||||
public data: plugins.idpInterfaces.data.IEmailActionToken['data'] = {
|
||||
email: '',
|
||||
action: 'emailLogin',
|
||||
tokenHash: '',
|
||||
validUntil: 0,
|
||||
createdAt: 0,
|
||||
};
|
||||
|
||||
public isExpired() {
|
||||
return this.data.validUntil < Date.now();
|
||||
}
|
||||
|
||||
public matchesToken(tokenArg: string) {
|
||||
return this.data.tokenHash === EmailActionToken.hashToken(tokenArg);
|
||||
}
|
||||
|
||||
public async consume(tokenArg: string) {
|
||||
if (this.isExpired() || !this.matchesToken(tokenArg)) {
|
||||
if (this.isExpired()) {
|
||||
await this.delete();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
await this.delete();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user