(function() { 'use strict'; angular.module('oauth.netatmo', ['oauth.utils']).factory('$ngCordovaNetatmo', netatmo); function netatmo($q, $http, $cordovaOauthUtility) { return { signin: oauthNetatmo }; /* * Sign into the Netatmo service * * @param string clientId * @param string clientSecret * @param string appScope * @param object options * @return promise */ function oauthNetatmo(options) { var deferred = $q.defer(); var fetchingToken = false; var clientId = (options.clientId)? options.clientId: null; var clientSecret = (options.clientSecret)? options.clientSecret: null; var appScope = (options.appScope)? options.appScope: null; var state = (options.state)? options.state: Math.random().toString(36).substr(2, 5); var inappbrowserOptions = (options.inappbrowserOptions)? options.inappbrowserOptions: 'location=no,clearsessioncache=yes,clearcache=yes'; if(window.cordova) { if($cordovaOauthUtility.isInAppBrowserInstalled()) { var redirect_uri = "http://localhost/callback"; var authorize_uri = 'https://api.netatmo.com/oauth2/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope +'&state='+ state; var browserRef = window.cordova.InAppBrowser.open(authorize_uri, '_blank', inappbrowserOptions); browserRef.addEventListener('loadstart', inappbrowserLoadStarted); browserRef.addEventListener('exit', inapbrowserExited); } else { deferred.reject({error: "no_inappbrowser_plugin"}); } } else { deferred.reject({error: "no_inappbrowser_plugin"}); } function inappbrowserLoadStarted(event){ var hasNoRedirectUri = (event.url).indexOf(redirect_uri) === 0; var redirectUriMatch = (event.url).split("?")[0] === redirect_uri; if(hasNoRedirectUri && redirectUriMatch) { fetchingToken = true; browserRef.close(); //get response url parameters var callbackResponse = (event.url).split("?")[1]; var responseParameters = (callbackResponse).split("&"); var urlParameters = []; for(var i = 0; i < responseParameters.length; i++) { urlParameters[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1]; } var requestToken = urlParameters.code; var responseState = urlParameters.state; if(state === responseState){ var httpOptions = { method: "post", url: "https://api.netatmo.com/oauth2/token", data: 'grant_type=authorization_code&client_id='+ clientId +'&client_secret='+ clientSecret +'&code='+ requestToken +'&scope='+ appScope +'&redirect_uri='+ redirect_uri, headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }, }; $http(httpOptions).success(requestTokenSuccess).error(requestTokenError).finally(requestTokenFinally); } else { deferred.reject({error: "string_missmatch"}); } } function requestTokenSuccess(success){ deferred.resolve(success); } function requestTokenError(error){ deferred.reject(error); } function requestTokenFinally(){} } function inapbrowserExited(event){ if(!fetchingToken){ var error = {error: "flow_canceled"}; deferred.reject(error); } } return deferred.promise; } } netatmo.$inject = ['$q', '$http', '$cordovaOauthUtility']; })();