繁体   English   中英

使用Angular和spring进行Jwt身份验证

[英]Jwt authentication with Angular and spring

我正在使用JWT令牌为我的角应用构建身份验证。 对于对其余api的任何请求,我希望spring httpC检查http请求标头中的令牌,除非http请求是/ login(创建新令牌)。

我的cors过滤器有问题。 用户成功登录后,它将发送401状态。 不考虑在“授权”标题中发送的令牌。

angular service

getListe(): Promise<any> {
        let header = new Headers();
        header.append("authorization", localStorage.getItem("token"))
        return this.http.get(URL_API_REST + 'liste', header)
            .toPromise()
            .then(response => response.json())
            .catch(this.handleError);
    }

Spring Cors Filter

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request= (HttpServletRequest) req;

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");
        response.setHeader("Access-Control-Expose-Headers", "x-requested-with");

        if(!request.getRequestURI().equals("/rest/rest/login")) {
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");
            response.setStatus(HttpServletResponse.SC_OK);
        }

        /*if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
*/
        chain.doFilter(req, res);
    }

Spring Authentication Filter

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request= (HttpServletRequest) servletRequest;

        String token = request.getHeader("token");
        if(token != null){
            System.out.println("Présence d'un token");
        }
        else{
            if(!request.getRequestURI().equals("/rest/rest/login"))
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
        }
        filterChain.doFilter(request, response);
    }

我有什么遗失的吗?

我没有时间去尝试,现在来分析代码,但是我建议你这个项目在GitHub上,显示使用智威汤逊和Java简单的登录系统。 我已经用它作为一个例子在我的一些系统中实现JWT并且它工作得很好。 希望能帮助到你。

我很难处理这个问题,但我希望答案能为一些人节省时间。

实际上,我发现我的角度没有在请求标头中发送标头authorization 为了解决这个问题,我在我的服务Angular中使用了RequestOptions

service Angular

getListe(): Promise<any> {
        let header = new Headers();
        header.append("authorization", localStorage.getItem("token"))
        let options = new RequestOptions({headers: header})
        return this.http.get(URL_API_REST + 'liste', options)
            .toPromise()
            .then(response => response.json())
            .catch(this.handleError);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM