@toruslabs/customauth
Version:
CustomAuth login with torus to get user private key
100 lines (97 loc) • 3.26 kB
JavaScript
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import { get } from '@toruslabs/http-helpers';
import deepmerge from 'deepmerge';
import log from 'loglevel';
import { validateAndConstructUrl, loginToConnectionMap, decodeToken, getUserId, padUrlString } from '../utils/helpers.js';
import AbstractLoginHandler from './AbstractLoginHandler.js';
class JwtHandler extends AbstractLoginHandler {
constructor(params) {
super(params);
_defineProperty(this, "SCOPE", "openid profile email");
_defineProperty(this, "RESPONSE_TYPE", "token id_token");
_defineProperty(this, "PROMPT", "login");
this.setFinalUrl();
}
setFinalUrl() {
const {
domain
} = this.params.jwtParams;
const finalUrl = validateAndConstructUrl(domain);
finalUrl.pathname += finalUrl.pathname.endsWith("/") ? "authorize" : "/authorize";
const clonedParams = JSON.parse(JSON.stringify(this.params.jwtParams));
delete clonedParams.domain;
const finalJwtParams = deepmerge({
state: this.state,
response_type: this.RESPONSE_TYPE,
client_id: this.params.clientId,
prompt: this.PROMPT,
redirect_uri: this.params.redirect_uri,
scope: this.SCOPE,
connection: loginToConnectionMap[this.params.authConnection],
nonce: this.nonce
}, clonedParams);
Object.keys(finalJwtParams).forEach(key => {
const localKey = key;
if (finalJwtParams[localKey]) finalUrl.searchParams.append(localKey, finalJwtParams[localKey]);
});
this.finalURL = finalUrl;
}
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");
}
}
export { JwtHandler as default };