test-mitid-integrator
Version:
Utility for handling communication with MitID broker via client-side JavaScript
128 lines (109 loc) • 3.65 kB
text/typescript
/**
* Represents a MitID Integrator that provides methods for interacting with the MitID broker.
*
* Key concepts:
* - Allow the client to interact with the MitID broker using a popup window.
* - Connect to the MitID broker using the provided environment variables.
* - Provide a callback function to handle the authentication code received from the broker.
* - Maintain the connection to the client's windown instance and enable it to consume the data through the message event.
*
* Prerequisites:
* - The client must have the environment variables for the MitID broker.
* - The client must have a callback function to handle the authentication code.
* - The client must have a window instance to consume the data through the message event.
*
* @class MitIDIntegrator
* @constructor
* @param {Object} env - The environment variables for the MitID broker.
* @returns {MitIDIntegrator} - The MitIDIntegrator instance.
*
* @example
* const env = {
* BROKER_DOMAIN: "https://mitid-broker.com",
* BROKER_CLIENTID: "client-id",
* REDIRECT_URI: "https://client.com/callback"
* };
* const mitIDIntegrator = new MitIDIntegrator(env);
*/
class MitIDIntegrator {
domain: string;
clientId: string;
redirectUri: string;
windowInstance: Window | undefined = undefined;
width = 600;
height = 700;
top = this.windowInstance
? this.windowInstance.outerHeight / 2 +
this.windowInstance.screenY -
this.height / 2
: 100;
left = this.windowInstance
? this.windowInstance.outerWidth / 2 +
this.windowInstance.screenX -
this.width / 2
: 100;
popupConfig = {
toolbar: "no",
location: "no",
directories: "no",
status: "no",
menubar: "no",
scrollbars: "no",
resizable: "no",
copyhistory: "no",
width: this.width,
height: this.height,
top: this.top,
left: this.left,
};
popupWindow: Window | null = null;
constructor(env: {
BROKER_DOMAIN: string;
BROKER_CLIENTID: string;
REDIRECT_URI: string;
}) {
this.domain = env.BROKER_DOMAIN;
this.clientId = env.BROKER_CLIENTID;
this.redirectUri = env.REDIRECT_URI;
this.windowInstance = typeof window !== "undefined" ? window : undefined;
}
openPopup(callback: Function) {
const endpoint = `${this.domain}/connect/authorize`;
const params = {
idp_values: "mitid",
scope: "openid mitid",
response_type: "code",
client_id: this.clientId,
redirect_uri: this.redirectUri,
};
const queryParams = Object.entries(params)
.map(([key, value]) => `${key}=${value}`)
.join("&");
const url = `${endpoint}?${queryParams}`;
if (this.popupWindow) {
this.popupWindow.close();
}
const popupParams = Object.entries(this.popupConfig)
.map(([key, value]) => `${key}=${value}`)
.join(",");
this.popupWindow = this.windowInstance
? this.windowInstance.open(url, "login", popupParams)
: null;
if (this.popupWindow) {
this.popupWindow.focus();
}
let authCode: string | null = null;
this.windowInstance?.addEventListener("message", (event) => {
if (event.source === this.popupWindow) {
console.log("Received message from popup:", event.data);
if (event.data.action === "Success") {
authCode = event.data.code;
}
if (event.data.action === "ClosePopUp") {
authCode && callback(authCode);
}
}
});
}
}
module.exports = MitIDIntegrator;