使用 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