This commit is contained in:
48
assets/scripts/api-auth.js
Normal file
48
assets/scripts/api-auth.js
Normal file
@@ -0,0 +1,48 @@
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
const STORAGE_KEY = "orgBackendApiKey";
|
||||
const HEADER = "X-Org-Api-Key";
|
||||
|
||||
function getStoredKey() {
|
||||
return window.localStorage.getItem(STORAGE_KEY) || "";
|
||||
}
|
||||
|
||||
function requestKey() {
|
||||
const key = window.prompt("API key");
|
||||
if (key && key.trim()) {
|
||||
window.localStorage.setItem(STORAGE_KEY, key.trim());
|
||||
return key.trim();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
function authHeaders(existingHeaders = {}, options = {}) {
|
||||
const headers = new Headers(existingHeaders);
|
||||
let key = getStoredKey();
|
||||
if (!key && options.prompt !== false) {
|
||||
key = requestKey();
|
||||
}
|
||||
if (key) headers.set(HEADER, key);
|
||||
return headers;
|
||||
}
|
||||
|
||||
async function authFetch(input, options = {}) {
|
||||
const headers = authHeaders(options.headers, options);
|
||||
const response = await fetch(input, { ...options, headers });
|
||||
if (response.status !== 401) return response;
|
||||
|
||||
window.localStorage.removeItem(STORAGE_KEY);
|
||||
if (options.retry === false) return response;
|
||||
|
||||
const retryHeaders = authHeaders(options.headers, options);
|
||||
if (!retryHeaders.has(HEADER)) return response;
|
||||
return fetch(input, { ...options, headers: retryHeaders, retry: false });
|
||||
}
|
||||
|
||||
window.orgAuth = {
|
||||
fetch: authFetch,
|
||||
headers: authHeaders,
|
||||
clear: () => window.localStorage.removeItem(STORAGE_KEY),
|
||||
};
|
||||
})();
|
||||
Reference in New Issue
Block a user