无法在Android手机上检索Moodle的访问令牌

时间:2016-12-09 11:46:09

标签: android angularjs moodle

我已经基于Jason Watmore's example创建了一个身份验证服务,它可以在Android的Ripple模拟器中正常运行,登录,将令牌保存到jStorage,并使用它来访问其他Web服务。

直到昨天,它还在实际的Android手机中工作。

我已经测试过jStorage是否可以在我的Android手机中运行(确实如此),并且我已尝试使用“设置”删除所有应用的数据。

知道为什么Android手机没有从Moodle服务器获取令牌(但是模拟器获取它)?

这是我的服务:

myApp.factory('AuthenticationService',
   ['$http', '$cookies', '$rootScope', '$timeout', '$log',
   function ($http, $cookies, $rootScope, $timeout, $log) {
       var service = {};

       service.Login = function (username, password, callback) {

           //$log.info('Login function called');

           if ((username.length && password.length) && (username !== '' && password != '')) {

               var loginUrl = 'https://my.moodle.url/local/token.php';

               // use $.param jQuery function to serialize data from JSON
               var data = $.param({
                   username: username,
                   password: password,
                   service: 'brookesid_ws'
               });
               //$log.info(data);
               var config = {
                   headers: {
                       'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
                   }
               }

               $http.post(loginUrl, data, config)
                       .success(function (data, status, headers, config) {
                           $log.info(data);
                           myToken = data.token;
                           dataString = JSON.stringify(data);
                           if (dataString.indexOf('error') > 0) {

                               $rootScope.className = 'error';
                               $rootScope.PostDataResponse = 'Invalid user credentials, please try again';
                               $rootScope.isAuthenticated = false;
                               $rootScope.dataLoading = false;
                           }
                           else {
                                $.jStorage.set('session', myToken, { TTL: 28800000 });
                               //$cookies.put('session', myToken);
                           }

                           $rootScope.isAuthenticated = true;
                          // $log.info('isAuthenticated = true');
                           callback(dataString);
                       })
                       .error(function (data, status, header, config) {
                           $rootScope.isAuthenticated = false;
                           $rootScope.ResponseDetails = "data: " + data +
                                   "<br />status: " + status +
                                   "<br />headers: " + header +
                                   "<br />config: " + config;
                           responsedata = JSON.stringify(data);
                           callback(responsedata);
                           $log.info('error: '+responsedata);
                       });
           } else {

               $rootScope.className = 'error';
               $rootScope.isAuthenticated = false;
               $rootScope.PostDataResponse = 'Please enter a username and password';
           }

       };

       service.SetCredentials = function (sessionToken) {

           var JSONObject = JSON.parse(sessionToken);
           var key = 'token';
           myToken = JSONObject[key];
           $log.info('session Token: ' + sessionToken);
           $log.info('myToken: ' + myToken);
           $rootScope.globals = {
               currentUser: {
                   token: myToken
               }
           };

           $http.defaults.headers.common['Authorization'] = 'Basic ' + sessionToken; // jshint ignore:line

           //retrieve last login date and then update it
           $rootScope.lastLogin = $.jStorage.get('lastLogin', '');
           var today = new Date();
           epochToday = Math.round(today.getTime() / 1000);
           $.jStorage.set('lastLogin', epochToday, { TTL: 28800000 });
           //$log.info('Rootscope Last Login: '+$rootScope.lastLogin);

           $.jStorage.set('globals', $rootScope.globals, { TTL: 28800000 });
           $.jStorage.set('session', myToken, { TTL: 28800000 });
           $.jStorage.set('loginStatus', 'logged in', { TTL: 28800000 });

           $log.info('Token (jStorage) ' + $.jStorage.get('session', ''));
           //$log.info('Last login (jStorage) ' + $.jStorage.get('lastLogin', ''));
           //$log.info('Login status (jStorage) ' + $.jStorage.get('loginStatus', ''));
       };

       service.ClearCredentials = function () {
           $rootScope.globals = {};
           //$cookies.remove('globals');
           //$cookies.remove('session');
           $.jStorage.deleteKey('globals');
           $.jStorage.deleteKey('session');
           $http.defaults.headers.common.Authorization = 'Basic ';
       };

       return service;
   }])

这是我的登录控制器:

 .controller('loginCtrl',
 ['$scope', '$rootScope', '$location', 'AuthenticationService', '$routeParams', '$http',
 function ($scope, $rootScope, $location, AuthenticationService, $routeParams, $http) {

     $scope.login = function () {
         $scope.dataLoading = true;
         AuthenticationService.Login($scope.username, $scope.password, function (response) {
             responsedata = JSON.stringify(response);
             /* error handling*/
             if (responsedata.indexOf('error') > 0 || responsedata.indexOf('invalid') > 0) {
                 $scope.error = response.message;
                 $rootScope.className = 'error';
                 $rootScope.dataLoading = false;

             } else {
                 AuthenticationService.SetCredentials(response);
                 console.log('response: '+response);
                 $location.path('/home');
             };

         });
     };

     $scope.logout = function () {
         $rootScope.dataLoading = false;
         $rootScope.hideMe = true;
         $rootScope.PostDataResponse = '';
         $rootScope.ResponseDetails = '';
         //alert('logging out');
         AuthenticationService.ClearCredentials();
     };

     $scope.showMenuPanel = function () {
         $scope.hideMenuPanel = false;
     };

     $scope.doHideMenuPanel = function () {
         $scope.hideMenuPanel = true;
         $rootScope.PostDataResponse = '';
     };
 }])

1 个答案:

答案 0 :(得分:0)

实际上是Cordova应用程序URL whitelisting settings造成了这个问题。