ajax忽略显式设置的HTTP头

ajax忽略显式设置的HTTP头,ajax,oauth-2.0,rxjs,rxjs5,redux-observable,Ajax,Oauth 2.0,Rxjs,Rxjs5,Redux Observable,我的脚被redux observable和OAuth2认证弄湿了。我被困在了一个点上,我必须将授权头添加到我的HTTP请求中。未添加标题。相反,我将任何自定义集合头名称视为访问控制请求头的值,仅此而已 这是一部可观察到的“史诗”: const epicAuth = function(action$){ return action$.ofType(DO_AUTHENTICATE) .mergeMap( action => Rx.Observable.ajax( aut

我的脚被redux observable和OAuth2认证弄湿了。我被困在了一个点上,我必须将授权头添加到我的HTTP请求中。未添加标题。相反,我将任何自定义集合头名称视为访问控制请求头的值,仅此而已

这是一部可观察到的“史诗”:

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>',
    }
  }
}
由于未发送授权标头,因此所有结果都是401响应。我已经用Postman工具手动测试了Oauth2端点,一切都很顺利:我有一个有效的访问令牌,可以续订它,等等。CORS在服务器端启用


我这里缺少什么?

客户端代码工作正常

您已经捕获了选项cors请求,它询问服务器是否可以发布授权头(请参阅
访问控制请求头:授权

确保已在服务器上正确配置CORS。它不应该尝试验证选项调用。相反,它应该发送一个正确的响应,告诉浏览器是否允许进行POST调用

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