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