2016-02-04 2 views
0

Я использую Angular для вызова API REST Atlassian JIRA. Угловой используется в контексте приложения с ионной картой на устройстве.Поведение странного постороннего звонка

curl А как

curl -X POST 'https://url' -H 'Accept: application/json, text/plain, */*' -H 'Authorization: Basic a2someStuff' -H 'Content-Type: application/json' --data-binary '{"transition": {"id": "761"}}' 

Works и производит желаемый результат.

Однако если выполнить запрос, используя регулярные угловые

curl -X POST 'https://url' -H 'Accept: application/json, text/plain, */*' -H 'Authorization: Basic a2someStuff' -H 'X-Atlassian-Token: nocheck' -H 'User-Agent: Mozilla/5.0 (Linux; Android 5.0; Intellibook Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Safari/537.36' -H 'Content-Type: application/json' --data-binary '{"transition": {"id": "781"}}' 

создается. Я проверил, что этот завиток работает правильно , если заголовок для User-Agent удален. Есть ли какая-либо возможность в угловом исполнении для такой операции?

редактировать

здесь JS, который генерирует запрос:

Здесь секция конфигурации:

.constant('ApiEndpoint', { 
    url: 'someUrl' 
    }) 
.config(['$httpProvider', function ($httpProvider) { 

    $httpProvider.defaults.headers.common['X-Atlassian-Token'] = 'nocheck'; 
    }]) 

Здесь метод содержания:

var postData = '{"transition": {"id": "' + transition + '"}}'; 
     $http({ 
     url: ApiEndpoint.url + 'issue/' + issueKey + "/transitions", 
     method: "POST", 
     data: postData, 
     headers: { 
      'Content-Type': 'application/json' 
     } 
     }).then(function (response) { 
      //some stuff 
     }, 
+0

Вы можете предоставить javascript углового запроса HTTP? – Vardius

+0

Пожалуйста, взгляните на редактирование. –

+0

возможно удалить 'X-Atlassian-Token: nocheck'' header? в вашем вопросе у вас нет этого в 'curl' – Vardius

ответ

0

Если вы хотите удалить User-Agent header сделать это нравится:

.config(['$httpProvider', function ($httpProvider) { 
    delete $httpProvider.defaults.headers.common['User-Agent']; 
}]); 

Вот некоторая информация о Cross Site Request Forgery (XSRF) Protection для углового $http (см Соображения безопасности раздела)

XSRF is an attack technique by which the attacker can trick an authenticated user into unknowingly executing actions on your website. Angular provides a mechanism to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie (by default, XSRF-TOKEN) and sets it as an HTTP header (X-XSRF-TOKEN). Since only JavaScript that runs on your domain could read the cookie, your server can be assured that the XHR came from JavaScript running on your domain. The header will not be set for cross-domain requests.

To take advantage of this, your server needs to set a token in a JavaScript readable session cookie called XSRF-TOKEN on the first HTTP GET request. On subsequent XHR requests the server can verify that the cookie matches X-XSRF-TOKEN HTTP header, and therefore be sure that only JavaScript running on your domain could have sent the request. The token must be unique for each user and must be verifiable by the server (to prevent the JavaScript from making up its own tokens). We recommend that the token is a digest of your site's authentication cookie with a salt for added security.

The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, or the per-request config object.

In order to prevent collisions in environments where multiple Angular apps share the same domain or subdomain, we recommend that each application uses unique cookie name.

xsrfHeaderName - {строки} - имя заголовка HTTP для заполнения с маркером XSRF. xsrfCookieName - {string} - Имя файла cookie, содержащего токен XSRF.

$http({ 
     url: ApiEndpoint.url + 'issue/' + issueKey + "/transitions", 
     method: "POST", 
     data: postData, 
     headers: { 
      'Content-Type': 'application/json' 
     }, 
     xsrfHeaderName: 'XSRF-Header-Name', 
     xsrfCookieName: 'XSRF-Cookie-Name' 
     }) 
+0

К сожалению, это не сработает. Ни на устройствах, ни на ПК Странно в моем браузере (Chrome) я все равно получаю следующую ошибку: XSRF check failed –

+0

обновил мой ответ – Vardius

+0

Согласно https://developer.atlassian.com/jiradev/jira-platform/jira -architecture/authentication/form-token-handling Я обновил код до: 'headers: { 'Content-Type': 'application/json', 'X-Atlassian-Token': 'nocheck', 'xsrfHeaderName' : 'X-Atlassian-Token', 'xsrfCookieName': 'atlassian.xsrf.token' } 'Однако это не сработает. –