我正在使用Restlet框架构建RESTful API,并且需要它来处理跨域调用(CORS)以及基本身份验证.
目前我正在使用CorsFilter,它负责使我的webservice支持CORS请求.但是,当我尝试使用带有HTTP基本身份验证的简单ChallengeAuthenticator时,它将无法正常工作(来自网站).
当我直接通过Chrome访问网络服务时,它按预期工作,但是当我在一个用angularjs(jquery/javascript)编写的小型Web应用程序中尝试它并尝试访问web服务时,它没有.
基本上会发生的事情是,当OPTIONS请求发送到我的Web服务时,它不会响应标题:'Access-Control-Allow-Origin','Access-Control-Allow-Credentials'等应该如此.相反,它发送一个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;
}
Run Code Online (Sandbox Code Playgroud)
(授权者和身份验证者代码取自"官方"重定向指南,用于授权和身份验证)
我已经对我的代码进行了很多更改,但没有一个给我任何运气.但我注意到,当在ChallengeAuthenticator中将参数"optional"设置为true("表示身份验证成功是否可选")时,CorsFilter会完成其工作,但很明显,ChallengeAuthenticator不关心对客户端进行身份验证,并允许任何使用受保护的内容资源..
有人有过类似的问题吗?或者您是否以任何其他方式解决了这个问题(在Restlet中进行CORS +身份验证)?
提前致谢!