Restlet CorsFilter与ChallengeAuthenticator

时间:2015-01-28 15:44:10

标签: angularjs authentication cors restlet

我正在使用Restlet框架构建RESTful API,并且需要它来处理跨域调用(CORS)以及基本身份验证。

目前我正在使用CorsFilter来完成我的webservice支持CORS请求的工作。但是,当我尝试使用带有HTTP基本身份验证的简单ChallengeAuthenticator时,它不会像我想要的那样(来自网站)工作。

当我直接通过Chrome访问网络服务时,它按预期工作,但是当我在一个用angularjs(jquery / javascript)编写的小型Web应用程序中尝试它并试图访问它没有的web服务时。

基本上发生的情况是,当OPTIONS请求发送到我的网络服务时,它不会响应标题:' Access-Control-Allow-Origin',' Access-Control-Allow-证书'等应该如此。相反,它发送一个HTTP状态代码401的响应,表示身份验证失败。这是因为身份验证器以某种方式覆盖了CorsFilter吗?

我的 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;
        }

(授权者和身份验证者代码取自"官方"重定向指南以进行授权和身份验证)

我已经对我的代码进行了很多更改,但没有一个给我任何运气。但是我注意到在设置参数" optional"在ChallengeAuthenticator中为true("Indicates if the authentication success is optional"),CorsFilter完成了它的工作,但很明显,ChallengeAuthenticator并不关心验证客户端,而是让任何东西都使用受保护的资源。

有没有人有类似的问题?或者您是否以其他任何方式解决了这个问题(在Restlet中进行CORS +身份验证)?

提前致谢!

2 个答案:

答案 0 :(得分:6)

我认为这是Restlet CORS过滤器的一个错误。事实上,过滤器使用方法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

希望它有所帮助, 亨利

答案 1 :(得分:0)

CorsService(明天将在2.3.1中)还包含一个skippingResourceForCorsOptions属性,该属性直接回答Options请求,而不会将请求传输到底层过滤器和服务器资源。