暂无描述

ng-cordova-oauth-fix.js 103KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830
  1. angular.module("oauth.providers", ["oauth.utils"])
  2. .factory("$cordovaOauth", ["$q", '$http', "$cordovaOauthUtility", function($q, $http, $cordovaOauthUtility) {
  3. return {
  4. /*
  5. * Sign into the ADFS service (ADFS 3.0 onwards)
  6. *
  7. * @param string clientId (client registered in ADFS, with redirect_uri configured to: http://localhost/callback)
  8. * @param string adfsServer (url of the ADFS Server)
  9. * @param string relyingPartyId (url of the Relying Party (resource relying on ADFS for authentication) configured in ADFS)
  10. * @return promise
  11. */
  12. adfs: function(clientId, adfsServer, relyingPartyId) {
  13. var deferred = $q.defer();
  14. if(window.cordova) {
  15. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  16. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  17. var browserRef = window.open(adfsServer + '/adfs/oauth2/authorize?response_type=code&client_id=' + clientId +'&redirect_uri=http://localhost/callback&resource=' + relyingPartyId, '_blank', 'location=no');
  18. browserRef.addEventListener("loadstart", function(event) {
  19. if((event.url).indexOf('http://localhost/callback') === 0) {
  20. var requestToken = (event.url).split("code=")[1];
  21. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  22. $http({method: "post", url: adfsServer + "/adfs/oauth2/token", data: "client_id=" + clientId + "&code=" + requestToken + "&redirect_uri=http://localhost/callback&grant_type=authorization_code" })
  23. .success(function(data) {
  24. deferred.resolve(data);
  25. })
  26. .error(function(data, status) {
  27. deferred.reject("Problem authenticating");
  28. })
  29. .finally(function() {
  30. setTimeout(function() {
  31. browserRef.close();
  32. }, 10);
  33. });
  34. }
  35. });
  36. browserRef.addEventListener('exit', function(event) {
  37. deferred.reject("The sign in flow was canceled");
  38. });
  39. } else {
  40. deferred.reject("Could not find InAppBrowser plugin");
  41. }
  42. } else {
  43. deferred.reject("Cannot authenticate via a web browser");
  44. }
  45. return deferred.promise;
  46. },
  47. /*
  48. * Sign into the Dropbox service
  49. *
  50. * @param string appKey
  51. * @param object options
  52. * @return promise
  53. */
  54. dropbox: function(appKey, options) {
  55. var deferred = $q.defer();
  56. if(window.cordova) {
  57. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  58. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  59. var redirect_uri = "http://localhost/callback";
  60. if(options !== undefined) {
  61. if(options.hasOwnProperty("redirect_uri")) {
  62. redirect_uri = options.redirect_uri;
  63. }
  64. }
  65. var browserRef = window.open("https://www.dropbox.com/1/oauth2/authorize?client_id=" + appKey + "&redirect_uri=" + redirect_uri + "&response_type=token", "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
  66. browserRef.addEventListener("loadstart", function(event) {
  67. if((event.url).indexOf(redirect_uri) === 0) {
  68. browserRef.removeEventListener("exit",function(event){});
  69. browserRef.close();
  70. var callbackResponse = (event.url).split("#")[1];
  71. var responseParameters = (callbackResponse).split("&");
  72. var parameterMap = [];
  73. for(var i = 0; i < responseParameters.length; i++) {
  74. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  75. }
  76. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  77. deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, uid: parameterMap.uid });
  78. } else {
  79. deferred.reject("Problem authenticating");
  80. }
  81. }
  82. });
  83. browserRef.addEventListener('exit', function(event) {
  84. deferred.reject("The sign in flow was canceled");
  85. });
  86. } else {
  87. deferred.reject("Could not find InAppBrowser plugin");
  88. }
  89. } else {
  90. deferred.reject("Cannot authenticate via a web browser");
  91. }
  92. return deferred.promise;
  93. },
  94. /*
  95. * Sign into the Digital Ocean service
  96. *
  97. * @param string clientId
  98. * @param string clientSecret
  99. * @param object options
  100. * @return promise
  101. */
  102. digitalOcean: function(clientId, clientSecret, options) {
  103. var deferred = $q.defer();
  104. if(window.cordova) {
  105. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  106. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  107. var redirect_uri = "http://localhost/callback";
  108. if(options !== undefined) {
  109. if(options.hasOwnProperty("redirect_uri")) {
  110. redirect_uri = options.redirect_uri;
  111. }
  112. }
  113. var browserRef = window.open("https://cloud.digitalocean.com/v1/oauth/authorize?client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=read%20write", "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
  114. browserRef.addEventListener("loadstart", function(event) {
  115. if((event.url).indexOf(redirect_uri) === 0) {
  116. var requestToken = (event.url).split("code=")[1];
  117. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  118. $http({method: "post", url: "https://cloud.digitalocean.com/v1/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  119. .success(function(data) {
  120. deferred.resolve(data);
  121. })
  122. .error(function(data, status) {
  123. deferred.reject("Problem authenticating");
  124. })
  125. .finally(function() {
  126. setTimeout(function() {
  127. browserRef.close();
  128. }, 10);
  129. });
  130. }
  131. });
  132. browserRef.addEventListener('exit', function(event) {
  133. deferred.reject("The sign in flow was canceled");
  134. });
  135. } else {
  136. deferred.reject("Could not find InAppBrowser plugin");
  137. }
  138. } else {
  139. deferred.reject("Cannot authenticate via a web browser");
  140. }
  141. return deferred.promise;
  142. },
  143. /*
  144. * Sign into the Google service
  145. *
  146. * @param string clientId
  147. * @param array appScope
  148. * @param object options
  149. * @return promise
  150. */
  151. google: function(clientId, appScope, options) {
  152. var deferred = $q.defer();
  153. if(window.cordova) {
  154. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  155. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  156. var redirect_uri = "http://localhost/callback";
  157. if(options !== undefined) {
  158. if(options.hasOwnProperty("redirect_uri")) {
  159. redirect_uri = options.redirect_uri;
  160. }
  161. }
  162. var browserRef = window.open('https://accounts.google.com/o/oauth2/auth?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(" ") + '&approval_prompt=force&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  163. browserRef.addEventListener("loadstart", function(event) {
  164. if((event.url).indexOf(redirect_uri) === 0) {
  165. browserRef.removeEventListener("exit",function(event){});
  166. browserRef.close();
  167. var callbackResponse = (event.url).split("#")[1];
  168. var responseParameters = (callbackResponse).split("&");
  169. var parameterMap = [];
  170. for(var i = 0; i < responseParameters.length; i++) {
  171. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  172. }
  173. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  174. deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, expires_in: parameterMap.expires_in });
  175. } else {
  176. deferred.reject("Problem authenticating");
  177. }
  178. }
  179. });
  180. browserRef.addEventListener('exit', function(event) {
  181. deferred.reject("The sign in flow was canceled");
  182. });
  183. } else {
  184. deferred.reject("Could not find InAppBrowser plugin");
  185. }
  186. } else {
  187. deferred.reject("Cannot authenticate via a web browser");
  188. }
  189. return deferred.promise;
  190. },
  191. /*
  192. * Sign into the GitHub service
  193. *
  194. * @param string clientId
  195. * @param string clientSecret
  196. * @param array appScope
  197. * @param object options
  198. * @return promise
  199. */
  200. github: function(clientId, clientSecret, appScope, options) {
  201. var deferred = $q.defer();
  202. if(window.cordova) {
  203. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  204. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  205. var redirect_uri = "http://localhost/callback";
  206. if(options !== undefined) {
  207. if(options.hasOwnProperty("redirect_uri")) {
  208. redirect_uri = options.redirect_uri;
  209. }
  210. }
  211. var browserRef = window.open('https://github.com/login/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(","), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  212. browserRef.addEventListener('loadstart', function(event) {
  213. if((event.url).indexOf(redirect_uri) === 0) {
  214. requestToken = (event.url).split("code=")[1];
  215. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  216. $http.defaults.headers.post.accept = 'application/json';
  217. $http({method: "post", url: "https://github.com/login/oauth/access_token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&code=" + requestToken })
  218. .success(function(data) {
  219. deferred.resolve(data);
  220. })
  221. .error(function(data, status) {
  222. deferred.reject("Problem authenticating");
  223. })
  224. .finally(function() {
  225. setTimeout(function() {
  226. browserRef.close();
  227. }, 10);
  228. });
  229. }
  230. });
  231. browserRef.addEventListener('exit', function(event) {
  232. deferred.reject("The sign in flow was canceled");
  233. });
  234. } else {
  235. deferred.reject("Could not find InAppBrowser plugin");
  236. }
  237. } else {
  238. deferred.reject("Cannot authenticate via a web browser");
  239. }
  240. return deferred.promise;
  241. },
  242. /*
  243. * Sign into the Facebook service
  244. *
  245. * @param string clientId
  246. * @param array appScope
  247. * @param object options
  248. * @return promise
  249. */
  250. facebook: function(clientId, appScope, options) {
  251. var deferred = $q.defer();
  252. if(window.cordova) {
  253. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  254. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  255. var redirect_uri = "http://localhost/callback";
  256. if(options !== undefined) {
  257. if(options.hasOwnProperty("redirect_uri")) {
  258. redirect_uri = options.redirect_uri;
  259. }
  260. }
  261. var flowUrl = "https://www.facebook.com/v2.0/dialog/oauth?client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&response_type=token&scope=" + appScope.join(",");
  262. if(options !== undefined && options.hasOwnProperty("auth_type")) {
  263. flowUrl += "&auth_type=" + options.auth_type;
  264. }
  265. var browserRef = window.open(flowUrl, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  266. browserRef.addEventListener('loadstart', function(event) {
  267. if((event.url).indexOf(redirect_uri) === 0) {
  268. browserRef.removeEventListener("exit",function(event){});
  269. browserRef.close();
  270. var callbackResponse = (event.url).split("#")[1];
  271. var responseParameters = (callbackResponse).split("&");
  272. var parameterMap = [];
  273. for(var i = 0; i < responseParameters.length; i++) {
  274. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  275. }
  276. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  277. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
  278. } else {
  279. if ((event.url).indexOf("error_code=100") !== 0)
  280. deferred.reject("Facebook returned error_code=100: Invalid permissions");
  281. else
  282. deferred.reject("Problem authenticating");
  283. }
  284. }
  285. });
  286. browserRef.addEventListener('exit', function(event) {
  287. deferred.reject("The sign in flow was canceled");
  288. });
  289. } else {
  290. deferred.reject("Could not find InAppBrowser plugin");
  291. }
  292. } else {
  293. deferred.reject("Cannot authenticate via a web browser");
  294. }
  295. return deferred.promise;
  296. },
  297. /*
  298. * Sign into the LinkedIn service
  299. *
  300. * @param string clientId
  301. * @param string clientSecret
  302. * @param array appScope
  303. * @param string state
  304. * @param object options
  305. * @return promise
  306. */
  307. linkedin: function(clientId, clientSecret, appScope, state, options) {
  308. var deferred = $q.defer();
  309. if(window.cordova) {
  310. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  311. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  312. var redirect_uri = "http://localhost/callback";
  313. if(options !== undefined) {
  314. if(options.hasOwnProperty("redirect_uri")) {
  315. redirect_uri = options.redirect_uri;
  316. }
  317. }
  318. var browserRef = window.open('https://www.linkedin.com/uas/oauth2/authorization?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(" ") + '&response_type=code&state=' + state, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  319. browserRef.addEventListener('loadstart', function(event) {
  320. if((event.url).indexOf(redirect_uri) === 0) {
  321. requestToken = (event.url).split("code=")[1];
  322. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  323. $http({method: "post", url: "https://www.linkedin.com/uas/oauth2/accessToken", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  324. .success(function(data) {
  325. deferred.resolve(data);
  326. })
  327. .error(function(data, status) {
  328. deferred.reject("Problem authenticating");
  329. })
  330. .finally(function() {
  331. setTimeout(function() {
  332. browserRef.close();
  333. }, 10);
  334. });
  335. }
  336. });
  337. browserRef.addEventListener('exit', function(event) {
  338. deferred.reject("The sign in flow was canceled");
  339. });
  340. } else {
  341. deferred.reject("Could not find InAppBrowser plugin");
  342. }
  343. } else {
  344. deferred.reject("Cannot authenticate via a web browser");
  345. }
  346. return deferred.promise;
  347. },
  348. /*
  349. * Sign into the Instagram service
  350. *
  351. * @param string clientId
  352. * @param array appScope
  353. * @param object options
  354. * @return promise
  355. */
  356. instagram: function(clientId, appScope, options) {
  357. var deferred = $q.defer();
  358. var split_tokens = {
  359. 'code':'?',
  360. 'token':'#'
  361. };
  362. if(window.cordova) {
  363. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  364. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  365. var redirect_uri = "http://localhost/callback";
  366. var response_type = "token";
  367. if(options !== undefined) {
  368. if(options.hasOwnProperty("redirect_uri")) {
  369. redirect_uri = options.redirect_uri;
  370. }
  371. if(options.hasOwnProperty("response_type")) {
  372. response_type = options.response_type;
  373. }
  374. }
  375. var browserRef = window.open('https://api.instagram.com/oauth/authorize/?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(" ") + '&response_type='+response_type, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  376. browserRef.addEventListener('loadstart', function(event) {
  377. if((event.url).indexOf(redirect_uri) === 0) {
  378. browserRef.removeEventListener("exit",function(event){});
  379. browserRef.close();
  380. var callbackResponse = (event.url).split(split_tokens[response_type])[1];
  381. var parameterMap = $cordovaOauthUtility.parseResponseParameters(callbackResponse);
  382. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  383. deferred.resolve({ access_token: parameterMap.access_token });
  384. } else if(parameterMap.code !== undefined && parameterMap.code !== null) {
  385. deferred.resolve({ code: parameterMap.code });
  386. } else {
  387. deferred.reject("Problem authenticating");
  388. }
  389. }
  390. });
  391. browserRef.addEventListener('exit', function(event) {
  392. deferred.reject("The sign in flow was canceled");
  393. });
  394. } else {
  395. deferred.reject("Could not find InAppBrowser plugin");
  396. }
  397. } else {
  398. deferred.reject("Cannot authenticate via a web browser");
  399. }
  400. return deferred.promise;
  401. },
  402. /*
  403. * Sign into the Box service
  404. *
  405. * @param string clientId
  406. * @param string clientSecret
  407. * @param string appState
  408. * @param object options
  409. * @return promise
  410. */
  411. box: function(clientId, clientSecret, appState, options) {
  412. var deferred = $q.defer();
  413. if(window.cordova) {
  414. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  415. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  416. var redirect_uri = "http://localhost/callback";
  417. if(options !== undefined) {
  418. if(options.hasOwnProperty("redirect_uri")) {
  419. redirect_uri = options.redirect_uri;
  420. }
  421. }
  422. var browserRef = window.open('https://app.box.com/api/oauth2/authorize/?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&state=' + appState + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  423. browserRef.addEventListener('loadstart', function(event) {
  424. if((event.url).indexOf(redirect_uri) === 0) {
  425. requestToken = (event.url).split("code=")[1];
  426. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  427. $http({method: "post", url: "https://app.box.com/api/oauth2/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  428. .success(function(data) {
  429. deferred.resolve(data);
  430. })
  431. .error(function(data, status) {
  432. deferred.reject("Problem authenticating");
  433. })
  434. .finally(function() {
  435. setTimeout(function() {
  436. browserRef.close();
  437. }, 10);
  438. });
  439. }
  440. });
  441. browserRef.addEventListener('exit', function(event) {
  442. deferred.reject("The sign in flow was canceled");
  443. });
  444. } else {
  445. deferred.reject("Could not find InAppBrowser plugin");
  446. }
  447. } else {
  448. deferred.reject("Cannot authenticate via a web browser");
  449. }
  450. return deferred.promise;
  451. },
  452. /*
  453. * Sign into the Reddit service
  454. *
  455. * @param string clientId
  456. * @param string clientSecret
  457. * @param array appScope
  458. * @param object options
  459. * @return promise
  460. */
  461. reddit: function(clientId, clientSecret, appScope, compact, options) {
  462. var deferred = $q.defer();
  463. if(window.cordova) {
  464. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  465. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  466. var redirect_uri = "http://localhost/callback";
  467. if(options !== undefined) {
  468. if(options.hasOwnProperty("redirect_uri")) {
  469. redirect_uri = options.redirect_uri;
  470. }
  471. }
  472. var browserRef = window.open('https://ssl.reddit.com/api/v1/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&duration=permanent&state=ngcordovaoauth&scope=' + appScope.join(",") + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  473. browserRef.addEventListener('loadstart', function(event) {
  474. if((event.url).indexOf(redirect_uri) === 0) {
  475. requestToken = (event.url).split("code=")[1];
  476. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  477. $http.defaults.headers.post.Authorization = 'Basic ' + btoa(clientId + ":" + clientSecret);
  478. $http({method: "post", url: "https://ssl.reddit.com/api/v1/access_token", data: "redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  479. .success(function(data) {
  480. deferred.resolve(data);
  481. })
  482. .error(function(data, status) {
  483. deferred.reject("Problem authenticating");
  484. })
  485. .finally(function() {
  486. setTimeout(function() {
  487. browserRef.close();
  488. }, 10);
  489. });
  490. }
  491. });
  492. browserRef.addEventListener('exit', function(event) {
  493. deferred.reject("The sign in flow was canceled");
  494. });
  495. } else {
  496. deferred.reject("Could not find InAppBrowser plugin");
  497. }
  498. } else {
  499. deferred.reject("Cannot authenticate via a web browser");
  500. }
  501. return deferred.promise;
  502. },
  503. /*
  504. * Sign into the Twitter service
  505. * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
  506. *
  507. * @param string clientId
  508. * @param string clientSecret
  509. * @return promise
  510. */
  511. twitter: function(clientId, clientSecret, options) {
  512. var deferred = $q.defer();
  513. if(window.cordova) {
  514. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  515. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  516. var redirect_uri = "http://localhost/callback";
  517. if(options !== undefined) {
  518. if(options.hasOwnProperty("redirect_uri")) {
  519. redirect_uri = options.redirect_uri;
  520. }
  521. }
  522. if(typeof jsSHA !== "undefined") {
  523. var oauthObject = {
  524. oauth_consumer_key: clientId,
  525. oauth_nonce: $cordovaOauthUtility.createNonce(10),
  526. oauth_signature_method: "HMAC-SHA1",
  527. oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
  528. oauth_version: "1.0"
  529. };
  530. var signatureObj = $cordovaOauthUtility.createSignature("POST", "https://api.twitter.com/oauth/request_token", oauthObject, { oauth_callback: redirect_uri }, clientSecret);
  531. $http({
  532. method: "post",
  533. url: "https://api.twitter.com/oauth/request_token",
  534. headers: {
  535. "Authorization": signatureObj.authorization_header,
  536. "Content-Type": "application/x-www-form-urlencoded"
  537. },
  538. data: "oauth_callback=" + encodeURIComponent(redirect_uri)
  539. })
  540. .success(function(requestTokenResult) {
  541. var requestTokenParameters = (requestTokenResult).split("&");
  542. var parameterMap = {};
  543. for(var i = 0; i < requestTokenParameters.length; i++) {
  544. parameterMap[requestTokenParameters[i].split("=")[0]] = requestTokenParameters[i].split("=")[1];
  545. }
  546. if(parameterMap.hasOwnProperty("oauth_token") === false) {
  547. deferred.reject("Oauth request token was not received");
  548. }
  549. var browserRef = window.open('https://api.twitter.com/oauth/authenticate?oauth_token=' + parameterMap.oauth_token, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  550. browserRef.addEventListener('loadstart', function(event) {
  551. if((event.url).indexOf(redirect_uri) === 0) {
  552. var callbackResponse = (event.url).split("?")[1];
  553. var responseParameters = (callbackResponse).split("&");
  554. var parameterMap = {};
  555. for(var i = 0; i < responseParameters.length; i++) {
  556. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  557. }
  558. if(parameterMap.hasOwnProperty("oauth_verifier") === false) {
  559. deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
  560. }
  561. delete oauthObject.oauth_signature;
  562. oauthObject.oauth_token = parameterMap.oauth_token;
  563. var signatureObj = $cordovaOauthUtility.createSignature("POST", "https://api.twitter.com/oauth/access_token", oauthObject, { oauth_verifier: parameterMap.oauth_verifier }, clientSecret);
  564. $http({
  565. method: "post",
  566. url: "https://api.twitter.com/oauth/access_token",
  567. headers: {
  568. "Authorization": signatureObj.authorization_header
  569. },
  570. params: {
  571. "oauth_verifier": parameterMap.oauth_verifier
  572. }
  573. })
  574. .success(function(result) {
  575. var accessTokenParameters = result.split("&");
  576. var parameterMap = {};
  577. for(var i = 0; i < accessTokenParameters.length; i++) {
  578. parameterMap[accessTokenParameters[i].split("=")[0]] = accessTokenParameters[i].split("=")[1];
  579. }
  580. if(parameterMap.hasOwnProperty("oauth_token_secret") === false) {
  581. deferred.reject("Oauth access token was not received");
  582. }
  583. deferred.resolve(parameterMap);
  584. })
  585. .error(function(error) {
  586. deferred.reject(error);
  587. })
  588. .finally(function() {
  589. setTimeout(function() {
  590. browserRef.close();
  591. }, 10);
  592. });
  593. }
  594. });
  595. browserRef.addEventListener('exit', function(event) {
  596. deferred.reject("The sign in flow was canceled");
  597. });
  598. })
  599. .error(function(error) {
  600. deferred.reject(error);
  601. });
  602. } else {
  603. deferred.reject("Missing jsSHA JavaScript library");
  604. }
  605. } else {
  606. deferred.reject("Could not find InAppBrowser plugin");
  607. }
  608. } else {
  609. deferred.reject("Cannot authenticate via a web browser");
  610. }
  611. return deferred.promise;
  612. },
  613. /*
  614. * Sign into the Meetup service
  615. *
  616. * @param string clientId
  617. * @param object options
  618. * @return promise
  619. */
  620. meetup: function(clientId, options) {
  621. var deferred = $q.defer();
  622. if(window.cordova) {
  623. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  624. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  625. var redirect_uri = "http://localhost/callback";
  626. if(options !== undefined) {
  627. if(options.hasOwnProperty("redirect_uri")) {
  628. redirect_uri = options.redirect_uri;
  629. }
  630. }
  631. var browserRef = window.open('https://secure.meetup.com/oauth2/authorize/?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  632. browserRef.addEventListener('loadstart', function(event) {
  633. if((event.url).indexOf(redirect_uri) === 0) {
  634. browserRef.removeEventListener("exit",function(event){});
  635. browserRef.close();
  636. var callbackResponse = (event.url).split("#")[1];
  637. var responseParameters = (callbackResponse).split("&");
  638. var parameterMap = {};
  639. for(var i = 0; i < responseParameters.length; i++) {
  640. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  641. }
  642. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  643. deferred.resolve(parameterMap);
  644. } else {
  645. deferred.reject("Problem authenticating");
  646. }
  647. }
  648. });
  649. browserRef.addEventListener('exit', function(event) {
  650. deferred.reject("The sign in flow was canceled");
  651. });
  652. } else {
  653. deferred.reject("Could not find InAppBrowser plugin");
  654. }
  655. } else {
  656. deferred.reject("Cannot authenticate via a web browser");
  657. }
  658. return deferred.promise;
  659. },
  660. /*
  661. * Sign into the Salesforce service
  662. *
  663. * Suggestion: use salesforce oauth with forcetk.js(as SDK)
  664. *
  665. * @param string loginUrl (such as: https://login.salesforce.com ; please notice community login)
  666. * @param string clientId (copy from connection app info)
  667. * @param string redirectUri (callback url in connection app info)
  668. * @return promise
  669. */
  670. salesforce: function (loginUrl, clientId) {
  671. var redirectUri = 'http://localhost/callback';
  672. var getAuthorizeUrl = function (loginUrl, clientId, redirectUri) {
  673. return loginUrl+'services/oauth2/authorize?display=touch'+
  674. '&response_type=token&client_id='+escape(clientId)+
  675. '&redirect_uri='+escape(redirectUri);
  676. };
  677. var startWith = function(string, str) {
  678. return (string.substr(0, str.length) === str);
  679. };
  680. var deferred = $q.defer();
  681. if(window.cordova) {
  682. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  683. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  684. var browserRef = window.open(getAuthorizeUrl(loginUrl, clientId, redirectUri), "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
  685. browserRef.addEventListener("loadstart", function(event) {
  686. if(startWith(event.url, redirectUri)) {
  687. var oauthResponse = {};
  688. var fragment = (event.url).split('#')[1];
  689. if (fragment) {
  690. var nvps = fragment.split('&');
  691. for (var nvp in nvps) {
  692. var parts = nvps[nvp].split('=');
  693. oauthResponse[parts[0]] = unescape(parts[1]);
  694. }
  695. }
  696. if (typeof oauthResponse === 'undefined' ||
  697. typeof oauthResponse.access_token === 'undefined') {
  698. deferred.reject("Problem authenticating");
  699. } else {
  700. deferred.resolve(oauthResponse);
  701. }
  702. setTimeout(function() {
  703. browserRef.close();
  704. }, 10);
  705. }
  706. });
  707. browserRef.addEventListener('exit', function(event) {
  708. deferred.reject("The sign in flow was canceled");
  709. });
  710. } else {
  711. deferred.reject("Could not find InAppBrowser plugin");
  712. }
  713. } else {
  714. deferred.reject("Cannot authenticate via a web browser");
  715. }
  716. return deferred.promise;
  717. },
  718. /*
  719. * Sign into the Strava service
  720. *
  721. * @param string clientId
  722. * @param string clientSecret
  723. * @param array appScope
  724. * @param object options
  725. * @return promise
  726. */
  727. strava: function(clientId, clientSecret, appScope, options) {
  728. var deferred = $q.defer();
  729. if(window.cordova) {
  730. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  731. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  732. var redirect_uri = "http://localhost/callback";
  733. if(options !== undefined) {
  734. if(options.hasOwnProperty("redirect_uri")) {
  735. redirect_uri = options.redirect_uri;
  736. }
  737. }
  738. var browserRef = window.open('https://www.strava.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(",") + '&response_type=code&approval_prompt=force', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  739. browserRef.addEventListener('loadstart', function(event) {
  740. if((event.url).indexOf(redirect_uri) === 0) {
  741. requestToken = (event.url).split("code=")[1];
  742. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  743. $http({method: "post", url: "https://www.strava.com/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&code=" + requestToken })
  744. .success(function(data) {
  745. deferred.resolve(data);
  746. })
  747. .error(function(data, status) {
  748. deferred.reject("Problem authenticating");
  749. })
  750. .finally(function() {
  751. setTimeout(function() {
  752. browserRef.close();
  753. }, 10);
  754. });
  755. }
  756. });
  757. browserRef.addEventListener('exit', function(event) {
  758. deferred.reject("The sign in flow was canceled");
  759. });
  760. } else {
  761. deferred.reject("Could not find InAppBrowser plugin");
  762. }
  763. } else {
  764. deferred.reject("Cannot authenticate via a web browser");
  765. }
  766. return deferred.promise;
  767. },
  768. /*
  769. * Sign into the Withings service
  770. * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
  771. *
  772. * @param string clientId
  773. * @param string clientSecret
  774. * @return promise
  775. */
  776. withings: function(clientId, clientSecret) {
  777. var deferred = $q.defer();
  778. if(window.cordova) {
  779. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  780. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  781. if(typeof jsSHA !== "undefined") {
  782. // Step 1 : get a oAuth "request token"
  783. var oauthObject = $cordovaOauthUtility.generateOauthParametersInstance(clientId);
  784. oauthObject.oauth_callback = 'http://localhost/callback';
  785. var requestTokenUrlBase = "https://oauth.withings.com/account/request_token";
  786. var signatureObj = $cordovaOauthUtility.createSignature("GET", requestTokenUrlBase, {}, oauthObject, clientSecret);
  787. oauthObject.oauth_signature = signatureObj.signature;
  788. var requestTokenParameters = $cordovaOauthUtility.generateUrlParameters(oauthObject);
  789. $http({method: "get", url: requestTokenUrlBase + "?" + requestTokenParameters })
  790. .success(function(requestTokenResult) {
  791. // Step 2 : End-user authorization
  792. var parameterMap = $cordovaOauthUtility.parseResponseParameters(requestTokenResult);
  793. if(parameterMap.hasOwnProperty("oauth_token") === false) {
  794. deferred.reject("Oauth request token was not received");
  795. }
  796. var oauthObject = $cordovaOauthUtility.generateOauthParametersInstance(clientId);
  797. oauthObject.oauth_token = parameterMap.oauth_token;
  798. // used in step 3
  799. var oauthTokenSecret = parameterMap.oauth_token_secret;
  800. var authorizeUrlBase = "https://oauth.withings.com/account/authorize";
  801. var signatureObj = $cordovaOauthUtility.createSignature("GET", authorizeUrlBase, {}, oauthObject, clientSecret);
  802. oauthObject.oauth_signature = signatureObj.signature;
  803. var authorizeParameters = $cordovaOauthUtility.generateUrlParameters(oauthObject);
  804. var browserRef = window.open(authorizeUrlBase + '?' + authorizeParameters, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  805. // STEP 3: User Data Access token
  806. browserRef.addEventListener('loadstart', function(event) {
  807. if((event.url).indexOf("http://localhost/callback") === 0) {
  808. var callbackResponse = (event.url).split("?")[1];
  809. parameterMap = $cordovaOauthUtility.parseResponseParameters(callbackResponse);
  810. if(parameterMap.hasOwnProperty("oauth_verifier") === false) {
  811. deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
  812. }
  813. var oauthObject = $cordovaOauthUtility.generateOauthParametersInstance(clientId);
  814. oauthObject.oauth_token = parameterMap.oauth_token;
  815. var accessTokenUrlBase = "https://oauth.withings.com/account/access_token";
  816. var signatureObj = $cordovaOauthUtility.createSignature("GET", accessTokenUrlBase, {}, oauthObject, clientSecret, oauthTokenSecret);
  817. oauthObject.oauth_signature = signatureObj.signature;
  818. var accessTokenParameters = $cordovaOauthUtility.generateUrlParameters(oauthObject);
  819. $http({method: "get", url: accessTokenUrlBase + '?' + accessTokenParameters})
  820. .success(function(result) {
  821. var parameterMap = $cordovaOauthUtility.parseResponseParameters(result);
  822. if(parameterMap.hasOwnProperty("oauth_token_secret") === false) {
  823. deferred.reject("Oauth access token was not received");
  824. }
  825. deferred.resolve(parameterMap);
  826. })
  827. .error(function(error) {
  828. deferred.reject(error);
  829. })
  830. .finally(function() {
  831. setTimeout(function() {
  832. browserRef.close();
  833. }, 10);
  834. });
  835. }
  836. });
  837. browserRef.addEventListener('exit', function(event) {
  838. deferred.reject("The sign in flow was canceled");
  839. });
  840. })
  841. .error(function(error) {
  842. deferred.reject(error);
  843. });
  844. } else {
  845. deferred.reject("Missing jsSHA JavaScript library");
  846. }
  847. } else {
  848. deferred.reject("Could not find InAppBrowser plugin");
  849. }
  850. } else {
  851. deferred.reject("Cannot authenticate via a web browser");
  852. }
  853. return deferred.promise;
  854. },
  855. /*
  856. * Sign into the Foursquare service
  857. *
  858. * @param string clientId
  859. * @param object options
  860. * @return promise
  861. */
  862. foursquare: function(clientId, options) {
  863. var deferred = $q.defer();
  864. if (window.cordova) {
  865. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  866. if ($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  867. var redirect_uri = "http://localhost/callback";
  868. if(options !== undefined) {
  869. if(options.hasOwnProperty("redirect_uri")) {
  870. redirect_uri = options.redirect_uri;
  871. }
  872. }
  873. var browserRef = window.open('https://foursquare.com/oauth2/authenticate?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  874. browserRef.addEventListener('loadstart', function (event) {
  875. if ((event.url).indexOf(redirect_uri) === 0) {
  876. browserRef.removeEventListener("exit",function(event){});
  877. browserRef.close();
  878. var callbackResponse = (event.url).split("#")[1];
  879. var responseParameters = (callbackResponse).split("&");
  880. var parameterMap = [];
  881. for (var i = 0; i < responseParameters.length; i++) {
  882. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  883. }
  884. if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  885. var promiseResponse = {
  886. access_token: parameterMap.access_token,
  887. expires_in: parameterMap.expires_in
  888. };
  889. deferred.resolve(promiseResponse);
  890. } else {
  891. deferred.reject("Problem authenticating");
  892. }
  893. }
  894. });
  895. browserRef.addEventListener('exit', function(event) {
  896. deferred.reject("The sign in flow was canceled");
  897. });
  898. } else {
  899. deferred.reject("Could not find InAppBrowser plugin");
  900. }
  901. } else {
  902. deferred.reject("Cannot authenticate via a web browser");
  903. }
  904. return deferred.promise;
  905. },
  906. /*
  907. * Sign into the Magento service
  908. * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
  909. *
  910. * @param string baseUrl
  911. * @param string clientId
  912. * @param string clientSecret
  913. * @return promise
  914. */
  915. magento: function(baseUrl, clientId, clientSecret) {
  916. var deferred = $q.defer();
  917. if(window.cordova) {
  918. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  919. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  920. if(typeof jsSHA !== "undefined") {
  921. var oauthObject = {
  922. oauth_callback: "http://localhost/callback",
  923. oauth_consumer_key: clientId,
  924. oauth_nonce: $cordovaOauthUtility.createNonce(5),
  925. oauth_signature_method: "HMAC-SHA1",
  926. oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
  927. oauth_version: "1.0"
  928. };
  929. var signatureObj = $cordovaOauthUtility.createSignature("POST", baseUrl + "/oauth/initiate", oauthObject, { oauth_callback: "http://localhost/callback" }, clientSecret);
  930. $http.defaults.headers.post.Authorization = signatureObj.authorization_header;
  931. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  932. $http({method: "post", url: baseUrl + "/oauth/initiate", data: "oauth_callback=http://localhost/callback" })
  933. .success(function(requestTokenResult) {
  934. var requestTokenParameters = (requestTokenResult).split("&");
  935. var parameterMap = {};
  936. for(var i = 0; i < requestTokenParameters.length; i++) {
  937. parameterMap[requestTokenParameters[i].split("=")[0]] = requestTokenParameters[i].split("=")[1];
  938. }
  939. if(parameterMap.hasOwnProperty("oauth_token") === false) {
  940. deferred.reject("Oauth request token was not received");
  941. }
  942. var tokenSecret = parameterMap.oauth_token_secret;
  943. var browserRef = window.open(baseUrl + '/oauth/authorize?oauth_token=' + parameterMap.oauth_token, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  944. browserRef.addEventListener('loadstart', function(event) {
  945. if((event.url).indexOf("http://localhost/callback") === 0) {
  946. var callbackResponse = (event.url).split("?")[1];
  947. var responseParameters = (callbackResponse).split("&");
  948. var parameterMap = {};
  949. for(var i = 0; i < responseParameters.length; i++) {
  950. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  951. }
  952. if(parameterMap.hasOwnProperty("oauth_verifier") === false) {
  953. deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
  954. }
  955. delete oauthObject.oauth_signature;
  956. delete oauthObject.oauth_callback;
  957. oauthObject.oauth_token = parameterMap.oauth_token;
  958. oauthObject.oauth_nonce = $cordovaOauthUtility.createNonce(5);
  959. oauthObject.oauth_verifier = parameterMap.oauth_verifier;
  960. var signatureObj = $cordovaOauthUtility.createSignature("POST", baseUrl + "/oauth/token", oauthObject, {}, clientSecret, tokenSecret);
  961. $http.defaults.headers.post.Authorization = signatureObj.authorization_header;
  962. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  963. $http({method: "post", url: baseUrl + "/oauth/token" })
  964. .success(function(result) {
  965. var accessTokenParameters = result.split("&");
  966. var parameterMap = {};
  967. for(var i = 0; i < accessTokenParameters.length; i++) {
  968. parameterMap[accessTokenParameters[i].split("=")[0]] = accessTokenParameters[i].split("=")[1];
  969. }
  970. if(parameterMap.hasOwnProperty("oauth_token_secret") === false) {
  971. deferred.reject("Oauth access token was not received");
  972. }
  973. deferred.resolve(parameterMap);
  974. })
  975. .error(function(error) {
  976. deferred.reject(error);
  977. })
  978. .finally(function() {
  979. setTimeout(function() {
  980. browserRef.close();
  981. }, 10);
  982. });
  983. }
  984. });
  985. browserRef.addEventListener('exit', function(event) {
  986. deferred.reject("The sign in flow was canceled");
  987. });
  988. })
  989. .error(function(error) {
  990. deferred.reject(error);
  991. });
  992. } else {
  993. deferred.reject("Missing jsSHA JavaScript library");
  994. }
  995. } else {
  996. deferred.reject("Could not find InAppBrowser plugin");
  997. }
  998. } else {
  999. deferred.reject("Cannot authenticate via a web browser");
  1000. }
  1001. return deferred.promise;
  1002. },
  1003. /*
  1004. * Sign into the Vkontakte service
  1005. *
  1006. * @param string clientId
  1007. * @param array appScope (for example: "friends,wall,photos,messages")
  1008. * @return promise
  1009. */
  1010. vkontakte: function(clientId, appScope) {
  1011. var deferred = $q.defer();
  1012. if(window.cordova) {
  1013. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1014. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1015. var browserRef = window.open('https://oauth.vk.com/authorize?client_id=' + clientId + '&redirect_uri=http://oauth.vk.com/blank.html&response_type=token&scope=' + appScope.join(",") + '&display=touch&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1016. browserRef.addEventListener('loadstart', function(event) {
  1017. var tmp = (event.url).split("#");
  1018. if (tmp[0] == 'https://oauth.vk.com/blank.html' || tmp[0] == 'http://oauth.vk.com/blank.html') {
  1019. browserRef.removeEventListener("exit",function(event){});
  1020. browserRef.close();
  1021. var callbackResponse = (event.url).split("#")[1];
  1022. var responseParameters = (callbackResponse).split("&");
  1023. var parameterMap = [];
  1024. for(var i = 0; i < responseParameters.length; i++) {
  1025. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  1026. }
  1027. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  1028. var output = { access_token: parameterMap.access_token, expires_in: parameterMap.expires_in };
  1029. if(parameterMap.email !== undefined && parameterMap.email !== null){
  1030. output.email = parameterMap.email;
  1031. }
  1032. deferred.resolve(output);
  1033. } else {
  1034. deferred.reject("Problem authenticating");
  1035. }
  1036. }
  1037. });
  1038. browserRef.addEventListener('exit', function(event) {
  1039. deferred.reject("The sign in flow was canceled");
  1040. });
  1041. } else {
  1042. deferred.reject("Could not find InAppBrowser plugin");
  1043. }
  1044. } else {
  1045. deferred.reject("Cannot authenticate via a web browser");
  1046. }
  1047. return deferred.promise;
  1048. },
  1049. /*
  1050. * Sign into the Odnoklassniki service
  1051. *
  1052. * @param string clientId
  1053. * @param array appScope (for example: "VALUABLE_ACCESS ,GROUP_CONTENT,VIDEO_CONTENT")
  1054. * @return promise
  1055. */
  1056. odnoklassniki: function (clientId, appScope)
  1057. {
  1058. var deferred = $q.defer();
  1059. if (window.cordova)
  1060. {
  1061. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1062. if ($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true)
  1063. {
  1064. var browserRef = window.open('http://www.odnoklassniki.ru/oauth/authorize?client_id=' + clientId + '&scope=' + appScope.join(",") + '&response_type=token&redirect_uri=http://localhost/callback' + '&layout=m', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1065. browserRef.addEventListener('loadstart', function (event)
  1066. {
  1067. if ((event.url).indexOf("http://localhost/callback") === 0)
  1068. {
  1069. var callbackResponse = (event.url).split("#")[1];
  1070. var responseParameters = (callbackResponse).split("&");
  1071. var parameterMap = [];
  1072. for (var i = 0; i < responseParameters.length; i++)
  1073. {
  1074. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  1075. }
  1076. if (parameterMap.access_token !== undefined && parameterMap.access_token !== null)
  1077. {
  1078. deferred.resolve({ access_token: parameterMap.access_token, session_secret_key: parameterMap.session_secret_key });
  1079. } else
  1080. {
  1081. deferred.reject("Problem authenticating");
  1082. }
  1083. setTimeout(function ()
  1084. {
  1085. browserRef.close();
  1086. }, 10);
  1087. }
  1088. });
  1089. browserRef.addEventListener('exit', function (event)
  1090. {
  1091. deferred.reject("The sign in flow was canceled");
  1092. });
  1093. } else
  1094. {
  1095. deferred.reject("Could not find InAppBrowser plugin");
  1096. }
  1097. } else
  1098. {
  1099. deferred.reject("Cannot authenticate via a web browser");
  1100. }
  1101. return deferred.promise;
  1102. },
  1103. /*
  1104. * Sign into the Imgur service
  1105. *
  1106. * @param string clientId
  1107. * @param object options
  1108. * @return promise
  1109. */
  1110. imgur: function(clientId, options) {
  1111. var deferred = $q.defer();
  1112. if(window.cordova) {
  1113. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1114. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1115. var redirect_uri = "http://localhost/callback";
  1116. if(options !== undefined) {
  1117. if(options.hasOwnProperty("redirect_uri")) {
  1118. redirect_uri = options.redirect_uri;
  1119. }
  1120. }
  1121. var browserRef = window.open('https://api.imgur.com/oauth2/authorize?client_id=' + clientId + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1122. browserRef.addEventListener('loadstart', function(event) {
  1123. if((event.url).indexOf(redirect_uri) === 0) {
  1124. browserRef.removeEventListener("exit",function(event){});
  1125. browserRef.close();
  1126. var callbackResponse = (event.url).split("#")[1];
  1127. var responseParameters = (callbackResponse).split("&");
  1128. var parameterMap = [];
  1129. for(var i = 0; i < responseParameters.length; i++) {
  1130. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  1131. }
  1132. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  1133. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, account_username: parameterMap.account_username });
  1134. } else {
  1135. deferred.reject("Problem authenticating");
  1136. }
  1137. }
  1138. });
  1139. browserRef.addEventListener('exit', function(event) {
  1140. deferred.reject("The sign in flow was canceled");
  1141. });
  1142. } else {
  1143. deferred.reject("Could not find InAppBrowser plugin");
  1144. }
  1145. } else {
  1146. deferred.reject("Cannot authenticate via a web browser");
  1147. }
  1148. return deferred.promise;
  1149. },
  1150. /*
  1151. * Sign into the Spotify service
  1152. *
  1153. * @param string clientId
  1154. * @param object options
  1155. * @return promise
  1156. */
  1157. spotify: function(clientId, appScope, options) {
  1158. var deferred = $q.defer();
  1159. if(window.cordova) {
  1160. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1161. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1162. var redirect_uri = "http://localhost/callback";
  1163. if(options !== undefined) {
  1164. if(options.hasOwnProperty("redirect_uri")) {
  1165. redirect_uri = options.redirect_uri;
  1166. }
  1167. }
  1168. var browserRef = window.open('https://accounts.spotify.com/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token&scope=' + appScope.join(" "), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1169. browserRef.addEventListener('loadstart', function(event) {
  1170. if((event.url).indexOf(redirect_uri) === 0) {
  1171. browserRef.removeEventListener("exit",function(event){});
  1172. browserRef.close();
  1173. var callbackResponse = (event.url).split("#")[1];
  1174. var responseParameters = (callbackResponse).split("&");
  1175. var parameterMap = [];
  1176. for(var i = 0; i < responseParameters.length; i++) {
  1177. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  1178. }
  1179. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  1180. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, account_username: parameterMap.account_username });
  1181. } else {
  1182. deferred.reject("Problem authenticating");
  1183. }
  1184. }
  1185. });
  1186. browserRef.addEventListener('exit', function(event) {
  1187. deferred.reject("The sign in flow was canceled");
  1188. });
  1189. } else {
  1190. deferred.reject("Could not find InAppBrowser plugin");
  1191. }
  1192. } else {
  1193. deferred.reject("Cannot authenticate via a web browser");
  1194. }
  1195. return deferred.promise;
  1196. },
  1197. /*
  1198. * Sign into the Uber service
  1199. *
  1200. * @param string clientId
  1201. * @param appScope array
  1202. * @param object options
  1203. * @return promise
  1204. */
  1205. uber: function(clientId, appScope, options) {
  1206. var deferred = $q.defer();
  1207. if(window.cordova) {
  1208. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1209. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1210. var redirect_uri = "http://localhost/callback";
  1211. if(options !== undefined) {
  1212. if(options.hasOwnProperty("redirect_uri")) {
  1213. redirect_uri = options.redirect_uri;
  1214. }
  1215. }
  1216. var browserRef = window.open('https://login.uber.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token&scope=' + appScope.join(" "), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1217. browserRef.addEventListener('loadstart', function(event) {
  1218. if((event.url).indexOf(redirect_uri) === 0) {
  1219. browserRef.removeEventListener("exit",function(event){});
  1220. browserRef.close();
  1221. var callbackResponse = (event.url).split("#")[1];
  1222. var responseParameters = (callbackResponse).split("&");
  1223. var parameterMap = [];
  1224. for(var i = 0; i < responseParameters.length; i++) {
  1225. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  1226. }
  1227. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  1228. deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, expires_in: parameterMap.expires_in, scope: parameterMap.scope });
  1229. } else {
  1230. deferred.reject("Problem authenticating");
  1231. }
  1232. }
  1233. });
  1234. browserRef.addEventListener('exit', function(event) {
  1235. deferred.reject("The sign in flow was canceled");
  1236. });
  1237. } else {
  1238. deferred.reject("Could not find InAppBrowser plugin");
  1239. }
  1240. } else {
  1241. deferred.reject("Cannot authenticate via a web browser");
  1242. }
  1243. return deferred.promise;
  1244. },
  1245. /*
  1246. * Sign into the Windows Live Connect service
  1247. *
  1248. * @param string clientId
  1249. * @param array appScope
  1250. * @param object options
  1251. * @return promise
  1252. */
  1253. windowsLive: function (clientId, appScope, options) {
  1254. var deferred = $q.defer();
  1255. if(window.cordova) {
  1256. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1257. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1258. var redirect_uri = "https://login.live.com/oauth20_desktop.srf";
  1259. if(options !== undefined) {
  1260. if(options.hasOwnProperty("redirect_uri")) {
  1261. redirect_uri = options.redirect_uri;
  1262. }
  1263. }
  1264. var browserRef = window.open('https://login.live.com/oauth20_authorize.srf?client_id=' + clientId + "&scope=" + appScope.join(",") + '&response_type=token&display=touch' + '&redirect_uri=' + redirect_uri, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1265. browserRef.addEventListener('loadstart', function (event) {
  1266. if((event.url).indexOf(redirect_uri) === 0) {
  1267. browserRef.removeEventListener("exit", function (event) { });
  1268. browserRef.close();
  1269. var callbackResponse = (event.url).split("#")[1];
  1270. var responseParameters = (callbackResponse).split("&");
  1271. var parameterMap = [];
  1272. for (var i = 0; i < responseParameters.length; i++) {
  1273. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  1274. }
  1275. if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  1276. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
  1277. } else {
  1278. deferred.reject("Problem authenticating");
  1279. }
  1280. }
  1281. });
  1282. browserRef.addEventListener('exit', function (event) {
  1283. deferred.reject("The sign in flow was canceled");
  1284. });
  1285. } else {
  1286. deferred.reject("Could not find InAppBrowser plugin");
  1287. }
  1288. } else {
  1289. deferred.reject("Cannot authenticate via a web browser");
  1290. }
  1291. return deferred.promise;
  1292. },
  1293. /*
  1294. * Sign into the Yammer service
  1295. *
  1296. * @param string clientId
  1297. * @param object options
  1298. * @return promise
  1299. */
  1300. yammer: function(clientId, options) {
  1301. var deferred = $q.defer();
  1302. if(window.cordova) {
  1303. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1304. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1305. var redirect_uri = "http://localhost/callback";
  1306. if(options !== undefined) {
  1307. if(options.hasOwnProperty("redirect_uri")) {
  1308. redirect_uri = options.redirect_uri;
  1309. }
  1310. }
  1311. var browserRef = window.open('https://www.yammer.com/dialog/oauth?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1312. browserRef.addEventListener('loadstart', function(event) {
  1313. if((event.url).indexOf(redirect_uri) === 0) {
  1314. browserRef.removeEventListener("exit",function(event){});
  1315. browserRef.close();
  1316. var callbackResponse = (event.url).split("#")[1];
  1317. var responseParameters = (callbackResponse).split("&");
  1318. var parameterMap = [];
  1319. for(var i = 0; i < responseParameters.length; i++) {
  1320. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  1321. }
  1322. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  1323. deferred.resolve({ access_token: parameterMap.access_token });
  1324. } else {
  1325. deferred.reject("Problem authenticating");
  1326. }
  1327. }
  1328. });
  1329. browserRef.addEventListener('exit', function(event) {
  1330. deferred.reject("The sign in flow was canceled");
  1331. });
  1332. } else {
  1333. deferred.reject("Could not find InAppBrowser plugin");
  1334. }
  1335. } else {
  1336. deferred.reject("Cannot authenticate via a web browser");
  1337. }
  1338. return deferred.promise;
  1339. },
  1340. /*
  1341. * Sign into the Venmo service
  1342. *
  1343. * @param string clientId
  1344. * @param array appScope
  1345. * @param object options
  1346. * @return promise
  1347. */
  1348. venmo: function(clientId, appScope, options) {
  1349. var deferred = $q.defer();
  1350. if(window.cordova) {
  1351. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1352. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1353. var redirect_uri = "http://localhost/callback";
  1354. if(options !== undefined) {
  1355. if(options.hasOwnProperty("redirect_uri")) {
  1356. redirect_uri = options.redirect_uri;
  1357. }
  1358. }
  1359. var browserRef = window.open('https://api.venmo.com/v1/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token&scope=' + appScope.join(" "), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1360. browserRef.addEventListener('loadstart', function(event) {
  1361. if((event.url).indexOf(redirect_uri) === 0) {
  1362. browserRef.removeEventListener("exit",function(event){});
  1363. browserRef.close();
  1364. var callbackResponse = (event.url).split("#")[1];
  1365. var responseParameters = (callbackResponse).split("&");
  1366. var parameterMap = [];
  1367. for(var i = 0; i < responseParameters.length; i++) {
  1368. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  1369. }
  1370. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  1371. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
  1372. } else {
  1373. deferred.reject("Problem authenticating");
  1374. }
  1375. }
  1376. });
  1377. browserRef.addEventListener('exit', function(event) {
  1378. deferred.reject("The sign in flow was canceled");
  1379. });
  1380. } else {
  1381. deferred.reject("Could not find InAppBrowser plugin");
  1382. }
  1383. } else {
  1384. deferred.reject("Cannot authenticate via a web browser");
  1385. }
  1386. return deferred.promise;
  1387. },
  1388. /*
  1389. * Sign into the Stripe service
  1390. *
  1391. * @param string clientId
  1392. * @param string clientSecret
  1393. * @param string appScope
  1394. * @param object options
  1395. * @return promise
  1396. */
  1397. stripe: function(clientId, clientSecret, appScope, options) {
  1398. var deferred = $q.defer();
  1399. if(window.cordova) {
  1400. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1401. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1402. var redirect_uri = "http://localhost/callback";
  1403. if(options !== undefined) {
  1404. if(options.hasOwnProperty("redirect_uri")) {
  1405. redirect_uri = options.redirect_uri;
  1406. }
  1407. }
  1408. var browserRef = window.open('https://connect.stripe.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1409. browserRef.addEventListener('loadstart', function(event) {
  1410. if((event.url).indexOf("http://localhost/callback") === 0) {
  1411. requestToken = (event.url).split("code=")[1];
  1412. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  1413. $http({method: "post", url: "https://connect.stripe.com/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  1414. .success(function(data) {
  1415. deferred.resolve(data);
  1416. })
  1417. .error(function(data, status) {
  1418. deferred.reject("Problem authenticating");
  1419. })
  1420. .finally(function() {
  1421. setTimeout(function() {
  1422. browserRef.close();
  1423. }, 10);
  1424. });
  1425. }
  1426. });
  1427. browserRef.addEventListener('exit', function(event) {
  1428. deferred.reject("The sign in flow was canceled");
  1429. });
  1430. } else {
  1431. deferred.reject("Could not find InAppBrowser plugin");
  1432. }
  1433. } else {
  1434. deferred.reject("Cannot authenticate via a web browser");
  1435. }
  1436. return deferred.promise;
  1437. },
  1438. /*
  1439. * Sign into the Rally service
  1440. *
  1441. * @param string clientId
  1442. * @param string clientSecret
  1443. * @param string appScope
  1444. * @param object options
  1445. * @return promise
  1446. */
  1447. rally: function(clientId, clientSecret, appScope, options) {
  1448. var deferred = $q.defer();
  1449. if(window.cordova) {
  1450. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1451. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1452. var redirect_uri = "http://localhost/callback";
  1453. if(options !== undefined) {
  1454. if(options.hasOwnProperty("redirect_uri")) {
  1455. redirect_uri = options.redirect_uri;
  1456. }
  1457. }
  1458. var browserRef = window.open('https://rally1.rallydev.com/login/oauth2/auth?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1459. browserRef.addEventListener('loadstart', function(event) {
  1460. if((event.url).indexOf("http://localhost/callback") === 0) {
  1461. requestToken = (event.url).split("code=")[1];
  1462. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  1463. $http({method: "post", url: "https://rally1.rallydev.com/login/oauth2/auth", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  1464. .success(function(data) {
  1465. deferred.resolve(data);
  1466. })
  1467. .error(function(data, status) {
  1468. deferred.reject("Problem authenticating");
  1469. })
  1470. .finally(function() {
  1471. setTimeout(function() {
  1472. browserRef.close();
  1473. }, 10);
  1474. });
  1475. }
  1476. });
  1477. browserRef.addEventListener('exit', function(event) {
  1478. deferred.reject("The sign in flow was canceled");
  1479. });
  1480. } else {
  1481. deferred.reject("Could not find InAppBrowser plugin");
  1482. }
  1483. } else {
  1484. deferred.reject("Cannot authenticate via a web browser");
  1485. }
  1486. return deferred.promise;
  1487. },
  1488. /*
  1489. * Sign into the FamilySearch service
  1490. *
  1491. * @param string clientId
  1492. * @param object options
  1493. * @return promise
  1494. */
  1495. familySearch: function(clientId, state, options) {
  1496. var deferred = $q.defer();
  1497. if(window.cordova) {
  1498. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1499. if(cordovaMetadata.hasOwnProperty("cordova-plugin-inappbrowser") === true) {
  1500. var redirect_uri = "http://localhost/callback";
  1501. if(options !== undefined) {
  1502. if(options.hasOwnProperty("redirect_uri")) {
  1503. redirect_uri = options.redirect_uri;
  1504. }
  1505. }
  1506. var browserRef = window.open("https://ident.familysearch.org/cis-web/oauth2/v3/authorization?client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&response_type=code&state=" + state, "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
  1507. browserRef.addEventListener("loadstart", function(event) {
  1508. if((event.url).indexOf(redirect_uri) === 0) {
  1509. var requestToken = (event.url).split("code=")[1];
  1510. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  1511. $http({method: "post", url: "https://ident.familysearch.org/cis-web/oauth2/v3/token", data: "client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code&code=" + requestToken })
  1512. .success(function(data) {
  1513. deferred.resolve(data);
  1514. })
  1515. .error(function(data, status) {
  1516. deferred.reject("Problem authenticating");
  1517. })
  1518. .finally(function() {
  1519. setTimeout(function() {
  1520. browserRef.close();
  1521. }, 10);
  1522. });
  1523. }
  1524. });
  1525. browserRef.addEventListener('exit', function(event) {
  1526. deferred.reject("The sign in flow was canceled");
  1527. });
  1528. } else {
  1529. deferred.reject("Could not find InAppBrowser plugin");
  1530. }
  1531. } else {
  1532. deferred.reject("Cannot authenticate via a web browser");
  1533. }
  1534. return deferred.promise;
  1535. },
  1536. /*
  1537. * Sign into the Envato service
  1538. *
  1539. * @param string clientId
  1540. * @param object options
  1541. * @return promise
  1542. */
  1543. envato: function(clientId, options) {
  1544. var deferred = $q.defer();
  1545. if(window.cordova) {
  1546. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  1547. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  1548. var redirect_uri = "http://localhost/callback";
  1549. if(options !== undefined) {
  1550. if(options.hasOwnProperty("redirect_uri")) {
  1551. redirect_uri = options.redirect_uri;
  1552. }
  1553. }
  1554. var browserRef = window.open('https://api.envato.com/authorization?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  1555. browserRef.addEventListener('loadstart', function(event) {
  1556. if((event.url).indexOf(redirect_uri) === 0) {
  1557. browserRef.removeEventListener("exit",function(event){});
  1558. browserRef.close();
  1559. var callbackResponse = (event.url).split("#")[1];
  1560. var responseParameters = (callbackResponse).split("&");
  1561. var parameterMap = [];
  1562. for(var i = 0; i < responseParameters.length; i++) {
  1563. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  1564. }
  1565. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  1566. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
  1567. } else {
  1568. deferred.reject("Problem authenticating");
  1569. }
  1570. }
  1571. });
  1572. browserRef.addEventListener('exit', function(event) {
  1573. deferred.reject("The sign in flow was canceled");
  1574. });
  1575. } else {
  1576. deferred.reject("Could not find InAppBrowser plugin");
  1577. }
  1578. } else {
  1579. deferred.reject("Cannot authenticate via a web browser");
  1580. }
  1581. return deferred.promise;
  1582. }
  1583. };
  1584. }]);
  1585. /*
  1586. * Cordova AngularJS Oauth
  1587. *
  1588. * Created by Nic Raboy
  1589. * http://www.nraboy.com
  1590. *
  1591. *
  1592. *
  1593. * DESCRIPTION:
  1594. *
  1595. * Use Oauth sign in for various web services.
  1596. *
  1597. *
  1598. * REQUIRES:
  1599. *
  1600. * Apache Cordova 3.5+
  1601. * Apache InAppBrowser Plugin
  1602. * Apache Cordova Whitelist Plugin
  1603. *
  1604. *
  1605. * SUPPORTS:
  1606. *
  1607. * Dropbox
  1608. * Digital Ocean
  1609. * Google
  1610. * GitHub
  1611. * Facebook
  1612. * LinkedIn
  1613. * Instagram
  1614. * Box
  1615. * Reddit
  1616. * Twitter
  1617. * Meetup
  1618. * Salesforce
  1619. * Strava
  1620. * Withings
  1621. * Foursquare
  1622. * Magento
  1623. * vkontakte
  1624. * Odnoklassniki
  1625. * ADFS
  1626. * Imgur
  1627. * Spotify
  1628. * Uber
  1629. * Windows Live Connect
  1630. * Yammer
  1631. * Venmo
  1632. * Stripe
  1633. * Rally
  1634. * Family Search
  1635. * Envato
  1636. */
  1637. angular.module("ngCordovaOauth", [
  1638. "oauth.providers",
  1639. "oauth.utils"
  1640. ]);
  1641. angular.module("oauth.utils", [])
  1642. .factory("$cordovaOauthUtility", ["$q", function($q) {
  1643. return {
  1644. /*
  1645. * Check to see if the mandatory InAppBrowser plugin is installed
  1646. *
  1647. * @param
  1648. * @return boolean
  1649. */
  1650. isInAppBrowserInstalled: function(cordovaMetadata) {
  1651. var inAppBrowserNames = ["cordova-plugin-inappbrowser", "org.apache.cordova.inappbrowser"];
  1652. return inAppBrowserNames.some(function(name) {
  1653. return cordovaMetadata.hasOwnProperty(name);
  1654. });
  1655. },
  1656. /*
  1657. * Sign an Oauth 1.0 request
  1658. *
  1659. * @param string method
  1660. * @param string endPoint
  1661. * @param object headerParameters
  1662. * @param object bodyParameters
  1663. * @param string secretKey
  1664. * @param string tokenSecret (optional)
  1665. * @return object
  1666. */
  1667. createSignature: function(method, endPoint, headerParameters, bodyParameters, secretKey, tokenSecret) {
  1668. if(typeof jsSHA !== "undefined") {
  1669. var headerAndBodyParameters = angular.copy(headerParameters);
  1670. var bodyParameterKeys = Object.keys(bodyParameters);
  1671. for(var i = 0; i < bodyParameterKeys.length; i++) {
  1672. headerAndBodyParameters[bodyParameterKeys[i]] = encodeURIComponent(bodyParameters[bodyParameterKeys[i]]);
  1673. }
  1674. var signatureBaseString = method + "&" + encodeURIComponent(endPoint) + "&";
  1675. var headerAndBodyParameterKeys = (Object.keys(headerAndBodyParameters)).sort();
  1676. for(i = 0; i < headerAndBodyParameterKeys.length; i++) {
  1677. if(i == headerAndBodyParameterKeys.length - 1) {
  1678. signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]]);
  1679. } else {
  1680. signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]] + "&");
  1681. }
  1682. }
  1683. var oauthSignatureObject = new jsSHA(signatureBaseString, "TEXT");
  1684. var encodedTokenSecret = '';
  1685. if (tokenSecret) {
  1686. encodedTokenSecret = encodeURIComponent(tokenSecret);
  1687. }
  1688. headerParameters.oauth_signature = encodeURIComponent(oauthSignatureObject.getHMAC(encodeURIComponent(secretKey) + "&" + encodedTokenSecret, "TEXT", "SHA-1", "B64"));
  1689. var headerParameterKeys = Object.keys(headerParameters);
  1690. var authorizationHeader = 'OAuth ';
  1691. for(i = 0; i < headerParameterKeys.length; i++) {
  1692. if(i == headerParameterKeys.length - 1) {
  1693. authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '"';
  1694. } else {
  1695. authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '",';
  1696. }
  1697. }
  1698. return { signature_base_string: signatureBaseString, authorization_header: authorizationHeader, signature: headerParameters.oauth_signature };
  1699. } else {
  1700. return "Missing jsSHA JavaScript library";
  1701. }
  1702. },
  1703. /*
  1704. * Create Random String Nonce
  1705. *
  1706. * @param integer length
  1707. * @return string
  1708. */
  1709. createNonce: function(length) {
  1710. var text = "";
  1711. var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  1712. for(var i = 0; i < length; i++) {
  1713. text += possible.charAt(Math.floor(Math.random() * possible.length));
  1714. }
  1715. return text;
  1716. },
  1717. generateUrlParameters: function (parameters) {
  1718. var sortedKeys = Object.keys(parameters);
  1719. sortedKeys.sort();
  1720. var params = "";
  1721. var amp = "";
  1722. for (var i = 0 ; i < sortedKeys.length; i++) {
  1723. params += amp + sortedKeys[i] + "=" + parameters[sortedKeys[i]];
  1724. amp = "&";
  1725. }
  1726. return params;
  1727. },
  1728. parseResponseParameters: function (response) {
  1729. if (response.split) {
  1730. var parameters = response.split("&");
  1731. var parameterMap = {};
  1732. for(var i = 0; i < parameters.length; i++) {
  1733. parameterMap[parameters[i].split("=")[0]] = parameters[i].split("=")[1];
  1734. }
  1735. return parameterMap;
  1736. }
  1737. else {
  1738. return {};
  1739. }
  1740. },
  1741. generateOauthParametersInstance: function(consumerKey) {
  1742. var nonceObj = new jsSHA(Math.round((new Date()).getTime() / 1000.0), "TEXT");
  1743. var oauthObject = {
  1744. oauth_consumer_key: consumerKey,
  1745. oauth_nonce: nonceObj.getHash("SHA-1", "HEX"),
  1746. oauth_signature_method: "HMAC-SHA1",
  1747. oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
  1748. oauth_version: "1.0"
  1749. };
  1750. return oauthObject;
  1751. }
  1752. };
  1753. }]);