Использование аутентификации с Ajax.Request

В настоящее время у меня есть приложение Palm WebOS, которое использует Ajax.Request для подключения к веб-службе с использованием базовой проверки подлинности. Чтобы отправить имя пользователя и пароль, я просто включаю его в URL-адрес (т.е. http://username:password@ip-address:port/), который работает очень хорошо, за исключением случаев, когда пароль содержит что-либо, кроме буквенно-цифровых символов (например, недавно у меня был пользователь по электронной почте, который включил "@" и "&" в его пароле, и он не смог подключиться, потому что символы не обрабатывались должным образом для URL-адреса). Есть ли способ отправить учетные данные в URL-адресе, чтобы я мог разрешить пользователям использовать в своих паролях что-то, кроме буквенно-цифровых?

    var username = cookie.get().servers[this.serverIndex].username;
    var password = cookie.get().servers[this.serverIndex].password;
    this.auth = 'Basic ' + Base64.encode(username + ':' + password);
    var baseUrl = 'http://' + url + ':' + port + '/gui/';
    this.baseUrl = baseUrl;


    var request = new Ajax.Request(this.tokenUrl, {
        method: 'get',
        timeout: 2000,
        headers: {
            Authorization: this.auth
        },
        onSuccess: successFunc,
        onFailure: this.failure.bind(this)
    });

Ответ (я удалил URL из соображений безопасности):

{"request": {"options": {"method": "get", "asynchronous": true, "contentType": "application/x-www-form-urlencoded", "encoding": "UTF-8", "parameters": {}, "evalJSON": true, "evalJS": true, "timeout": 2000, "headers": {"Authorization": "Basic c3VubW9yZ3VzOmZyb2dneUAlMjY="}}, "transport": {"readyState": 4, "onloadstart": null, "withCredentials": false, "onerror": null, "onabort": null, "status": 401, "responseXML": null, "onload": null, "onprogress": null, "upload": {"onloadstart": null, "onabort": null, "onerror": null, "onload": null, "onprogress": null}, "statusText": "", "responseText": "", "UNSENT": 0, "OPENED": 1, "HEADERS_RECEIVED": 2, "LOADING": 3, "DONE": 4}, "url": ""

person Nick DeMayo    schedule 21.07.2010    source источник


Ответы (2)


Отправьте информацию для базовой аутентификации с заголовком: http://coderseye.com/2007/how-to-do-http-basic-auth-in-ajax.html

var auth = 'Basic ' + Base64.encode(user + ':' + pass);
Ext.Ajax.request({
    url : url,
    method : 'GET',
    headers : { Authorization : auth }
});
person Imre L    schedule 21.07.2010
comment
Хорошо, попробовал это, и я получаю ошибку 401 ... отредактировал свой пост с помощью моего вызова Ajax.Request и моего ответа ... - person Nick DeMayo; 21.07.2010
comment
Хорошо, у меня все заработало! Мне пришлось изменить заголовки на requestHeaders, и все отлично работает! Спасибо! - person Nick DeMayo; 21.07.2010

Вы можете попробовать закодировать имя пользователя и пароль до их отправки, используя encodeURIComponent.

В более общем плане, тестировали ли вы этот метод в IE8? Потому что он больше не работает для обычных запросов - схема username:password@ отключена по соображениям безопасности.

Однако может быть, что они все еще разрешены в запросах Ajax.

person Pekka    schedule 21.07.2010
comment
Я попытался использовать encodeURIComponent, и он преобразовал &, но не @, поэтому он все равно не работал. Кроме того, нет необходимости тестировать его в IE8 ... это приложение для Palm WebOS, поэтому оно будет работать только там ... - person Nick DeMayo; 21.07.2010
comment
@sunmorgus странно - он определенно должен кодировать @. Но, возможно, он все же будет интерпретирован как часть URL-адреса. - person Pekka; 21.07.2010