UNPKG

@looker/sdk-rtl

Version:
180 lines 7.98 kB
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