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

Posted

技术标签:

【中文标题】使用 Angular 和 spring 进行 Jwt 身份验证【英文标题】:Jwt authentication with Angular and spring 【发布时间】:2017-11-25 17:38:46 【问题描述】:

我正在使用 JWT 令牌为我的 Angular 应用程序构建身份验证。 对于对其余 api 的任何请求,我希望 spring MVC 检查 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);
    

我有什么遗漏吗?

【问题讨论】:

【参考方案1】:

我现在没有时间尝试分析代码,但我向您推荐 GitHub 中的 project,它展示了一个使用 JWT 和 Java 的简单登录系统。我以它为例在我的一些系统中实现了 JWT,它运行良好。希望对您有所帮助。

【讨论】:

【参考方案2】:

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

实际上,我发现我的 Angular 没有在请求标头中发送标头 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);
    

【讨论】:

以上是关于使用 Angular 和 spring 进行 Jwt 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

带有 Spring Security 登录和身份验证的 Angular

发布请求不适用于 Spring 安全性和 Angular 5

如何保护 Angular 和 Spring 应用程序

Spring Security和Angular 5

如何使用 Rest 和 Spring 安全性通过 ldap 登录 Angular?

如何使用 Spring Security + Angular 登录/验证