我正嘗試構建一個帶離子(角度)的混合移動應用程序。對於這個應用程序,我做了一個依賴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
任何幫助解決這或替代方法將非常感激。
在此先感謝。
'$ http'不是在全局對象上公開的東西。您將需要使用依賴注入來訪問它。如果你在全局環境中這樣做,你需要從'$ injector'訪問'$ http'。 – PSL 2015-01-09 23:07:51
@PSL感謝您的快速響應。你能否進一步解釋退出,我該怎麼做?我對角度非常陌生 – Peeks 2015-01-09 23:15:04
你可以通過'var $ http = angular.injector(['ng'])。get('$ http')'獲得http實例,只要你有角加載。另外我不明白什麼是從匿名事件處理程序返回承諾的點。 – PSL 2015-01-09 23:20:15