小编Ema*_*ahl的帖子

Restlet CorsFilter与ChallengeAuthenticator

我正在使用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 +身份验证)?

提前致谢!

authentication restlet cors angularjs

2
推荐指数
1
解决办法
607
查看次数

标签 统计

angularjs ×1

authentication ×1

cors ×1

restlet ×1