bitwarden-estensione-browser/apps/web/src/connectors/sso.ts

48 lines
1.4 KiB
TypeScript

import { getQsParam } from "./common";
require("./sso.scss");
document.addEventListener("DOMContentLoaded", () => {
const code = getQsParam("code");
const state = getQsParam("state");
if (state != null && state.includes(":clientId=browser")) {
initiateBrowserSso(code, state);
} else {
window.location.href = window.location.origin + "/#/sso?code=" + code + "&state=" + state;
// Match any characters between "_returnUri='" and the next "'"
const returnUri = extractFromRegex(state, "(?<=_returnUri=')(.*)(?=')");
if (returnUri) {
window.location.href = window.location.origin + `/#${returnUri}`;
} else {
window.location.href = window.location.origin + "/#/sso?code=" + code + "&state=" + state;
}
}
});
function initiateBrowserSso(code: string, state: string) {
window.postMessage({ command: "authResult", code: code, state: state }, "*");
const handOffMessage = ("; " + document.cookie)
.split("; ssoHandOffMessage=")
.pop()
.split(";")
.shift();
document.cookie = "ssoHandOffMessage=;SameSite=strict;max-age=0";
const content = document.getElementById("content");
content.innerHTML = "";
const p = document.createElement("p");
p.innerText = handOffMessage;
content.appendChild(p);
}
function extractFromRegex(s: string, regexString: string) {
const regex = new RegExp(regexString);
const results = regex.exec(s);
if (!results) {
return null;
}
return results[0];
}