RESTeasy,跨域angularjs $ http和HTTP基本身份验证

时间:2014-03-20 16:34:34

标签: angularjs resteasy http-basic-authentication

有一段时间我正在玩RESTeasy和angularjs $ http电话。想法是使用角度网络应用程序使用的Web Api作为它的后端,但是那些我希望至少仅为网站提供HTTP基本身份验证的呼叫,因为不会有任何用户帐户等等。到目前为止,我设法做的是REST服务在mozilla中使用Poster附加组件调用时使用身份验证(“授权”:“基本user_pass_Base64_hash”标头)。但是当我尝试通过angularjs $ http进行连接时问题就出现了。这是一个角度调用代码:

$http({
        url:'http://serverurl/rest/anouncements/announce/1',
        method: 'GET',
        headers: {'Authorization':'Basic someBase64Hash'}

        })

        .success(function(data){

            // do something with data

        }) ;

通过Servlet过滤器我通过添加这些标题来修改响应:

response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");

并检查用户:是否在数据库中存在从哈希解码的密码。

我真的不知道我能做些什么才能让它发挥作用,我已经尝试了很多我在其他帖子或文档中读过的内容。可以请任何人帮忙吗? Resteasy版本为2.2.3,角度为1.2.10。

谢谢,Michal

1 个答案:

答案 0 :(得分:0)

好的,经过一番挣扎,我弄清楚到底发生了什么;)

也许我对此的体验会对某人有所帮助。

正如我之前提到的,我使用扩展javax.servlet.Filter的类来控制响应头。在doFilter(..)方法I中,检查请求方法是否为OPTIONS。如果是这样,那么我添加这些标题:

((HttpServletResponse) response).addHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
((HttpServletResponse) response).addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");

但如果没有,我会做我的授权(解析base64字符串,检查db以获取传递的凭据),如果没问题,请将Content-Type标头设置为我希望在我的角度代码中从服务器获得的响应:< / p>

((HttpServletResponse) response).addHeader("Content-Type", "application/json");

并将请求和响应对象传递给javax.servlet.Filter超类中的doFilter方法:

chain.doFilter(request, response);

虽然,我不会过滤OPTIONS请求。

当然,如果我在DB中检查凭据失败,我会从响应中发送403。

在角度我只做简单

$http.get('someUrl').then(function(response){
 // do something with promise
});

在每个请求中添加我的base64哈希&#39;授权&#39;头:

$http.defaults.headers.common.Authorization = 'Basic a3J6YXE0OmtyemFxNjY2' ;

在这两种情况下,无论是请求方法还是OPTIONS,我都会将此标题添加到响应中:

response.addHeader("Access-Control-Allow-Origin", "*");

当然,没有什么可以阻止您直接指定允许与之开展业务的来源:)

我希望这会有所帮助,当然还有任何意见和建议值得赞赏!

干杯,米哈尔!