带有 ChallengeAuthenticator 的 Restlet CorsFilter
Restlet CorsFilter with ChallengeAuthenticator
我正在使用 Restlet 框架构建 RESTful API 并需要它来处理跨域调用 (CORS) 以及基本身份验证。
目前我正在使用 CorsFilter 来完成让我的网络服务支持 CORS 请求的工作。但是,当我尝试将其与具有 HTTP 基本身份验证的简单 ChallengeAuthenticator 一起使用时,它不会像我希望的那样工作(来自网站)。
当我通过 Chrome 直接访问 Web 服务时,它按预期工作,但是当我在用 angularjs (jquery/javascript) 编写的小型 Web 应用程序中尝试它并尝试访问时它没有的网络服务。
基本上发生的事情是,当一个 OPTIONS 请求发送到我的网络服务时,它不会响应 headers:'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;
}
(授权者和认证者代码取自 "official" restlet 授权和认证指南)
我已经尝试对我的代码进行很多更改,但是 none 这给了我一些运气。但我注意到,当将 ChallengeAuthenticator 中的参数 "optional" 设置为 true("Indicates if the authentication success is optional")时,CorsFilter 完成了它的工作,但显然 ChallengeAuthenticator 并不关心对客户端进行身份验证并让任何东西使用受保护的资源。 .
有没有人遇到过类似的问题?或者您是否以任何其他方式解决了这个问题(CORS + Restlet 中的身份验证)?
提前致谢!
我认为这是 Restlet CORS 过滤器的错误。事实上,过滤器使用方法 afterHandle
来设置 CORS headers。查看源码:https://github.com/restlet/restlet-framework-java/blob/4e8f0414b4f5ea733fcc30dd19944fd1e104bf74/modules/org.restlet/src/org/restlet/engine/application/CorsFilter.java#L119.
这意味着 CORS 处理是在执行整个处理链(身份验证,...)之后完成的。因此,如果您的身份验证失败,您将获得状态代码 401。实际上就是这种情况,因为 CORS 预检请求不会发送身份验证提示。
有关在 Restlet 中使用 CORS 的更多详细信息,您可以查看此 link:https://templth.wordpress.com/2014/11/12/understanding-and-using-cors/。在 Restlet 本身修复此错误之前,这可以为您提供解决方法。
我在 Github 中针对你的问题打开了一个问题:https://github.com/restlet/restlet-framework-java/issues/1019。
希望对您有所帮助,
蒂埃里
CorsService(在明天发布的 2.3.1 中)还包含一个 skippingResourceForCorsOptions 属性,它直接回答 Options 请求,而不会将请求传输到底层过滤器和服务器资源。
我正在使用 Restlet 框架构建 RESTful API 并需要它来处理跨域调用 (CORS) 以及基本身份验证。
目前我正在使用 CorsFilter 来完成让我的网络服务支持 CORS 请求的工作。但是,当我尝试将其与具有 HTTP 基本身份验证的简单 ChallengeAuthenticator 一起使用时,它不会像我希望的那样工作(来自网站)。
当我通过 Chrome 直接访问 Web 服务时,它按预期工作,但是当我在用 angularjs (jquery/javascript) 编写的小型 Web 应用程序中尝试它并尝试访问时它没有的网络服务。
基本上发生的事情是,当一个 OPTIONS 请求发送到我的网络服务时,它不会响应 headers:'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;
}
(授权者和认证者代码取自 "official" restlet 授权和认证指南)
我已经尝试对我的代码进行很多更改,但是 none 这给了我一些运气。但我注意到,当将 ChallengeAuthenticator 中的参数 "optional" 设置为 true("Indicates if the authentication success is optional")时,CorsFilter 完成了它的工作,但显然 ChallengeAuthenticator 并不关心对客户端进行身份验证并让任何东西使用受保护的资源。 .
有没有人遇到过类似的问题?或者您是否以任何其他方式解决了这个问题(CORS + Restlet 中的身份验证)?
提前致谢!
我认为这是 Restlet CORS 过滤器的错误。事实上,过滤器使用方法 afterHandle
来设置 CORS headers。查看源码:https://github.com/restlet/restlet-framework-java/blob/4e8f0414b4f5ea733fcc30dd19944fd1e104bf74/modules/org.restlet/src/org/restlet/engine/application/CorsFilter.java#L119.
这意味着 CORS 处理是在执行整个处理链(身份验证,...)之后完成的。因此,如果您的身份验证失败,您将获得状态代码 401。实际上就是这种情况,因为 CORS 预检请求不会发送身份验证提示。
有关在 Restlet 中使用 CORS 的更多详细信息,您可以查看此 link:https://templth.wordpress.com/2014/11/12/understanding-and-using-cors/。在 Restlet 本身修复此错误之前,这可以为您提供解决方法。
我在 Github 中针对你的问题打开了一个问题:https://github.com/restlet/restlet-framework-java/issues/1019。
希望对您有所帮助, 蒂埃里
CorsService(在明天发布的 2.3.1 中)还包含一个 skippingResourceForCorsOptions 属性,它直接回答 Options 请求,而不会将请求传输到底层过滤器和服务器资源。