2015-01-28 1 views
2

Я создаю RESTful API с базой Restlet и нуждаюсь в нем для работы с междоменными вызовами (CORS), а также базовой аутентификацией.Restort CorsFilter с ChallengeAuthenticator

В настоящее время я использую CorsFilter, который выполняет работу по обеспечению поддержки моего веб-сервиса CORS. Но, когда я пытаюсь использовать это с помощью простого ChallengeAuthenticator с базовой аутентификацией HTTP, он не будет работать, как я хочу, (с веб-сайта).

Когда я обращаюсь к веб-сервису напрямую через Chrome, он работает по назначению, но когда я пытаюсь использовать его в небольшом веб-приложении, написанном в angularjs (jquery/javascript), и пытаюсь получить доступ к веб-сервису, это не так.

В основном происходит то, что когда запрос OPTIONS отправляется на мой веб-сервис, он не отвечает заголовками: «Access-Control-Allow-Origin», «Access-Control-Allow-Credentials» и т. Д., Поскольку он должен. Вместо этого он отправляет ответ с кодом статуса HTTP 401, в котором говорится, что аутентификация не удалась. Это потому, что аутентификатор как-то переопределяет CorsFilter?

My createInboundRoot способ можно увидеть ниже.

@Override 
     public Restlet createInboundRoot() { 
      ChallengeAuthenticator authenticator = createAuthenticator(); 
      RoleAuthorizer authorizer = createRoleAuthorizer(); 
      Router router = new Router(getContext()); 
      router.attach("/items", ItemsServerResource.class); 
      router.attach("/items/", ItemsServerResource.class); 
      Router baseRouter = new Router(getContext()); 

      authorizer.setNext(ItemServerResource.class); 
      authenticator.setNext(baseRouter); 

      baseRouter.attach("/items/{itemID}", authorizer); 
      baseRouter.attach("", router); 
      // router.attach("/items/{itemID}", ItemServerResource.class); 

      CorsFilter corsFilter = new CorsFilter(getContext()); 
      corsFilter.setNext(authenticator); 
      corsFilter.setAllowedOrigins(new HashSet(Arrays.asList("*"))); 
      corsFilter.setAllowedCredentials(true); 
      return corsFilter; 
     } 

(Авторизатор и аутентификатор код взят из «официального» Restlet руководства для авторизации и аутентификации)

Я пробовал много изменений в мой код, но ни один, который дал мне никакой удачи. Но я заметил, что при настройке аргумента «необязательно» в ChallengeAuthenticator на true (который "Indicates if the authentication success is optional") CorsFilter выполняет свою работу, но, очевидно, ChallengeAuthenticator не заботится об аутентификации клиента и позволяет чему-либо использовать защищенные ресурсы.

у кого была такая же проблема? Или вы решили это (CORS + Аутентификация в Restlet) любым другим способом?

Заранее благодарен!

+0

Это сообщение об ошибке, которое я вижу при просмотре в Chrome (где Origin является ip моего веб-сервера, на котором размещено веб-приложение): Заголовок «Нет» Access-Control-Allow-Origin »присутствует на запрошенном ресурсе Происхождение ...'поэтому не допускается доступ. Ответ получил код статуса HTTP 401. « – Emahl

ответ

6

Я думаю, что это ошибка фильтра CORE для восстановления. На самом деле фильтр использует метод afterHandle для установки заголовков CORS. См. Исходный код: https://github.com/restlet/restlet-framework-java/blob/4e8f0414b4f5ea733fcc30dd19944fd1e104bf74/modules/org.restlet/src/org/restlet/engine/application/CorsFilter.java#L119.

Это означает, что обработка CORS выполняется после выполнения всей цепочки обработки (аутентификация, ...). Таким образом, если ваша аутентификация завершилась неудачно, у вас будет код состояния 401. Это на самом деле так, поскольку запросы CORS, предварительно запрограммированные, не отправляют подсказки аутентификации.

Для получения дополнительной информации об использовании CORS с Restlet вы можете ознакомиться по этой ссылке: https://templth.wordpress.com/2014/11/12/understanding-and-using-cors/. Это может обеспечить вам обходной путь до тех пор, пока эта ошибка не будет исправлена ​​в самом Restlet.

Я открыл проблему в Github для вашей проблемы: https://github.com/restlet/restlet-framework-java/issues/1019.

Надеется, что это помогает, Тьерри

+0

Спасибо за ваш ответ! (К сожалению, я не могу проголосовать за ваш ответ.) Я посмотрю на реализацию моего собственного« CorsFilter »и посмотрю, смогу ли я избавьтесь от этой ошибки :) – Emahl

+0

Yepp, не проблема .. Кажется, теперь это работает как шарм! Ваша реализация из вашего блога была именно тем, что мне нужно. Еще раз спасибо – Emahl

+0

Рад слышать, что он решил вашу проблему. человек, который внес свой фильтр, чтобы найти решение проблемы. Оставайтесь с нами ;-) –

0

CorsService (в 2.3.1 будет завтра) содержит также свойство skippingResourceForCorsOptions, что ответы непосредственно Параметры запроса без передачи запроса на основных фильтры и серверные ресурсы.

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