keycloak.js

248 lines | 8.857 kB Blame History Raw Download
window.Keycloak = (function () {
    var queryParameters = function (name) {
        var parameters = window.location.search.substring(1).split("&");
        for (var i = 0; i < parameters.length; i++) {
            var param = parameters[i].split("=");
            if (decodeURIComponent(param[0]) == name) {
                return decodeURIComponent(param[1]);
            }
        }
    };

    var messageError = queryParameters("error");
    var messageInfo = queryParameters("info");

    var keycloak = {
        appKey: queryParameters("app"),
        token: queryParameters("token"),
        baseUrl: "/ejs-identity",
        get loginUrl() {
            return this.baseUrl + "/api/login/" + this.appKey;
        },
        get registerUrl() {
            return this.baseUrl + "/api/register/" + this.appKey;
        },
        get userInfoUrl() {
            return this.baseUrl + "/api/auth/userinfo?appKey=" + this.appKey;
        }
    };

    keycloak.getConfig = function (success, error) {
        var req = new XMLHttpRequest();
        req.open("GET", keycloak.loginUrl);
        req.setRequestHeader("Accept", "application/json");
        req.onreadystatechange = function () {
            if (req.readyState == 4) {
                if (req.status == 200) {
                    var config = JSON.parse(req.responseText);
                    if (success) {
                        success(config);
                    }
                } else {
                    if (error) {
                        error(req.status);
                    }
                }
            }
        };
        req.send();
    };

    keycloak.getUser = function (success, error) {
        var req = new XMLHttpRequest();
        req.open("GET", keycloak.userInfoUrl + "&token=" + keycloak.token);
        req.setRequestHeader("Accept", "application/json");
        req.onreadystatechange = function () {
            if (req.readyState == 4) {
                if (req.status == 200) {
                    var user = JSON.parse(req.responseText);
                    if (success) {
                        success(user);
                    }
                } else {
                    if (error) {
                        error(req.status);
                    }
                }
            }
        };
        req.send();
    };

    var createLogin = function(containerId) {
        var login = document.createElement("div");
        login.setAttribute("class", "keycloak-login");

        var container = document.getElementById(containerId);
        container.setAttribute("class", "keycloak-login-container");
        container.innerHTML = null;
        container.appendChild(login);

        return login;
    };

    var createHeader = function(text) {
        var div = document.createElement("div");
        div.setAttribute("class", "keycloak-login-header");

        var h = document.createElement("h1");
        h.textContent = text;
        div.appendChild(h);

        return div;
    };

    var createInput = function(group, name, labelText, type) {
        var div = document.createElement("div");
        div.setAttribute("class", "keycloak-login-" + group + "-" + name);

        var label = document.createElement("label");
        label.setAttribute("for", name);
        label.textContent = labelText;
        div.appendChild(label);

        var input = document.createElement("input");
        input.setAttribute("name", name);
        if (type) {
            input.setAttribute("type", type);
        } else {
            input.setAttribute("type", "text");
        }
        div.appendChild(input);

        return div;
    };

    var createMessage = function(message, type) {
        var div = document.createElement("div");
        div.setAttribute("class", "keycloak-login-message-" + type);

        if (message == "login_failed") {
            div.textContent = "Failed to login";
        } else if (message == "register_failed") {
            div.textContent = "Failed to register user";
        } else if (message = "register_created") {
            div.textContent = "Created user";
        } else {
            div.textContent = message;
        }

        return div;
    };

    keycloak.renderLoginForm = function (containerId) {
        var success = function (config) {
            var login = createLogin(containerId);

            login.appendChild(createHeader("Login to " + config.name));

            if (messageError) {
                login.appendChild(createMessage(messageError, "warn"));
            }

            if (messageInfo) {
                login.appendChild(createMessage(messageInfo, "info"));
            }

            var standardLogin = document.createElement("div");
            standardLogin.setAttribute("class", "keycloak-login-standard");
            login.appendChild(standardLogin);

            var form = document.createElement("form");
            form.setAttribute("action", keycloak.loginUrl);
            form.setAttribute("method", "post");
            standardLogin.appendChild(form);

            form.appendChild(createInput("standard", "username", "Username"));
            form.appendChild(createInput("standard", "password", "Password", "password"));

            var buttonsDiv = document.createElement("div");
            buttonsDiv.setAttribute("class", "keycloak-login-buttons");
            form.appendChild(buttonsDiv);

            var submitButton = document.createElement("button");
            submitButton.setAttribute("type", "submit");
            submitButton.textContent = "Login";
            buttonsDiv.appendChild(submitButton);

            var registerButton = document.createElement("button");
            registerButton.setAttribute("type", "button");
            registerButton.setAttribute("onclick", "location.href='" + keycloak.registerUrl + "'");
            registerButton.textContent = "Register";
            buttonsDiv.appendChild(registerButton);
            
            var cancelButton = document.createElement("button");
            cancelButton.setAttribute("type", "button");
            cancelButton.setAttribute("onclick", "location.href='" + config.callbackUrl + "'");
            cancelButton.textContent = "Cancel";
            buttonsDiv.appendChild(cancelButton);

            var socialLogin = document.createElement("div");
            socialLogin.setAttribute("class", "keycloak-login-social");
            login.appendChild(socialLogin);

            for (var i = 0; i < config.providerConfigs.length; i++) {
                var provider = config.providerConfigs[i];

                var providerLink = document.createElement("a");
                providerLink.setAttribute("href", provider.loginUri);
                socialLogin.appendChild(providerLink);

                var providerImage = document.createElement("img");
                providerImage.setAttribute("src", provider.icon);
                providerLink.appendChild(providerImage);
            }
        };

        var error = function() {
            var login = createLogin(containerId);

            login.appendChild(createHeader("Invalid"));
            login.appendChild(createMessage("Invalid application key", "warn"));
        };

        keycloak.getConfig(success, error);
    };

    keycloak.renderRegistrationForm = function (containerId) {
        var login = createLogin(containerId);

        var success = function (config) {
            login.appendChild(createHeader("Register with " + config.name));

            if (messageError) {
                login.appendChild(createMessage(messageError, "warn"));
            }

            var form = document.createElement("form");
            form.setAttribute("action", keycloak.registerUrl);
            form.setAttribute("method", "post");
            login.appendChild(form);

            form.appendChild(createInput("register", "username", "Username"));
            form.appendChild(createInput("register", "email", "Email", "email"));
            form.appendChild(createInput("register", "firstName", "First name"));
            form.appendChild(createInput("register", "lastName", "Last name"));
            form.appendChild(createInput("register", "password", "Password", "password"));

            var buttonsDiv = document.createElement("div");
            buttonsDiv.setAttribute("class", "keycloak-login-buttons");
            form.appendChild(buttonsDiv);

            var submitButton = document.createElement("button");
            submitButton.setAttribute("type", "submit");
            submitButton.textContent = "Register";
            buttonsDiv.appendChild(submitButton);

            var cancelButton = document.createElement("button");
            cancelButton.setAttribute("type", "button");
            cancelButton.setAttribute("onclick", "location.href='" + keycloak.loginUrl + "'");
            cancelButton.textContent = "Cancel";
            buttonsDiv.appendChild(cancelButton);
        };

        keycloak.getConfig(success);
    };

    return keycloak;
}());