@authduo/authduo
Version:
Free User-sovereign Authentication for the World
70 lines • 2.18 kB
JavaScript
import { Bytename, deep, Hex, hexId } from "@benev/slate";
import { Token } from "./jwt/token.js";
import { Keypair } from "./keypair.js";
export class Passport {
keypairData;
name;
created;
constructor(keypairData, name, created) {
this.keypairData = keypairData;
this.name = name;
this.created = created;
}
get thumbprint() {
return this.keypairData.thumbprint;
}
static async generate() {
const keypair = await Keypair.generate();
const keypairData = await keypair.toData();
const thumbBytes = Hex.bytes(keypair.thumbprint).slice(0, 5);
const name = Bytename.string(thumbBytes, "Xxxxxx Xxxxxxxxx ");
const created = Date.now();
return new this(keypairData, name, created);
}
static fromData(data) {
const { keypair, name, created } = data;
return new this(keypair, name, created);
}
toData() {
return deep.clone({
keypair: this.keypairData,
name: this.name,
created: this.created,
});
}
async getKeypair() {
return await Keypair.fromData(this.keypairData);
}
async signLoginTokens(o) {
const passportKeypair = await this.getKeypair();
const loginKeypair = await Keypair.generate();
const exp = Token.fromJsTime(o.expiresAt);
const name = this.name;
const iss = o.issuer;
const aud = o.audience;
const jti = hexId();
const proofToken = await passportKeypair.sign({
exp,
iss,
aud,
jti,
data: {
loginPubkey: await loginKeypair.toPubkey().toData(),
passportPubkey: await passportKeypair.toPubkey().toData(),
},
});
const keysToken = await passportKeypair.sign({
sub: this.thumbprint,
exp,
iss,
aud,
jti,
data: {
name,
loginKeypair: await loginKeypair.toData(),
},
});
return { proofToken, keysToken };
}
}
//# sourceMappingURL=passport.js.map