ily.li/src/models/AuthToken.ts

60 lines
1.7 KiB
TypeScript
Raw Normal View History

2020-11-22 13:49:08 +01:00
import Model from "swaf/db/Model";
import AuthProof from "swaf/auth/AuthProof";
import User from "swaf/auth/models/User";
2021-01-25 17:43:26 +01:00
import {nanoid} from "nanoid";
2020-06-14 13:01:52 +02:00
2020-08-11 17:54:15 +02:00
export default class AuthToken extends Model implements AuthProof<User> {
public id?: number = undefined;
protected readonly user_id?: number = undefined;
2020-11-22 14:13:57 +01:00
private secret?: string = undefined;
2020-08-11 17:54:15 +02:00
protected created_at?: Date = undefined;
protected used_at?: Date = undefined;
protected readonly ttl?: number = undefined;
2020-06-14 13:01:52 +02:00
2020-11-22 14:13:57 +01:00
protected init(): void {
2020-08-11 17:54:15 +02:00
this.setValidation('user_id').defined().exists(User, 'id');
this.setValidation('secret').defined().between(32, 64);
this.setValidation('ttl').defined().min(1).max(5 * 365 * 24 * 3600 /* 5 years */);
2020-06-14 13:01:52 +02:00
}
protected async autoFill(): Promise<void> {
2020-11-22 14:13:57 +01:00
if (!this.secret) {
2021-01-25 17:43:26 +01:00
this.secret = nanoid(64);
2020-11-22 14:13:57 +01:00
}
}
2020-11-22 14:13:57 +01:00
public use(): void {
2020-06-14 21:23:57 +02:00
this.used_at = new Date();
}
2020-11-22 14:13:57 +01:00
public canDelete(user_id: number): boolean {
2020-06-14 21:23:57 +02:00
return this.user_id === user_id;
}
2020-06-14 13:01:52 +02:00
public getExpirationDate(): Date {
if (!this.created_at) return new Date();
2020-11-22 14:13:57 +01:00
return new Date(this.created_at.getTime() + this.getOrFail('ttl') * 1000);
2020-06-14 13:01:52 +02:00
}
2020-08-11 17:54:15 +02:00
public async getResource(): Promise<User | null> {
2020-06-27 16:31:36 +02:00
return await User.getById<User>(this.user_id);
2020-06-14 13:01:52 +02:00
}
public async isAuthorized(): Promise<boolean> {
return true;
}
public async isValid(): Promise<boolean> {
return new Date().getTime() < this.getExpirationDate().getTime();
}
2020-08-11 17:54:15 +02:00
public async revoke(): Promise<void> {
2020-06-14 13:01:52 +02:00
await this.delete();
}
2020-11-22 14:13:57 +01:00
protected getSecret(): string | undefined {
return this.secret;
}
2020-11-22 13:49:08 +01:00
}