http响应中缺少Angular2 JWT授权标头(已添加CORS支持)

时间:2017-03-08 14:48:00

标签: spring http angular http-headers cors

我正在尝试使用JWT(Json Web Token)进行授权。在前端我在后端Spring REST api上使用Angular2。我在后端添加了CORS过滤器。

在http请求中,我发送用户名和密码,并在响应的“授权”标题中期望令牌。当我使用Postman时,一切正常,我收到所有标题,包括'授权'。

此外,当我在Chrome控制台中记录流量时(在通过表单进行用户登录时)“响应”中存在“授权”标题,因此很明显它会返回到浏览器。但是当我在我的角度应用程序中列出标题时,数组中只有几个标题:

   // auth.service.ts

   login(username, password): Observable<boolean> {

    // call remote service to authenticate user        
     return this.http.post(this.authUrl, JSON.stringify({ username: username, password: password }))
        .map((response: Response) => {

            console.log("Authorization header: " + response.headers.get('Authorization'));
            console.log("all headers: " + response.headers.keys());

            // TODO - login successful if there's a jwt token in the response

        });     
} 

这两个控制台输出的结果是:

 Authorization header: null 

 all headers: Pragma,Cache-Control,Expires

以下是Google Chrome控制台的屏幕截图,您可以在其中看到所有需要的标题都出现在客户端:

Chrome console

服务器端令牌生成(Spring Boot):

public void addAuthentication(HttpServletResponse response, String username) throws UnsupportedEncodingException {
    // Token generation
    String JWT = Jwts.builder()
            .setSubject(username)
            .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
            .signWith(SignatureAlgorithm.HS512, secret.getBytes("UTF-8"))
            .compact();

    response.addHeader(headerString, tokenPrefix + " " + JWT);
}

有没有人有一些有用的建议?

由于

SOLUTION:

public class CORSFilter implements Filter{


    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        response.setHeader("Access-Control-Expose-Headers", "Authorization");
        chain.doFilter(req, response);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

}

1 个答案:

答案 0 :(得分:7)

Authorization标题已存在,但由于它是自定义标题,浏览器不允许您直接访问它,即使Chrome会看到它。

要解决您在cors config中需要一个更重要的标题。

Access-Control-Expose-Headers: Authorization, CustomHeader2, e.tc

请务必公开您希望应用有权访问的任何其他自定义标头。