Mozilla Add при попытке войти в приложение Rails, использующее Devise

У меня есть приложение Rails, которое использует Devise для аутентификации пользователя. Я разрабатываю надстройку и использую ajax. Я отправляю сообщение на свой маршрут входа в систему, отправляя параметры имени пользователя и пароля (пользователь [электронная почта] и пользователь [пароль]).

Я пытаюсь опубликовать сообщение на маршруте xml (users/sign_in.xml), поэтому получаю ответ в формате XML. Сервер Rails работает нормально и создает сеанс.

Я выполняю это из ajax, и он возвращает успех. После этого, если я попытаюсь выполнить другую службу, требующую аутентификации, она вернет ошибку, в которой говорится, что я не вошел в систему. Возможно, мне нужно сохранить файл cookie или отправить файл cookie при следующих вызовах на сервер Rails.

Из сценария содержимого я звоню:

function signInSubmit(){
    var email = $('#sign_in_email').val();
    var password = $('#sign_in_password').val();
    signIn(email, password);
}

function signIn(email, password){
    var sign_in_data = {
        'user[email]' : email,
        "user[password]" : password
    }
    var params = EncodeQueryData(sign_in_data);
    invoke("/users/sign_in", params, signInCallBack);
}

function invoke(url_method, parameters, callback){
    var url = url_api + url_method + ".xml?" + parameters;
    var req = new XMLHttpRequest();
    type = 'POST';

    req.open("POST", url, true);
    req.overrideMimeType('text/xml');
    req.onreadystatechange = function () {
        if (req.readyState == 4) {
            if (req.status == 200) {
                callback(req.responseXML);
            }else if(req.status == 201){ 
                callback(req.responseXML);
            }
        }
    };
    req.send();
}

function signInCallBack(doc){
    //This returns an XML saying that authentication was successfull.  
    // Session was created in the server
    login_session_key = doc.getElementsByTagName("email")[0].childNodes[0].nodeValue
    callMethodThatNeedsAuthentication();
}


function callMethodThatNeedsAuthentication(){
    // This method call returns a not authenticated error.
    invoke("/api/methodthatneedsauthentication", "", NeedsAuthenticationCallBack);
}

Что вы думаете?


person Tony    schedule 30.03.2012    source источник


Ответы (1)


Вы правы - если вам нужно установить и использовать сеанс с вашим приложением rails из кода SDK и поддерживать сеанс, возвращая любые данные cookie, установленные приложением rails.

Я не знаю, как работает сеанс Rails, но вам, вероятно, нужно будет захватить файл cookie сеанса, используемый rails, и повторно отправить его с последующими запросами. Я не думаю, что модуль запроса позволит вам манипулировать файлами cookie для этого (см. эту ошибку: https://bugzilla.mozilla.org/show_bug.cgi?id=741156 ), однако я знаю, что с PHP вы можете вместо этого указать сеансовый ключ в качестве параметра запроса.

person therealjeffg    schedule 31.03.2012
comment
Как я могу использовать сеанс из кода SDK? Помните, что я нахожусь в сценарии содержимого дополнения FireFox. - person Tony; 31.03.2012
comment
@Tony: Тот факт, что вы используете сценарий контента (и XMLHttpRequest, я думаю), относится к вопросу - пожалуйста, отредактируйте его, чтобы объяснить, как именно вы входите в систему. - person Wladimir Palant; 02.04.2012
comment
Мне просто кажется, что если бы у вас был хоть какой-то контроль над приложением rails, вы бы реализовали службу REST/JSON в приложении rails и реализовали клиент на основе этого. - person therealjeffg; 03.04.2012
comment
У меня есть контроль над приложением rails. Проблема в том, что он использует Devise для аутентификации, основанной на файлах cookie. Есть идеи? - person Tony; 04.04.2012
comment
Из разработки github ( github.com/plataformatec/devise ): Аутентифицируемый токен: подписывает на основе пользователя на токене аутентификации (также известном как токен единого доступа). Токен может быть предоставлен как через строку запроса, так и через базовую аутентификацию HTTP. ... похоже, вы можете аутентифицироваться, используя токены в качестве параметра запроса. - person therealjeffg; 04.04.2012