2015-01-09 2 views
1

Я пытаюсь создать гибридное мобильное приложение с ионным (угловым). Для этого приложения я делаю вызов oAuth, который зависит от jQuery, поэтому загружаются обе библиотеки, а также скрипт для oAuth и моего и моего приложения.

<script src="lib/ionic/js/ionic.bundle.js"></script> 
<script src="cordova.js"></script> 
<script src="js/jquery-1.11.1.min.js"></script> 
<script src="js/auth.js"></script> 
<script src="js/app.js"></script> 

Вызов, чтобы инициировать проверку подлинности осуществляется в ионном готовом событии в app.js, как показано ниже:

функция
$ionicPlatform.ready(function(){ 
    oAuthProcess.authorize({ 
    client_id: 'client', 
    client_secret: 'secret', 
    scope: 'scope', 
    redirect_uri: 'fake url' 
    }).done(function(data){ 
    localStorage.setItem('accessToken', data.access_token); 
    localStorage.setItem('refreshToken', data.refresh_token); 
    var accessToken = localStorage.getItem("accessToken"); 
    alert(accessToken); 
    }).fail(function(data){alert(data.error);}); 
}); 

oAuthProcess находится в файле auth.js, который выглядит, как показано ниже. Он открывает inAppBrowser выполнить аутентификацию, а затем следует закрыть его возвращение маркера доступа к приложению, чтобы призывающие API:

var oAuthProcess = { 
    authorize: function(options) { 
    var deferred = $.Deferred(); 
    var authUrl = 'some url' + $.param({ 
    client_id: options.client_id, 
    redirect_uri: options.redirect_uri, 
    response_type: 'code', 
    scope: options.scope 
    }); 
    //Open inAppBrowser with authUrl 
    var authWindow = window.open(authUrl, '_blank', 'location=no,toolbar=no'); 
    authWindow.addEventListener('loadstart', function(e) { 
    var url = '' + e.url + ''; 
    //Upon opening in     
    var code = url.match(/\?code=(.+)$/); 
    var error = url.match(/\?error=(.+)$/); 
    if (code != null || error != null) { 
     authWindow.close(); 
    } 
    if (code) { 
     $http({ 
     method: 'POST', 
     url: 'some url', 
     data: {code: code[1], client_id: options.client_id, client_secret: options.client_secret, redirect_uri: options.redirect_uri, grant_type: 'authorization_code'} 
     }).success(function(data) { 
     deferred.resolve(data); 
     }).error(function(data){ 
     deferred.reject(response.responseJSON); 
     }); 
    } else if (error) { 
     deferred.reject({ 
     error: error[1] 
     }); 
    } 
    }); 
    return deferred.promise(); 
} 

};

Приложение может загружать inAppBrowser и создавать токен, однако предоставляется следующая ошибка, которая останавливает токен от возврата в приложение после закрытия inAppBrowser.

2015-01-09 16: 48: 04,299 MYAPP [2146: 483400] Ошибка успеха callbackId: InAppBrowser85303841: ReferenceError: Не удается найти переменную: $ HTTP

Любая помощь решению этого или альтернативный подход будет очень признателен.

Заранее спасибо.

+0

'$ http' не является чем-то, что отображается на глобальном объекте. Вам нужно будет использовать инъекцию зависимостей для доступа к ней. Если вы делаете это в глобальном контексте, вам нужно будет получить доступ к '$ http' из' $ injector'. – PSL

+0

@PSL благодарит за быстрый ответ. Не могли бы вы объяснить, как я могу это сделать? Я очень новичок в угловом – Peeks

+1

Вы можете получить экземпляр http, выполнив 'var $ http = angular.injector (['ng']). Get ('$ http')' при условии, что у вас есть угловая загрузка. Также я не понимаю, в чем смысл возврата обещания от анонимного обработчика событий. – PSL

ответ

2

Я просто ввести его здесь, так что я могу показать вам пример кода, а не комментарий ...

Предполагая, что пример вы дали это весь файл auth.js, добавить, что пример PSL дал вам, так файл теперь выглядит так:

var $http = angular.injector(['ng']).get('$http'); 
var oAuthProcess = { 
    authorize: function(options) { 
    var deferred = $.Deferred(); 
    var authUrl = 'some url' + $.param({ 
    client_id: options.client_id, 
    redirect_uri: options.redirect_uri, 
    response_type: 'code', 
    scope: options.scope 
    }); 
    //Open inAppBrowser with authUrl 
    var authWindow = window.open(authUrl, '_blank', 'location=no,toolbar=no'); 
    authWindow.addEventListener('loadstart', function(e) { 
    var url = '' + e.url + ''; 
    //Upon opening in     
    var code = url.match(/\?code=(.+)$/); 
    var error = url.match(/\?error=(.+)$/); 
    if (code != null || error != null) { 
     authWindow.close(); 
    } 
    if (code) { 
     $http({ 
     method: 'POST', 
     url: 'some url', 
     data: {code: code[1], client_id: options.client_id, client_secret: options.client_secret, redirect_uri: options.redirect_uri, grant_type: 'authorization_code'} 
     }).success(function(data) { 
     deferred.resolve(data); 
     }).error(function(data){ 
     deferred.reject(response.responseJSON); 
     }); 
    } else if (error) { 
     deferred.reject({ 
     error: error[1] 
     }); 
    } 
    }); 
    return deferred.promise(); 
} 
+0

К сожалению, это не решило проблему. – Peeks

+0

вы еще не определили ошибку $ http undefined? –

Смежные вопросы