@toruslabs/customauth
Version:
CustomAuth login with torus to get user private key
144 lines (140 loc) • 5.04 kB
JavaScript
;
var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
var base64url = require('base64url');
var deepmerge = require('deepmerge');
var enums = require('../utils/enums.js');
var helpers = require('../utils/helpers.js');
var loglevel = require('../utils/loglevel.js');
var PopupHandler = require('../utils/PopupHandler.js');
var AbstractLoginHandler = require('./AbstractLoginHandler.js');
const _excluded = ["event", "origin", "result"];
class TelegramHandler extends AbstractLoginHandler {
constructor(params) {
super(params);
_defineProperty(this, "RESPONSE_TYPE", "token");
_defineProperty(this, "SCOPE", "profile");
_defineProperty(this, "PROMPT", "select_account");
this.setFinalUrl();
}
setFinalUrl() {
const {
domain
} = this.params.jwtParams;
const finalUrl = helpers.validateAndConstructUrl(domain || "https://oauth.telegram.org/auth");
const clonedParams = JSON.parse(JSON.stringify(this.params.jwtParams || {}));
clonedParams.origin = `${this.params.redirect_uri}?state=${this.state}&nonce=${this.nonce}`;
const finalJwtParams = deepmerge({
state: this.state,
response_type: this.RESPONSE_TYPE,
bot_id: this.params.clientId,
prompt: this.PROMPT,
redirect_uri: `${this.params.redirect_uri}?state=${this.state}&nonce=${this.nonce}`,
scope: this.SCOPE,
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
} = params;
const userInfo = helpers.objectToAuthDataMap(idToken);
const {
photo_url: profileImage = "",
first_name = "",
last_name = "",
id
} = userInfo;
return {
email: "",
// Telegram does not provide email
name: `${first_name} ${last_name}`,
profileImage,
authConnectionId: this.params.authConnectionId,
userId: id.toString(),
authConnection: this.params.authConnection,
groupedAuthConnectionId: this.params.groupedAuthConnectionId
};
}
async handleLoginWindow(params) {
const authConnectionWindow = new PopupHandler.PopupHandler({
url: this.finalURL,
features: params.popupFeatures,
timeout: helpers.getTimeout(this.params.authConnection)
});
if (this.params.uxMode === enums.UX_MODE.REDIRECT) {
authConnectionWindow.redirect(params.locationReplaceOnRedirect);
} else {
return new Promise((resolve, reject) => {
const handleData = async ev => {
try {
const _ref = JSON.parse(ev) || {},
{
event,
origin,
result
} = _ref,
rest = _objectWithoutProperties(_ref, _excluded);
// 1. Parse URL
const parsedUrl = new URL(origin);
// 2. Get state param
const stateParam = parsedUrl.searchParams.get("state");
if (event && event === "auth_result") {
// properly resolve the data
resolve(_objectSpread(_objectSpread({
accessToken: ""
}, rest), {}, {
idToken: base64url.encode(JSON.stringify(result)) || "",
state: base64url.decode(stateParam)
}));
}
} catch (error) {
loglevel.error(error);
reject(error);
}
};
const postMessageEventHandler = async postMessageEvent => {
if (!postMessageEvent.data) {
throw new Error("Invalid data received");
}
if (this.finalURL.origin !== postMessageEvent.origin) {
throw new Error("Invalid origin received");
}
// make sure event is auth_result from telegram
const ev = postMessageEvent.data;
if (typeof ev != "string") {
throw new Error("Invalid data type received");
}
const {
event
} = JSON.parse(ev) || {};
if (event && event !== "auth_result") {
loglevel.info("Invalid event received");
}
window.removeEventListener("message", postMessageEventHandler);
handleData(ev);
authConnectionWindow.close();
};
window.addEventListener("message", postMessageEventHandler);
try {
authConnectionWindow.open();
} catch (error) {
loglevel.error(error);
reject(error);
return;
}
authConnectionWindow.once("close", () => {
reject(new Error("user closed popup"));
});
});
}
return null;
}
}
module.exports = TelegramHandler;