angularjs - 带有 ChallengeAuthenticator 的 ReSTLet CorsFilter

标签 angularjs authentication cors restlet

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

目前我正在使用 CorsFilter它负责使我的网络服务支持 CORS 请求。但是,当我尝试将其与具有 HTTP 基本身份验证的简单 ChallengeAuthenticator 一起使用时,它不会像我希望的那样工作(来自网站)。

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

基本上发生的事情是,当一个 OPTIONS 请求被发送到我的网络服务时,它不会响应 header :'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;
        }

(授权者和认证者代码取自“官方”reSTLet 授权和认证指南)

我已经尝试对我的代码进行大量更改,但没有一个给我任何运气。但我注意到,当将 ChallengeAuthenticator 中的参数“可选”设置为 true("Indicates if the authentication success is optional")时,CorsFilter 完成了它的工作,但显然 ChallengeAuthenticator 并不关心对客户端进行身份验证并让任何东西使用 protected 资源..

有人遇到过类似的问题吗?或者您是否以任何其他方式解决了这个问题(ReSTLet 中的 CORS + 身份验证)?

提前致谢!

最佳答案

我认为这是 ReSTLet CORS 过滤器的错误。事实上,过滤器使用方法 afterHandle 来设置 CORS header 。查看源代码: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 的更多详细信息,您可以查看此链接:https://templth.wordpress.com/2014/11/12/understanding-and-using-cors/ .在 ReSTLet 本身修复此错误之前,这可以为您提供解决方法。

我在 Github 上为你的问题开了一个问题:https://github.com/restlet/restlet-framework-java/issues/1019 .

希望对你有帮助 蒂埃里

关于angularjs - 带有 ChallengeAuthenticator 的 ReSTLet CorsFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28196426/

相关文章:

AngularJS 如何抽象一个服务?

javascript - 将值从子指令隔离范围传递到父指令隔离范围并触发父指令监视

angularjs - 如何使用 ui-router 1.0.x 测试转换钩子(Hook)

javascript - 用于创建 Canvas 并下载为图像的 Angular 指令

rust - 尝试在 rust api上实现rocket_cors CorsOptions

android - 我应该在 Android 客户端中验证 OAuth2 token ,还是 App Engine 本身会根据传递给后端 API 的凭据对用户进行身份验证?

ios - 在哪里可以找到有关 iOS 应用程序中安全网络的教程?

java - 即使数据库已填充,ResultSet.next() 是否有可能返回空?

python - Angular2 和 Django : CSRF Token Headache

jquery - Safari Ajax cors 请求不遵循重定向