UNPKG

@randajan/oauth2-client

Version:

Lightweight Node.js helper that streamlines OAuth 2.0 and service-account authentication for all Google APIs, giving downstream packages hassle-free token acquisition and refresh

8 lines (7 loc) 19.6 kB
{ "version": 3, "sources": ["../../../src/google/index.js", "../../../src/consts.js", "../../../src/class/OAuth2Client.js", "../../../src/google/GoogleAccount.js", "../../../src/class/OAuth2Account.js", "../../../src/tools.js", "../../../src/google/GoogleGrant.js", "../../../src/errors.js", "../../../src/class/OAuth2Grant.js"], "sourcesContent": ["import { OAuth2Client } from \"../class/OAuth2Client\";\r\nimport { GoogleAccount } from \"./GoogleAccount\";\r\nimport { GoogleGrant } from \"./GoogleGrant\";\r\n\r\n\r\nexport const createGoogleOAuth2 = (options={})=>new OAuth2Client(GoogleGrant, options);\r\nexport default createGoogleOAuth2;\r\n\r\nexport {\r\n GoogleAccount,\r\n GoogleGrant\r\n}", "\r\n\r\nexport const vault = new WeakMap();", "import { vault } from \"../consts\";\r\nimport { virtuals } from \"@randajan/props\";\r\n\r\n\r\nexport class OAuth2Client {\r\n\r\n constructor(Grant, options={}) {\r\n const grant = new Grant(this, options);\r\n\r\n virtuals(this, {\r\n name:_=>grant.name,\r\n uidKey:_=>grant.uidKey\r\n })\r\n\r\n vault.set(this, grant);\r\n }\r\n\r\n account(credentials, ...args) {\r\n const grant = vault.get(this);\r\n const c = grant.getCredentials ? grant.getCredentials(credentials, ...args) : credentials;\r\n return (c instanceof Promise) ? c.then(cr => grant.createAccount(cr)) : grant.createAccount(c);\r\n }\r\n\r\n getInitAuthURL(options = {}) {\r\n const grant = vault.get(this);\r\n try { return grant.getInitAuthURL(options); }\r\n catch (err) { return grant.fallbackRedirect(1, err); }\r\n }\r\n\r\n getExitAuthURL({ code, state }, context) {\r\n const grant = vault.get(this);\r\n try { return grant.getExitAuthURL({ code, state }, context); }\r\n catch (err) { return grant.fallbackRedirect(2, err); }\r\n }\r\n\r\n}", "import { google } from \"googleapis\";\r\nimport { solids } from \"@randajan/props\";\r\n\r\nimport { OAuth2Account } from \"../class/OAuth2Account\";\r\nimport { vault } from \"../consts\";\r\n\r\n\r\n\r\nexport class GoogleAccount extends OAuth2Account {\r\n\r\n constructor(client, credentials={}) {\r\n super(client, credentials);\r\n\r\n const grant = vault.get(client);\r\n\r\n const auth = grant.createAuth();\r\n auth.setCredentials(this.credentials);\r\n auth.on('tokens', _=>{ grant.onRenew(this); });\r\n\r\n solids(this, {\r\n auth,\r\n });\r\n\r\n }\r\n\r\n oauth2() {\r\n return google.oauth2({ auth: this.auth, version: 'v2' });\r\n }\r\n\r\n async profile() {\r\n const { data } = await this.oauth2().userinfo.get();\r\n return data;\r\n }\r\n\r\n async tokens() {\r\n const { token } = await this.auth.getAccessToken();\r\n return { ...this.auth.credentials, access_token: token };\r\n }\r\n\r\n async scopes() {\r\n const { auth } = this;\r\n \r\n if (auth.credentials?.scope) { return super.scopes(auth.credentials.scope); }\r\n\r\n const { token } = await auth.getAccessToken();\r\n if (!token) { return []; }\r\n\r\n const info = await auth.getTokenInfo(token);\r\n if (!info) { return []; }\r\n\r\n return super.scopes(info.scopes);\r\n }\r\n\r\n}", "import { solids } from \"@randajan/props\";\r\nimport { vault } from \"../consts\";\r\nimport { formatCredentials } from \"../tools\";\r\n\r\n\r\n\r\n\r\nexport class OAuth2Account {\r\n\r\n constructor(client, credentials={}) {\r\n\r\n credentials = formatCredentials(credentials);\r\n\r\n solids(this, {\r\n client,\r\n credentials\r\n }, false);\r\n }\r\n\r\n async uid() {\r\n const profile = await this.profile();\r\n const { name, uidKey } = this.client;\r\n const id = profile?.[uidKey];\r\n if (id) { return `${name}:${id}`; }\r\n }\r\n\r\n async profile() {\r\n return {};\r\n }\r\n\r\n async tokens() {\r\n return {};\r\n }\r\n\r\n async scopes(scopes) {\r\n const grant = vault.get(this.client);\r\n return grant.effaceScopes(scopes);\r\n }\r\n\r\n}", "\r\nexport const sliceMap = (arr, size, callback) => {\r\n size = Math.max(1, size) || 1;\r\n const r = [];\r\n if (!Array.isArray(arr)) { return r; }\r\n for (let k = 0; k < arr.length; k += size) {\r\n r.push(callback(arr.slice(k, k + size), r.length, size, arr.length));\r\n }\r\n return r;\r\n}\r\n\r\nexport const extendURL = (url, query = {}) => {\r\n const u = new URL(url);\r\n for (let i in query) {\r\n if (query[i] != null) { u.searchParams.append(i, query[i]); }\r\n }\r\n return u.toString();\r\n}\r\n\r\n\r\nexport const isValidURL = str => {\r\n try { new URL(str); } catch (e) { return false; }\r\n return true;\r\n}\r\n\r\nexport const validateURL = (required, url, errProp) => {\r\n if (!url && !required) { return; }\r\n if (isValidURL(url)) { return url; }\r\n throw new Error(`${errProp} is not a valid URL`);\r\n}\r\n\r\nexport const validateFn = (required, fn, errProp) => {\r\n if (!fn && !required) { return; }\r\n if (typeof fn === \"function\") { return fn; }\r\n throw new Error(`${errProp} is not a valid function`);\r\n}\r\n\r\nexport const validateStr = (required, str, errProp) => {\r\n if (!str && !required) { return; }\r\n if (typeof str === \"string\") { return str; }\r\n throw new Error(`${errProp} is not a valid string`);\r\n}\r\n\r\n\r\nexport const formatCredentials = (credentials={}) => {\r\n const c = {...credentials};\r\n\r\n if (c.expires_in && !c.expiry_date) {\r\n c.expiry_date = Date.now() + c.expires_in * 1000;\r\n }\r\n\r\n if (c.refresh_token && !c.expiry_date) {\r\n throw new Error(`OAuth2 credentials 'refresh_token' must be provided with 'expiry_date'`);\r\n }\r\n\r\n if (!c.access_token && !c.refresh_token) {\r\n throw new Error(`OAuth2 credentials 'access_token' of 'refresh_token' must be provided`);\r\n }\r\n\r\n return c;\r\n}\r\n\r\n\r\nexport const strToBase64 = str => Buffer.from(str, 'utf8').toString('base64');\r\nexport const strFromBase64 = strEncoded => Buffer.from(strEncoded, 'base64').toString('utf8');\r\n\r\nexport const objToBase64 = obj => strToBase64(JSON.stringify(obj));\r\nexport const objFromBase64 = objEncoded => JSON.parse(strFromBase64(objEncoded));", "import { google } from \"googleapis\";\r\nimport { OAuth2Grant } from \"../class/OAuth2Grant\";\r\nimport { GoogleAccount } from \"./GoogleAccount\";\r\n\r\nexport class GoogleGrant extends OAuth2Grant {\r\n\r\n static name=\"google\";\r\n static uidKey=\"id\";\r\n static scopePrefix=\"https://www.googleapis.com/auth/\";\r\n static scopesCommon=[\"openid\", \"userinfo.profile\", \"userinfo.email\"];\r\n static scopesNoPrefix=[\"openid\"];\r\n static Account = GoogleAccount;\r\n\r\n constructor(client, opt={}) {\r\n super(client, opt);\r\n\r\n const { optExtra, clientId, clientSecret, redirectUri } = this;\r\n\r\n this.optAuth = { ...optExtra, clientId, clientSecret, redirectUri };\r\n this.auth = this.createAuth();\r\n }\r\n\r\n createAuth() {\r\n return new google.auth.OAuth2(this.optAuth);\r\n }\r\n\r\n generateAuthUrl(scope, state, extra) {\r\n return this.auth.generateAuthUrl({\r\n ...extra,\r\n access_type: this.isOffline ? \"offline\" : \"online\",\r\n scope,\r\n state\r\n });\r\n }\r\n\r\n async swapCodeForTokens(code) {\r\n const { tokens } = await this.auth.getToken(code);\r\n return tokens;\r\n }\r\n\r\n}", "\r\n\r\n\r\n\r\nexport class RedirectError extends Error {\r\n\r\n static is(any) {\r\n return any instanceof RedirectError;\r\n }\r\n\r\n constructor(code, message, options) {\r\n super(message, options);\r\n this.code = code;\r\n }\r\n}", "import { RedirectError } from \"../errors\";\r\nimport { extendURL, isValidURL, objFromBase64, objToBase64, validateFn, validateURL } from \"../tools\";\r\nimport { OAuth2Account } from \"./OAuth2Account\";\r\n\r\nexport class OAuth2Grant {\r\n\r\n static name=\"\";\r\n static uidKey=\"\";\r\n static scopePrefix=\"\";\r\n static scopesCommon=[];\r\n static scopesNoPrefix=[];\r\n static Account = OAuth2Account;\r\n\r\n constructor(client, opt={}) {\r\n const { name, uidKey, scopesCommon } = this.constructor;\r\n\r\n this.client = client;\r\n this.name = opt.name || name;\r\n this.uidKey = opt.uidKey || uidKey;\r\n\r\n this.isOffline = !!opt.isOffline;\r\n this.clientId = opt.clientId;\r\n this.clientSecret = opt.clientSecret;\r\n\r\n this.redirectUri = validateURL(true, opt.redirectUri, \"options.redirectUri\");\r\n this.fallbackUri = validateURL(true, opt.fallbackUri, \"options.fallbackUri\");\r\n this.landingUri = validateURL(false, opt.landingUri, \"options.landingUri\");\r\n\r\n this.onAuth = validateFn(true, opt.onAuth, \"options.onAuth\");\r\n this.onRenew = validateFn(true, opt.onRenew, \"options.onRenew\");\r\n this.getCredentials = validateFn(false, opt.getCredentials, \"options.getCredentials\");\r\n this.optExtra = (opt.extra || {});\r\n \r\n this.scopesRequired = this.effaceScopes([...scopesCommon, ...(opt.scopes || [])]);\r\n }\r\n\r\n createAccount(credentials) {\r\n const { client, constructor:{ Account } } = this;\r\n return new Account(client, credentials);\r\n }\r\n\r\n effaceScope(scope, withPrefix=false) {\r\n const { scopePrefix, scopesNoPrefix } = this.constructor;\r\n\r\n if (scope == null) { return; }\r\n scope = String(scope).replace(/[\\s\\n\\r]+/g, \" \").trim().toLowerCase();\r\n if (!scopePrefix || scopesNoPrefix.includes(scope)) { return scope; }\r\n const sw = scope.startsWith(scopePrefix);\r\n return (sw === withPrefix) ? scope : (withPrefix ? (scopePrefix+scope) : scope.substring(scopePrefix.length));\r\n }\r\n\r\n effaceScopes(scopes, withPrefix=false, withRequired=false) {\r\n const { scopesRequired } = this;\r\n\r\n if (typeof scopes === \"string\") { scopes = scopes.split(\" \"); }\r\n if (!Array.isArray(scopes)) { scopes = []; }\r\n if (withRequired) { scopes = scopes.concat(scopesRequired); }\r\n\r\n const r = new Set();\r\n for (let scope of scopes) {\r\n if (scope) { scope = this.effaceScope(scope, withPrefix); }\r\n if (scope) { r.add(scope); }\r\n }\r\n return [...r];\r\n }\r\n\r\n generateAuthUrl(scope, state, extra={}) {\r\n\r\n }\r\n\r\n getInitAuthURL(options={}) {\r\n const { landingUri, state:stateObj, scopes, extra } = options;\r\n\r\n if ((landingUri || !this.landingUri) && !isValidURL(landingUri)) {\r\n throw new RedirectError(1, \"Bad request. Missing valid 'landingUri'\");\r\n }\r\n\r\n const scope = this.effaceScopes(scopes, true, true);\r\n const state = objToBase64([ landingUri || this.landingUri, stateObj ]);\r\n\r\n return this.generateAuthUrl(scope, state, extra || {});\r\n }\r\n\r\n async swapCodeForTokens(code) {\r\n\r\n }\r\n\r\n async getExitAuthURL({code, state}, context) {\r\n if (!code) { throw new RedirectError(201, \"Bad request. Missing 'code'\"); }\r\n\r\n const [ landingUri, stateObj ] = objFromBase64(state);\r\n if (!isValidURL(landingUri)) { throw new RedirectError(202, \"Bad request. Missing valid 'state'\"); }\r\n\r\n const tokens = await this.swapCodeForTokens(code);\r\n const account = this.createAccount(tokens);\r\n \r\n const customUri = await this.onAuth(account, { context, landingUri, state:stateObj });\r\n return customUri || landingUri;\r\n }\r\n \r\n fallbackRedirect(majorCode, err) {\r\n const c = RedirectError.is(err) ? err.code : 0;\r\n return extendURL(this.fallbackUri, {errorCode:majorCode*100+c, errorMessage:err.message});\r\n }\r\n\r\n}"], "mappings": "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", "names": ["import_props", "import_props", "import_googleapis"] }