2015-01-09 35 views
1

我正嘗試構建一個帶離子(角度)的混合移動應用程序。對於這個應用程序,我做了一個依賴jQuery的oAuth調用,以便加載這兩個庫,以及oAuth和我的以及我的應用程序的腳本。

$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文件,它看起來象下面這樣:

<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離子ready事件完成。它打開了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年1月9日16:48:04.299對myApp [2146:483400]在成功callbackId錯誤:InAppBrowser85303841:的ReferenceError:找不到變量:$ HTTP

任何幫助解決這或替代方法將非常感激。

在此先感謝。

+0

'$ http'不是在全局對象上公開的東西。您將需要使用依賴注入來訪問它。如果你在全局環境中這樣做,你需要從'$ injector'訪問'$ http'。 – PSL 2015-01-09 23:07:51

+0

@PSL感謝您的快速響應。你能否進一步解釋退出,我該怎麼做?我對角度非常陌生 – Peeks 2015-01-09 23:15:04

+1

你可以通過'var $ http = angular.injector(['ng'])。get('$ http')'獲得http實例,只要你有角加載。另外我不明白什麼是從匿名事件處理程序返回承諾的點。 – PSL 2015-01-09 23:20:15

回答

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 2015-01-11 13:20:52

+0

你得到$ http未定義錯誤仍然? – 2015-01-12 03:28:14

相關問題