{"version":3,"sources":["meteor://💻app/packages/google-oauth/google_server.js","meteor://💻app/packages/google-oauth/namespace.js"],"names":["_objectSpread","module","link","default","v","Google","Accounts","fetch","hasOwn","Object","prototype","hasOwnProperty","whitelistedFields","getServiceDataFromTokens","tokens","accessToken","idToken","scopesCall","Meteor","wrapAsync","getScopes","scopes","err","assign","Error","message","response","identityCall","getIdentity","identity","serviceData","scope","call","expiresAt","Date","now","parseInt","expiresIn","fields","create","forEach","name","refreshToken","options","profile","registerLoginHandler","request","googleSignIn","serverAuthCode","getTokens","code","result","updateOrCreateUserFromExternalService","id","userId","email","picture","imageUrl","query","callback","config","ServiceConfiguration","configurations","findOne","service","ConfigError","content","URLSearchParams","client_id","clientId","client_secret","OAuth","openSecret","secret","redirect_uri","_redirectUri","grant_type","method","headers","Accept","body","json","error","data","access_token","refresh_token","expires_in","id_token","undefined","getTokensCall","getServiceData","registerService","toString","e","reason","split","retrieveCredential","credentialToken","credentialSecret","exports"],"mappings":"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","file":"/packages/google-oauth.js","sourcesContent":["import Google from './namespace.js';\nimport { Accounts } from 'meteor/accounts-base';\nimport { fetch } from 'meteor/fetch';\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\n// https://developers.google.com/accounts/docs/OAuth2Login#userinfocall\nGoogle.whitelistedFields = ['id', 'email', 'verified_email', 'name', 'given_name',\n 'family_name', 'picture', 'locale', 'timezone', 'gender'];\n\nconst getServiceDataFromTokens = tokens => {\n const { accessToken, idToken } = tokens;\n const scopesCall = Meteor.wrapAsync(getScopes);\n let scopes;\n try {\n scopes = scopesCall(accessToken);\n } catch (err) {\n throw Object.assign(\n new Error(`Failed to fetch tokeninfo from Google. ${err.message}`),\n { response: err.response }\n );\n }\n const identityCall = Meteor.wrapAsync(getIdentity);\n let identity;\n try {\n identity = identityCall(accessToken);\n } catch (err) {\n throw Object.assign(\n new Error(`Failed to fetch identity from Google. ${err.message}`),\n { response: err.response }\n );\n }\n const serviceData = {\n accessToken,\n idToken,\n scope: scopes\n };\n\n if (hasOwn.call(tokens, \"expiresIn\")) {\n serviceData.expiresAt =\n Date.now() + 1000 * parseInt(tokens.expiresIn, 10);\n }\n\n const fields = Object.create(null);\n Google.whitelistedFields.forEach(function (name) {\n if (hasOwn.call(identity, name)) {\n fields[name] = identity[name];\n }\n });\n\n Object.assign(serviceData, fields);\n\n // only set the token in serviceData if it's there. this ensures\n // that we don't lose old ones (since we only get this on the first\n // log in attempt)\n if (tokens.refreshToken) {\n serviceData.refreshToken = tokens.refreshToken;\n }\n\n return {\n serviceData,\n options: {\n profile: {\n name: identity.name\n }\n }\n };\n};\n\nAccounts.registerLoginHandler(request => {\n if (request.googleSignIn !== true) {\n return;\n }\n\n const tokens = {\n accessToken: request.accessToken,\n refreshToken: request.refreshToken,\n idToken: request.idToken,\n };\n\n if (request.serverAuthCode) {\n Object.assign(tokens, getTokens({\n code: request.serverAuthCode\n }));\n }\n\n let result;\n try {\n result = getServiceDataFromTokens(tokens);\n } catch (err) {\n throw Object.assign(\n new Error(`Failed to complete OAuth handshake with Google. ${err.message}`),\n { response: err.response }\n );\n }\n\n return Accounts.updateOrCreateUserFromExternalService(\"google\", {\n id: request.userId,\n idToken: request.idToken,\n accessToken: request.accessToken,\n email: request.email,\n picture: request.imageUrl,\n ...result.serviceData,\n }, result.options);\n});\n\n// returns an object containing:\n// - accessToken\n// - expiresIn: lifetime of token in seconds\n// - refreshToken, if this is the first authorization request\nconst getTokens = async (query, callback) => {\n const config = ServiceConfiguration.configurations.findOne({service: 'google'});\n if (!config)\n throw new ServiceConfiguration.ConfigError();\n\n const content = new URLSearchParams({\n code: query.code,\n client_id: config.clientId,\n client_secret: OAuth.openSecret(config.secret),\n redirect_uri: OAuth._redirectUri('google', config),\n grant_type: 'authorization_code'\n });\n const request = await fetch(\n \"https://accounts.google.com/o/oauth2/token\", {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: content,\n });\n const response = await request.json();\n\n if (response.error) { // if the http response was a json object with an error attribute\n callback(response.error);\n throw new Meteor.Error(`Failed to complete OAuth handshake with Google. ${response.error}`);\n } else {\n const data = {\n accessToken: response.access_token,\n refreshToken: response.refresh_token,\n expiresIn: response.expires_in,\n idToken: response.id_token\n };\n callback(undefined, data);\n return data;\n }\n};\n\nconst getTokensCall = Meteor.wrapAsync(getTokens);\nconst getServiceData = query => getServiceDataFromTokens(getTokensCall(query));\n\nOAuth.registerService('google', 2, null, getServiceData);\n\nconst getIdentity = async (accessToken, callback) => {\n const content = new URLSearchParams({ access_token: accessToken });\n let response;\n try {\n const request = await fetch(\n `https://www.googleapis.com/oauth2/v1/userinfo?${content.toString()}`,\n {\n method: 'GET',\n headers: { Accept: 'application/json' }\n });\n response = await request.json();\n } catch (e) {\n callback(e);\n throw new Meteor.Error(e.reason);\n }\n callback(undefined, response);\n return response;\n};\n\nconst getScopes = async (accessToken, callback) => {\n const content = new URLSearchParams({ access_token: accessToken });\n let response;\n try {\n const request = await fetch(\n `https://www.googleapis.com/oauth2/v1/tokeninfo?${content.toString()}`,\n {\n method: 'GET',\n headers: { Accept: 'application/json' }\n });\n response = await request.json();\n } catch (e) {\n callback(e);\n throw new Meteor.Error(e.reason);\n }\n callback(undefined, response.scope.split(' '));\n return response.scope.split(' ');\n};\n\nGoogle.retrieveCredential = (credentialToken, credentialSecret) =>\n OAuth.retrieveCredential(credentialToken, credentialSecret);\n","// The module.exports object of this module becomes the Google namespace\n// for other modules in this package.\nGoogle = module.exports;\n\n// So that api.export finds the \"Google\" property.\nGoogle.Google = Google;\n"]}