1

Я создаю приложение Angular2 с Spring-MVC. Я добавил аутентификацию с помощью Spring Security, и когда я запрашиваю свой сервер REST с почтальоном, все в порядке. Когда я добавляю Authorization в мой заголовок в Angular2, я получаю ошибку 401.Ошибка аутентификации Angular2 с 401

Ошибка: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401

сервис My Angular2:

@Injectable() 
export class BookService { 
    headers = new Headers(); 
    options = new RequestOptions({ headers: this.headers }); 

    constructor(
    private http: Http) { 
     this.headers.append('Content-Type', 'application/json'); 
     this.headers.append('Authorization', 'Basic ' + btoa('nirgn:password')); 
    } 

    getBooksByCategory(categoryId: number) { 
    return this.http.get(environment.baseUrl + 'categories/' + categoryId + '/books', this.options) 
     .map((res: Response) => <Book[]>res.json()._embedded.books) 
     .catch(this.handleError); 
    } 
} 

Весной я позволяю все происхождения, как это: response.addHeader("Access-Control-Allow-Origin", "*");CORSFilter implements Filter класс).

Кроме того, я добавил проверку подлинности, как это:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.httpBasic().and().authorizeRequests().anyRequest().authenticated(); 
} 

И когда я удалить .and().authorizeRequests().anyRequest().authenticated() я не получаю сообщение об ошибке, и в состоянии GET данные с сервера.

Итак, в целом я уверен, что это не Access-Control-Allow-Origin, и это потому, что сервер не получает мой заголовок авторизации. Когда я пытаюсь запросить сервер у почтальона, без auth, я также получаю 401, но когда я добавляю Basic auth, я получаю 200.

Я также проверяю вывод пароля в почтальоне и в angualr2, чтобы убедиться, что 'Basic ' + btoa('nirgn:password') в angualr2 выдает тот же пароль почтальона, и это то же самое. Вот он: enter image description here

ответ

1

Так что мне удалось разобраться. В конце концов, это был CORS (весной).

Я должен был сказать мой configure класс использовать CORSFilter я создал как

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.httpBasic().and().authorizeRequests().anyRequest().authenticated() 
     .and().addFilterAfter(new CORSFilter(), CsrfFilter.class); 
} 

Странная вещь, которую я до сих пор не понимаю, почему с почтальоном она была успешной и в браузере (с угловым) I получить ошибку.

Смежные вопросы