Angular POST to Spring Security JWT登录始终返回未经授权的

Angular POST to Spring Security JWT登录始终返回未经授权的,spring,angular,authentication,jwt,Spring,Angular,Authentication,Jwt,我已经建立了一个无状态Spring安全应用程序,它使用JWT令牌进行身份验证。我启动了该应用程序,并尝试使用使用POST方法(我尝试了表单数据和x-www-form-urlencoded)插入数据库的凭据通过Postman登录,该应用程序运行成功,它返回JWT令牌和过期时间。然而,当我试图通过Angular发布到同一个URL时,我总是未经授权;错误的凭证,无论我是否使用正确的用户名密码组合 我试着用3种方式发布: 1. @Injectable() 导出类身份验证服务{ 构造函数(专用http:H

我已经建立了一个无状态Spring安全应用程序,它使用JWT令牌进行身份验证。我启动了该应用程序,并尝试使用使用POST方法(我尝试了表单数据和x-www-form-urlencoded)插入数据库的凭据通过Postman登录,该应用程序运行成功,它返回JWT令牌和过期时间。然而,当我试图通过Angular发布到同一个URL时,我总是未经授权;错误的凭证,无论我是否使用正确的用户名密码组合

我试着用3种方式发布:

1.
@Injectable()
导出类身份验证服务{
构造函数(专用http:HttpClient){
}
登录(用户名:string,密码:string):可观察{
返回此.http.post(environment.api+'/auth/login'{
“用户名”:用户名,
“密码”:密码
});
}
}
2.
login(用户名:string,密码:string):可观察{
让body='username='+username+'&password='+password;
let headers=新的HttpHeaders();
headers.set('Content-Type','x-www-form-urlencoded');
返回此.http.post(environment.api+'/auth/login',body{
标题:标题
});
}
3.
login(用户名:string,密码:string):可观察{
let body=新的URLSearchParams();
body.set('username',username);
设置('password',password);
返回此.http.post(environment.api+'/auth/login',body);
}

但每一个方法都会返回401:Unauthorized,就好像我的用户名和密码总是错误的一样(我会一直尝试使用适用于Postman的正确方法)。我做错了什么?

这里我分享了我的Angulare登录服务的一部分,它向运行在localhost 8181下的Spring登录控制器发送登录请求。我希望这会有所帮助

import { Injectable } from '@angular/core';
import {Http, Headers} from '@angular/http';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class LoginService {

  constructor(private http: Http) { }

  sendCredential(username: string, password: string) {
    let url = "http://localhost:8181/token";
    let encodedCredentials = btoa(username+":"+password);
    let basicHeader = "Basic "+encodedCredentials;
    let headers = new Headers ({
        'Content-Type' : 'application/x-www-form-urlencoded',
        'Authorization' : basicHeader
    });

    return this.http.get(url, {headers: headers});

  }

发现问题的原因是HttpClient本身由于未知原因无法正确发送post数据。使用Http服务进行了尝试,效果良好。

考虑使用CORS@georgesvanCORS已经设置好了,我的请求会一直执行,但它不允许我进行身份验证…这有一点不同,因为我不使用基本身份验证,我的是无状态的。不管怎样,我发现了错误,这是由于HttpClient服务造成的。恢复到Http服务,效果非常好!我也使用http
login(username: string, password: string): Observable<any> {
    let body = 'username=' + username + '&password=' + password;
    let headers = new HttpHeaders();
    headers.set('Content-Type', 'x-www-form-urlencoded');
    return this.http.post(environment.api + '/auth/login', body, {
      headers: headers
    });
  }
login(username: string, password: string): Observable<any> {
    let body = new URLSearchParams();
    body.set('username', username);
    body.set('password', password);
    return this.http.post(environment.api + '/auth/login', body);
  }
import { Injectable } from '@angular/core';
import {Http, Headers} from '@angular/http';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class LoginService {

  constructor(private http: Http) { }

  sendCredential(username: string, password: string) {
    let url = "http://localhost:8181/token";
    let encodedCredentials = btoa(username+":"+password);
    let basicHeader = "Basic "+encodedCredentials;
    let headers = new Headers ({
        'Content-Type' : 'application/x-www-form-urlencoded',
        'Authorization' : basicHeader
    });

    return this.http.get(url, {headers: headers});

  }