2013-10-24 3 views
14

Прежде чем я совершу перекрестный вызов домена на сервер с стеком службы, я успешно аутентифицирован и получаю свой токен.ajax вызов перекрестного домена jquery не отправляет заголовок авторизации

Теперь я хочу сделать еще один вызов для получения данных:

$.ajax({ 
    beforeSend: function(xhr) {     
     xhr.setRequestHeader('Authorization', 'Basic ' + getToken()); 
    }, 
    type: "GET", 
    url: requestUrl, 
    xhrFields: { 
     withCredentials: true 
    }, 
    async: true, 
    dataType: 'json', 
    crossDomain: true 
}) 

Когда я смотрю в моем Google Chrome Dev инструментов консоли я вижу это:

OPTIONS http://MyPc.company:82//customers 404 (Not Found) 
OPTIONS http://MyPc.company:82//customers Invalid HTTP status code 404 

XMLHttpRequest cannot load http://MyPc.company:82//customers. 
Invalid HTTP status code 404 (index):1 

Когда я смотрю в стельку я вижу этот запрос:

Inspectors => Auth: Нет заголовка авторизации.

Инспектора => Сырье:

OPTIONS http://MyPc.company:82//customers HTTP/1.1 
Host: MyPc.company:82 
Connection: keep-alive 
Cache-Control: no-cache 
Pragma: no-cache 
Access-Control-Request-Method: GET 
Origin: http://MyPc.company 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36 
Access-Control-Request-Headers: access-control-allow-origin, accept, access-control-allow-headers, authorization, access-control-allow-methods, content-type 
Accept: */* 
Referer: http://MyPc.company/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4 

Почему заголовок авторизации не отправляется? Это кажется на первый взгляд проблемой происхождения для меня.

+0

Вы не имеете никакого контроля над заголовками, посланных с предполетным (OPTIONS) запросом. Прочитайте предварительный просмотр здесь: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Preflighted_requests –

+0

@RayNicholus "... поскольку настраиваемый заголовок установлен, этот запрос предварительно задан." Итак, теперь я знаю, что выполняю предполетный запрос, потому что я использую authorizationheader? Но как еще можно отправить токен на токен, чтобы проверить его? – HelloWorld

+0

Вы можете прочитать это [ответ] (http://stackoverflow.com/questions/18991417/accessing-servicestack-authenticated-service-using-ajax/19006908#19006908), возможно, он решает вашу проблему. – stefan2410

ответ

3

В JavaScript

 jQuery.support.cors = true; 

    function make_base_auth(user, password) { 
     var tok = user + ':' + password; 
     var hash = btoa(tok); 
     return "Basic " + hash; 
    } 
    function DoTest() { 
      var TestRequest = new Object(); 
      TestRequest.name = "Harry Potter";    
      TestRequest.Id = 33; 
     var username = "admin"; 
     var password = "test"; 
     $.ajax({ 
      type: 'Post', 
      contentType: 'application/json', 
      cache: false, 
      async: false, 
      url: serverIP + '/TestAPI/'+ TestRequest.Id, 
      data: JSON.stringify(TestRequest), 
      dataType: "json",     
      beforeSend: function (xhr) {      
      xhr.setRequestHeader("Authorization", make_base_auth(username, password)); 
      }, 
     success: function (response, status, xhr) { 
       var s= response.message;  
      }, 
      error: function (xhr, err) { 
       alert(xhr.statusText); 
      } 
     }); 
    } 

Конфигурация службы должна быть включена для CORS как

   Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization")); 

может быть, мой предыдущий answer может помочь вам.

Или еще лучше следующее сообщение в блоге от Community Resources

CORS BasicAuth on ServiceStack with custom authentication

+0

Я сравнил ваш код JS с моим, и все, что важно, похоже на то же, за исключением того, что вы не установили crossDomain = true. Когда я смотрю на вашу конфигурацию Servicestack, вы правы, я не могу вспомнить, что CorsFeature имеет авторизацию, как разрешеноHeaders, но я сомневаюсь, что это моя проблема. Моя проблема заключается в том, что ни один заголовок не отправляется вообще, что означает, что я могу настроить то, что хочу на стороне сервера, вправо? Но все же я проверю конфигурацию своего сервиса с подсказкой. – HelloWorld

+0

Я только что видел, что у вас есть также: jQuery.support.cors = true; поэтому я думаю, что это то же самое, что и crossDomain = true, как я установил? – HelloWorld

+0

Я думаю, что это сервисная конфигурация. Если вы прокомментируете атрибут [Аутентификация] из своей службы, он работает нормально? О jQuery.support.cors = true; да. – stefan2410

Смежные вопросы