2015-12-21 4 views
0

У меня есть страница входа, которая отправляет учетные данные пользователя контроллеру входа. Но перед авторизацией пользователя мне нужно «открыть» сеанс и получить действительный идентификатор сессии.

Моей главной проблемой, однако, является обработка события ошибки на this.openUserSessionAPI позвоните ниже. То есть, я возвращаю $q.reject() на событие $http.error(), но он не пузырится по стеклу, как я ожидал.

Вот поток:

1) Пользователь вводит учетные данные и нажимает кнопку "Login", который вызывает в LoginCtrl функции loginUser()

2) Я сразу называют ИНГ userService.initUserSession, чтобы получить действительный SESSIONID ,

3) В случае успеха, а затем вызвать в loginService.authUser 4) Если недействительных SESSIONID, то мне нужно вернуть $q.reject и сообщение на дисплее «Не удалось открыть сеанс пользователя»

***** КОД ДЕТАЛИ ** ***

Обратите внимание, что первый я "INIT" приложение в that.initRzr, то я называю that.openUserSession ниже:

this.initUserSession = function initSession($rootScope, username) {  
 

 
var deferred = $q.defer(); 
 
deferred.notify("Establishing Session ID..."); 
 

 
$rootScope.userID = username; 
 
var that = this; 
 
this.getRazorInitParams().then(function (razorEnvJson) { 
 
\t 
 
\t that.initRzr(razorEnvJson).then(function (data) { 
 
\t \t 
 
\t \t if (data.status.match(/SUCCESS/g)) { 
 
\t \t \t 
 
\t \t \t // ******** OPEN USER SESSION *********** 
 
\t \t \t that.openUserSession(razorEnvJson).then(function (data) { 
 
\t \t \t \t // ... some code omitted here. 
 
\t \t \t \t deferred.resolve(sessionID); 
 
\t \t \t \t return sessionID; 
 
\t \t \t }); 
 
\t \t } 
 
\t }, function (error) { 
 
       // *** I NEVER HIT LINE !!! *** 
 
\t \t deferred.reject('Could not open user session.'); 
 
\t }); 
 
}); 
 
return deferred.promise; 
 
}

**** ОТКРЫТЫЙ пользовательскому сеансу ***

Примечание: Я ударять .error() код здесь, как я могу видеть консольный вход сообщение «Не удается открыть сеанс пользователя с помощью API кал ... ». Тем не менее, обработка, кажется, останавливается здесь, и мой экран входа в систему просто зависает с иконкой spinner.

this.openUserSession = function (razorEnvParams) { 
 
    
 
\t // init some variables here... 
 
\t 
 
\t var url = "http://" + _domain + ":" + _port + controllerpath + "?userid=" + user + "&pass=" + pass; 
 
\t var deferred = $q.defer(); 
 
\t deferred.notify("Opening user session..."); \t 
 
\t 
 
\t $http({ 
 
\t \t method: 'GET', 
 
\t \t encoding: 'JSON', 
 
\t \t headers: { 
 
\t \t \t 'Access-Control-Allow-Origin': 'true', 
 
\t \t \t 'Content-Type': 'application/json' 
 
\t \t }, 
 
\t \t withCredentials: true, 
 
\t \t url: url 
 
\t }).success(function (data, status, headers, config) { \t \t 
 
\t \t deferred.resolve(data); 
 
\t }).error(function (data, status, headers, config) { 
 
\t \t console.log("Cannot open a user session via api call. Errors details: " + data); 
 
\t \t deferred.reject("Could not open a user session."); 
 
\t }); 
 
\t return deferred.promise; 
 
}

Я буду стараться улучшить этот пост, если неясно. Пожалуйста, сообщите ...

благодарит заранее.

Боб

**** **** UPDATE

Согласно ответу JB Nizet в поле ниже, я пропускал обратный вызов ошибки that.openUserSession. Я добавил function(error) ниже, и он работал, как ожидалось.

Теперь я перейду к предложению JB.

this.initUserSession = function initSession($rootScope, username) {  // ESTABLISH A RAGE CONNECTION AND SESSION ID ! 
 

 
var deferred = $q.defer(); 
 
deferred.notify("Establishing Rage Session ID..."); 
 

 
var that = this; 
 
this.getRazorInitParams().then(function (razorEnvJson) { 
 

 
\t that.initRazor(razorEnvJson).then(function (data) { 
 
\t \t 
 
\t \t if (data.status.match(/SUCCESS/g)) { 
 
\t \t \t that.openUserSession(razorEnvJson).then(function (data) { 
 
\t \t \t \t 
 
\t \t \t \t deferred.resolve(sessionID); 
 
\t \t \t \t return sessionID; 
 
\t \t \t }, function (error) { 
 
\t \t \t \t deferred.reject('Could not open user session.'); 
 
\t \t \t }); 
 
\t \t } 
 
\t }, function (error) { // **** ADDED ERROR HANDLING *** 
 
\t \t deferred.reject('Could not initial a user session.'); 
 
\t }); 
 
}); 
 
return deferred.promise; 
 
}

ответ

2

openUserSession() выходит из строя, и вы не имеете никакого обратного вызова ошибки для этой неудачи, так что обещание никогда не решен и не отвергается.

Эта ошибка, и большая ошибка, вызвана использованием вами promise antipattern. Вместо этого используйте цепочку:

that.getRazorInitParams() 
    .then(that.initRzr) 
    .then(that.openUserSession) 
    .catch(function() { ... }); 

Не нужно создавать отложенные и разрешающие его. Просто используйте цепочку. Например, openUserSession() можно заменить

this.openUserSession = function (razorEnvParams) { 

    var url = "http://" + _domain + ":" + _port + controllerpath; 
    return $http({ 
     method: 'POST', 
     encoding: 'JSON', 
     headers: { 
      'Access-Control-Allow-Origin': 'true', 
      'Content-Type': 'application/json' 
     }, 
     withCredentials: true, 
     url: url, 
     params: { 
      userid: user, 
      pass: pass 
     } 
    }).then(function (response) {  
     return response.data; 
    }); 
} 

Кроме того, никогда не использовать GET для передачи секретных учетных данных: они будут в конечном итоге, в виде обычного текста, во всех видах журналов. И никогда не объединяйте параметры. Они должны быть закодированы, а Angular - для вас, используя params.

+0

абсолютно согласованный ре: запрос GET. Это все еще в режиме dev, и процесс безопасности будет переработан в ближайшее время. –

+0

как вы сказали выше. У меня не было обратного вызова. Теперь он работает, когда я добавил 'function (error)' to' that.openUserSession'. Я также продолжу перекодировать это, чтобы придерживаться принципа цепочки. –

+0

Я также использовал POST для других вещей, поэтому я только что закончил преобразовывать этот GET в POST. Он работает, если я использую 'data: {..}', однако с 'params {..}' У меня проблема в моем контроллере C# из-за использования JObject'-ex/'public HttpResponseMessage Post (JObject dashboardObj) '. Объект JObject в основном показывает значение Null. Я создам для этого еще одну запись, так как это очень важное изменение. –