@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) • 20 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/facebook/index.js", "../../../src/consts.js", "../../../src/class/OAuth2Client.js", "../../../src/class/OAuth2Account.js", "../../../src/tools.js", "../../../src/facebook/FacebookAccount.js", "../../../src/facebook/FacebookGrant.js", "../../../src/errors.js", "../../../src/class/OAuth2Grant.js"],
"sourcesContent": ["import { OAuth2Client } from \"../class/OAuth2Client\";\r\nimport { FacebookAccount } from \"./FacebookAccount\";\r\nimport { FacebookGrant } from \"./FacebookGrant\";\r\n\r\n\r\nexport const createFacebookOAuth2 = (options={})=>new OAuth2Client(FacebookGrant, options);\r\nexport default createFacebookOAuth2;\r\n\r\nexport {\r\n FacebookAccount,\r\n FacebookGrant\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 { 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 { OAuth2Account } from \"../class/OAuth2Account\";\r\nimport { vault } from \"../consts\";\r\n\r\n\r\nexport class FacebookAccount extends OAuth2Account {\r\n\r\n async profile(fields = [\"id\", \"name\", \"email\", \"picture\"]) {\r\n const grant = vault.get(this.client);\r\n const { access_token } = this.credentials;\r\n\r\n return grant.fetchApi(`/me`, {\r\n access_token,\r\n fields: fields.join(\",\")\r\n }, 3);\r\n }\r\n\r\n async tokens() {\r\n return this.credentials;\r\n }\r\n\r\n async scopes() {\r\n const grant = vault.get(this.client);\r\n const { access_token } = this.credentials;\r\n\r\n const { data } = await grant.fetchApi(\"/me/permisssions\", {\r\n access_token\r\n }, 3);\r\n\r\n // /me/permissions vrac\u00ED [{permission, status}, \u2026]\r\n return super.scopes(data.filter(p => p.status === \"granted\").map(p => p.permission));\r\n }\r\n\r\n}", "import fetch from \"node-fetch\";\r\nimport { OAuth2Grant } from \"../class/OAuth2Grant\";\r\nimport { extendURL, validateStr } from \"../tools\";\r\nimport { RedirectError } from \"../errors\";\r\nimport { FacebookAccount } from \"./FacebookAccount\";\r\n\r\n\r\n\r\nexport class FacebookGrant extends OAuth2Grant {\r\n\r\n static name = \"facebook\";\r\n static uidKey = \"id\";\r\n static scopePrefix = \"\";\r\n static scopesCommon = [];\r\n static scopesNoPrefix = [];\r\n static Account = FacebookAccount;\r\n\r\n constructor(client, opt = {}) {\r\n super(client, opt);\r\n\r\n this.apiVersion = validateStr(true, opt.apiVersion, \"options.apiVersion\");\r\n }\r\n\r\n createApiUrl(subdomain, path, query={}) {\r\n const { apiVersion } = this;\r\n return extendURL(\r\n `https://${subdomain}.facebook.com/${apiVersion}${path}`,\r\n query\r\n );\r\n }\r\n\r\n async fetchApi(path, query, errorCode = 2) {\r\n const url = this.createApiUrl(\"graph\", path, query);\r\n const res = await fetch(url);\r\n if (!res.ok) { throw new RedirectError(errorCode, await res.text()); }\r\n return res.json();\r\n }\r\n\r\n generateAuthUrl(scope, state, extra) {\r\n const { clientId, redirectUri } = this;\r\n\r\n return this.createApiUrl(\"www\", `/dialog/oauth`, {\r\n ...extra,\r\n response_type: \"code\",\r\n client_id: clientId,\r\n redirect_uri: redirectUri,\r\n scope: scope.join(\",\"), // FB odd\u011Bluje \u010D\u00E1rkou\r\n state\r\n });\r\n }\r\n\r\n async swapCodeForTokens(code) {\r\n const { clientId, clientSecret, redirectUri } = this;\r\n\r\n return this.fetchApi(`/oauth/access_token`, {\r\n client_id: clientId,\r\n client_secret: clientSecret,\r\n redirect_uri: redirectUri,\r\n code\r\n });\r\n\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", "fetch"]
}