@looker/sdk-rtl
Version:
Looker SDK Runtime Library
180 lines • 7.98 kB
JavaScript
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
import { AuthSession } from './authSession';
import { agentPrefix, sdkError } from './transport';
import { AuthToken } from './authToken';
export class OAuthSession extends AuthSession {
constructor(services) {
super(services.settings, services.transport);
_defineProperty(this, "activeToken", new AuthToken());
_defineProperty(this, "crypto", void 0);
_defineProperty(this, "reentry", false);
this.crypto = services.crypto;
var keys = ['client_id', 'redirect_uri', 'base_url', 'looker_url'];
var config = _objectSpread(_objectSpread({}, this.settings), this.settings.readConfig());
keys.forEach(key => {
var value = config[key];
if (!value) {
throw sdkError({
message: "Missing required configuration setting: '".concat(key, "'")
});
}
});
}
readConfig() {
return _objectSpread(_objectSpread({}, this.settings), this.settings.readConfig());
}
authenticate(props) {
var _this = this;
return _asyncToGenerator(function* () {
var token = yield _this.getToken();
if (token.access_token) {
props.headers.Authorization = "Bearer ".concat(token.access_token);
}
return props;
})();
}
get code_verifier() {
return sessionStorage.getItem(OAuthSession.codeVerifierKey);
}
set code_verifier(value) {
if (value === null) {
sessionStorage.removeItem(OAuthSession.codeVerifierKey);
} else {
sessionStorage.setItem(OAuthSession.codeVerifierKey, value);
}
}
get returnUrl() {
return sessionStorage.getItem(OAuthSession.returnUrlKey);
}
set returnUrl(value) {
if (!value) {
sessionStorage.removeItem(OAuthSession.returnUrlKey);
} else {
sessionStorage.setItem(OAuthSession.returnUrlKey, value);
}
}
clearStorage() {
sessionStorage.removeItem(OAuthSession.codeVerifierKey);
sessionStorage.removeItem(OAuthSession.returnUrlKey);
}
login(_sudoId) {
var _this2 = this;
return _asyncToGenerator(function* () {
if (!_this2.isAuthenticated()) {
if (_this2.reentry) {} else if (!_this2.returnUrl) {
var authUrl = yield _this2.createAuthCodeRequestUrl('cors_api', agentPrefix);
var returnTo = window.location.pathname + window.location.search;
_this2.returnUrl = returnTo;
window.location.href = authUrl;
} else {
_this2.reentry = true;
_this2.returnUrl = null;
if (!_this2.code_verifier) {
return Promise.reject(new Error('OAuth failed: expected code_verifier to be stored'));
}
var params = new URLSearchParams(window.location.search);
var code = params.get('code');
if (!code) {
return Promise.reject(new Error("OAuth failed: no OAuth code parameter found in ".concat(window.location.pathname + window.location.search)));
}
yield _this2.redeemAuthCode(code);
}
return yield _this2.getToken();
}
return _this2.activeToken;
})();
}
requestToken(body) {
var _this3 = this;
return _asyncToGenerator(function* () {
var config = _this3.readConfig();
var url = new URL(config.base_url);
url.pathname = '/api/token';
var token = yield _this3.ok(_this3.transport.request('POST', url.toString(), undefined, body));
return _this3.activeToken.setToken(token);
})();
}
createAuthCodeRequestUrl(scope, state) {
var _this4 = this;
return _asyncToGenerator(function* () {
var verifier = _this4.crypto.secureRandom(33);
_this4.code_verifier = verifier;
var code_challenge = yield _this4.crypto.sha256Hash(verifier);
var config = _this4.readConfig();
var params = {
client_id: config.client_id,
code_challenge,
code_challenge_method: 'S256',
redirect_uri: config.redirect_uri,
response_type: 'code',
scope,
state
};
var url = new URL(config.looker_url);
url.pathname = '/auth';
url.search = new URLSearchParams(params).toString();
return url.toString();
})();
}
redeemAuthCodeBody(authCode, codeVerifier) {
var verifier = codeVerifier || this.code_verifier || '';
var config = this.readConfig();
return {
client_id: config.client_id,
code: authCode,
code_verifier: verifier,
grant_type: 'authorization_code',
redirect_uri: config.redirect_uri
};
}
redeemAuthCode(authCode, codeVerifier) {
var _this5 = this;
return _asyncToGenerator(function* () {
return _this5.requestToken(_this5.redeemAuthCodeBody(authCode, codeVerifier));
})();
}
getToken() {
var _this6 = this;
return _asyncToGenerator(function* () {
if (!_this6.isAuthenticated()) {
if (_this6.activeToken.refresh_token) {
var config = _this6.readConfig();
yield _this6.requestToken({
client_id: config.client_id,
grant_type: 'refresh_token',
redirect_uri: config.redirect_uri,
refresh_token: _this6.activeToken.refresh_token
});
}
}
return _this6.activeToken;
})();
}
isAuthenticated() {
return this.activeToken.isActive();
}
logout() {
var _this7 = this;
return _asyncToGenerator(function* () {
if (_this7.activeToken.access_token) {
yield _this7.ok(_this7.transport.request('DELETE', "/api/logout", undefined, undefined, init => {
init.headers.Authorization = "Bearer ".concat(_this7.activeToken.access_token);
return init;
}));
_this7.activeToken = new AuthToken();
_this7.clearStorage();
return true;
}
return false;
})();
}
}
_defineProperty(OAuthSession, "codeVerifierKey", 'looker_oauth_code_verifier');
_defineProperty(OAuthSession, "returnUrlKey", 'looker_oauth_return_url');
//# sourceMappingURL=oauthSession.js.map