rxjs5 Observable.ajax игнорирует явно установленные заголовки HTTP

Я становлюсь мокрым от понижения наблюдаемого и аутентификации OAuth2. Я застрял в точке, где мне нужно POST добавить заголовок авторизации в мой HTTP-запрос. Заголовок не был добавлен. Вместо этого я вижу любые настраиваемые имена заголовков как значения Access-Control-Request-Headers, и все.

Это наблюдаемый в редуксе "эпик":

const epicAuth = function(action$){
  return action$.ofType(DO_AUTHENTICATE)
    .mergeMap(
      action => Rx.Observable.ajax( authRequest(action.username, action.password))
        .map( response => renewTokens(response))
        .catch(error => Rx.Observable.of({
          type: AJAX_ERROR,
          payload: error,
          error: true,
        }))
    )
}

Это мой объект запроса:

const authRequest = function(username, password){
  return {
    url: TOKEN_PROVIDER + '?grant_type=password&username=' + username + '&password=' + password,
    method: 'POST',
    responseType: 'json',
    crossDomain: true,
    withCredentials: true,
    headers: {
      'Authorization': 'Basic <base64-encoded-user@password>',
    }
  }
}

Заголовки HTTP захвачены:

http://localhost:8082/api/oauth/token?grant_type=password&username=xxx&password=yyy

OPTIONS /api/oauth/token?grant_type=password&username=xxx&password=yyy HTTP/1.1
Host: localhost:8082
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: authorization
Origin: http://localhost:3000
DNT: 1
Connection: keep-alive

HTTP/1.1 401 
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
WWW-Authenticate: Basic realm="MY_REALM/client"
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1098
Date: Wed, 01 Nov 2017 17:57:38 GMT

Все заканчивается 401 ответом, поскольку заголовок авторизации не был отправлен. Я проверил конечную точку Oauth2 вручную с помощью инструмента Postman, и все прошло хорошо: у меня есть действующий токен доступа, я могу его обновить и т. Д. CORS включен на стороне сервера.

Что мне здесь не хватает?

1 ответ

Код клиента работает правильно.

Вы перехватили запрос OPTIONS cors, который спрашивает сервер, можно ли отправить POST заголовок авторизации (см. Access-Control-Request-Headers: authorization).

Убедитесь, что вы правильно настроили CORS на своем сервере. Он не должен пытаться аутентифицировать вызовы OPTIONS. Вместо этого он должен отправлять правильный ответ, который сообщает браузеру, разрешено ли ему выполнять вызов POST.

Другие вопросы по тегам