@toruslabs/customauth
Version:
CustomAuth login with torus to get user private key
108 lines (105 loc) • 3.13 kB
JavaScript
import { get } from '@toruslabs/http-helpers';
import deepmerge from 'deepmerge';
import log from 'loglevel';
import { UX_MODE } from '../utils/enums.js';
import { constructURL, decodeToken, getUserId, padUrlString } from '../utils/helpers.js';
import { PopupHandler } from '../utils/PopupHandler.js';
import AbstractLoginHandler from './AbstractLoginHandler.js';
class MockLoginHandler extends AbstractLoginHandler {
constructor(params) {
super(params);
this.setFinalUrl();
}
setFinalUrl() {
const clonedParams = JSON.parse(JSON.stringify(this.params.jwtParams));
delete clonedParams.domain;
const finalJwtParams = deepmerge({
state: this.state,
client_id: this.params.clientId,
nonce: this.nonce
}, clonedParams);
this.finalURL = new URL(constructURL({
baseURL: this.params.redirect_uri,
query: null,
hash: finalJwtParams
}));
}
async getUserInfo(params) {
const {
idToken,
accessToken
} = params;
const {
domain,
userIdField,
isUserIdCaseSensitive,
user_info_route = "userinfo"
} = this.params.jwtParams;
if (idToken) {
const decodedToken = decodeToken(idToken).payload;
const {
name,
email,
picture
} = decodedToken;
return {
profileImage: picture,
name,
email,
userId: getUserId(decodedToken, this.params.authConnection, userIdField, isUserIdCaseSensitive),
authConnectionId: this.params.authConnectionId,
authConnection: this.params.authConnection,
groupedAuthConnectionId: this.params.groupedAuthConnectionId
};
}
if (accessToken) {
try {
const domainUrl = new URL(domain);
const userInfo = await get(`${padUrlString(domainUrl)}${user_info_route}`, {
headers: {
Authorization: `Bearer ${accessToken}`
}
});
const {
picture,
name,
email
} = userInfo;
return {
email,
name,
profileImage: picture,
userId: getUserId(userInfo, this.params.authConnection, userIdField, isUserIdCaseSensitive),
authConnectionId: this.params.authConnectionId,
authConnection: this.params.authConnection,
groupedAuthConnectionId: this.params.groupedAuthConnectionId
};
} catch (error) {
// ignore
log.warn(error, "Unable to get userinfo from endpoint");
}
}
throw new Error("Access/id token not available");
}
handleLoginWindow(params) {
const {
id_token: idToken,
access_token: accessToken
} = this.params.jwtParams;
const authConnectionWindow = new PopupHandler({
url: this.finalURL,
features: params.popupFeatures
});
if (this.params.uxMode === UX_MODE.REDIRECT) {
authConnectionWindow.redirect(params.locationReplaceOnRedirect);
} else {
return Promise.resolve({
state: {},
idToken,
accessToken
});
}
return null;
}
}
export { MockLoginHandler as default };