add security api class
parent
ed9d095e78
commit
e42761dcda
|
@ -0,0 +1,58 @@
|
|||
import crypto from 'crypto';
|
||||
import { Request } from 'express';
|
||||
import { Client } from '..';
|
||||
|
||||
export default class Security {
|
||||
public client: Client;
|
||||
|
||||
public keyPair: { publicKey: string, privateKey: string };
|
||||
|
||||
constructor(client: Client) {
|
||||
this.client = client;
|
||||
this.keyPair = client.config.keyPair;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new Bearer token.
|
||||
* @param _id The Mongoose Document property labeled ._id
|
||||
*/
|
||||
public async createBearer(_id: string): Promise<string> {
|
||||
const account = await this.client.db.Account.findOne({ _id });
|
||||
if (!account) throw new Error(`Account [${_id}] cannot be found.`);
|
||||
const bearer = crypto.randomBytes(12);
|
||||
const sign = crypto.createSign('sha3-224');
|
||||
sign.update(bearer);
|
||||
sign.end();
|
||||
const signature = sign.sign(this.keyPair.privateKey, 'hex');
|
||||
await account.updateOne({ bearerSignature: signature });
|
||||
return bearer.toString('base64');
|
||||
}
|
||||
|
||||
public async checkBearer(_id: string, bearer: string): Promise<boolean> {
|
||||
const account = await this.client.db.Account.findOne({ _id });
|
||||
if (!account) return false;
|
||||
if (!account.bearerSignature) return false;
|
||||
const verify = crypto.createVerify('sha3-224');
|
||||
verify.update(bearer);
|
||||
verify.end();
|
||||
try {
|
||||
return verify.verify(this.keyPair.publicKey, account.bearerSignature, 'base64');
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public extractBearer(req: Request): string {
|
||||
const url = new URL(req.url);
|
||||
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
|
||||
return req.headers.authorization.split(' ')[1];
|
||||
}
|
||||
if (req.query && req.query.token) {
|
||||
return req.query.token;
|
||||
}
|
||||
if (url.password) {
|
||||
return url.password;
|
||||
}
|
||||
return 'null';
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue