UNPKG

cordova-google-oauth2

Version:
136 lines (105 loc) 3.72 kB
const googleScript = document.createElement('script'); googleScript.src = 'https://apis.google.com/js/client.js'; googleScript.async = 'async'; googleScript.defer = 'defer'; googleScript.onload = () => { googleScript.onload = null; }; document.body.appendChild(googleScript); /** * Try to get gapi * @returns {Promise} */ function getGapi() { let maxTryCount = 50; return new Promise((resolve, reject) => { if (window.gapi && window.gapi.auth) { return resolve(window.gapi); } let timer = setInterval(() => { if (window.gapi && window.gapi.auth) { clearInterval(timer); timer = null; maxTryCount = null; return resolve(window.gapi); } else if (maxTryCount <= 0) { return reject('Limit gapi auth call'); } else { maxTryCount--; } }, 200); }); } /** * Client-side (Cordova или Web Browser) аворизация Google OAuth 2.0 * @param CLIENT_ID {String} * @param SCOPES {Array} * @param options {Object|undefined} * @returns {Promise} */ function googleOAuth(CLIENT_ID, SCOPES, options) { const immediate = (options && options.immediate) || false; const redirect_uri = (options && options.redirect_uri) || 'http://localhost/callback'; return new Promise((resolve, reject) => { getGapi() .then(gapi => { if (!window.cordova) { gapi.auth.authorize({ client_id: CLIENT_ID, scope: SCOPES, response_type: 'token', immediate }, (token) => { gapi.client.setApiKey(''); gapi.auth.setToken(token); return resolve(token); }); } else if (window.cordova && window.cordova.InAppBrowser) { const browserRef = window.cordova.InAppBrowser.open( `https://accounts.google.com/o/oauth2/auth?client_id=${CLIENT_ID}` + `&redirect_uri=${redirect_uri}` + `&scope=${SCOPES.join(' ')}` + '&approval_prompt=force' + '&response_type=token id_token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes' ); browserRef.addEventListener('loadstart', (event) => { if ((event.url).indexOf(redirect_uri) === 0) { browserRef.removeEventListener('exit', () => { }); browserRef.close(); let callbackResponse = (event.url).split('#')[1]; let responseParameters = (callbackResponse).split('&'); let parameterMap = []; for (let i = 0; i < responseParameters.length; i++) { parameterMap[responseParameters[i].split('=')[0]] = responseParameters[i].split('=')[1]; } if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) { const token = { access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, id_token: parameterMap.id_token, token_type: parameterMap.token_type }; gapi.client.setApiKey(''); gapi.auth.setToken(token); return resolve(token); } else { return reject('Problem authenticating'); } } }); browserRef.addEventListener('exit', () => { return reject('The sign in flow was canceled'); }); } else { return reject('Cordova InAppBrowser not installed'); } }) .catch(error => { return reject(error); }); }); } export default googleOAuth;