Странная ошибка CORS, запрашивающая JIRA REST API

Я пытаюсь разработать проект визуализации D3 для наших плат JIRA, но я преодолел первое препятствие. У меня проблемы с аутентификацией и получением списка досок JIRA.

Этот код полностью на стороне клиента и находится в Angular 2 RC 3. Мой сервис выглядит так:

public authenticate( username:string, password:string ):void {
    let encodedAuth:string = window.btoa( `${username}:${password}` );
    this.headers = new Headers();
    this.headers.append( 'Content-Type', 'application/json' );
    this.headers.append( 'Authorization', `Basic ${encodedAuth}` );
}

public getAllBoards():Observable<Boards> {
    return this.http.get( `http://${this.host}/rest/agile/1.0/board`, this.headers )
        .map( response => response.json() as Boards )
}

и код в моем компоненте выглядит так:

constructor( protected jiraService:JIRAService ) {
    this.jiraService.authenticate('me@you.com', 'password');
    this.jiraService.getAllBoards().subscribe(
        boards => this.boards = boards
    );
}

К сожалению, это создает то, что выглядит как ошибка CORS в моем браузере:

XMLHttpRequest cannot load https://myjira.atlassian.net/rest/agile/1.0/board. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 401.

... что немного неожиданно. Этот же URL в браузере работает нормально. Изучая запрос в Charles, я вижу ошибку "Прокси-сервер SSL не включен для этого хоста: включить в настройках Proxy, местоположения SSL", но на самом деле не могу найти этот параметр. Мне все равно, если я не вижу это на самом деле в Чарльзе, я просто хочу, чтобы это работало!

Я перепробовал несколько пакетов npm JIRA, но ни один из них не замечательный и не предназначен для разработки на стороне сервера.

Любая помощь с благодарностью.

1 ответ

Эта ошибка появляется при обращении к ней из приложения, которое изначально было загружено с другого URL-адреса. Если вы загружаете новую страницу с этого "другого" URL-адреса, это не относится к ситуации CORS, поскольку начальная загрузка страницы уже с этого URL-адреса.

Сервер должен предоставить ожидаемые заголовки CORS для браузера, чтобы разрешить этот запрос. Это не проблема Angular, а только проблема с сервером.

Обходные пути

  • JSONP (не поддерживает пользовательские заголовки)
  • обеспечить поддержку на стороне сервера, где ваше приложение Angular обращается к вашему серверу, который затем перенаправляет на другой сервер, а затем перенаправляет ответ, который он получает на ваше приложение Angular.
Другие вопросы по тегам