@toruslabs/customauth
Version:
CustomAuth login with torus to get user private key
83 lines (79 loc) • 2.26 kB
JavaScript
;
var base64url = require('base64url');
var deepmerge = require('deepmerge');
var sessionHelper = require('../utils/sessionHelper.js');
var AbstractLoginHandler = require('./AbstractLoginHandler.js');
class PasskeysHandler extends AbstractLoginHandler {
constructor(params) {
super(params);
this.setFinalUrl();
}
setFinalUrl() {
const {
passkeysHostUrl
} = this.params.customState || {};
if (!passkeysHostUrl) throw new Error("Invalid passkeys url.");
const finalUrl = new URL(passkeysHostUrl);
const clonedParams = JSON.parse(JSON.stringify(this.params.jwtParams || {}));
const finalJwtParams = deepmerge({
state: this.state,
client_id: this.params.clientId,
redirect_uri: this.params.redirect_uri
}, clonedParams);
Object.keys(finalJwtParams).forEach(key => {
const localKey = key;
if (finalJwtParams[localKey]) finalUrl.searchParams.append(localKey, finalJwtParams[localKey]);
});
this.finalURL = finalUrl;
}
async getUserInfo(parameters, storageServerUrl) {
const {
idToken,
extraParams
} = parameters;
const {
sessionId
} = JSON.parse(base64url.decode(extraParams)) || {};
if (!sessionId) {
throw new Error("sessionId not found");
}
const {
verifier_id: verifierId,
signature,
clientDataJSON,
authenticatorData,
publicKey,
challenge,
rpOrigin,
rpId,
credId,
transports,
username
} = await sessionHelper.fetchDataFromBroadcastServer(sessionId, storageServerUrl);
if (signature !== idToken) {
throw new Error("idtoken should be equal to signature");
}
return {
email: "",
name: "Passkeys Login",
profileImage: "",
authConnectionId: this.params.authConnectionId,
userId: verifierId,
authConnection: this.params.authConnection,
groupedAuthConnectionId: this.params.groupedAuthConnectionId,
extraConnectionParams: {
signature,
clientDataJSON,
authenticatorData,
publicKey,
challenge,
rpOrigin,
rpId,
credId,
transports,
username
}
};
}
}
module.exports = PasskeysHandler;