在预检/ OPTIONS

时间:2016-05-02 16:05:42

标签: javascript ajax http oauth cors

我有一个客户端JS应用程序正在签署OAuth1.0a GET请求我们自己的内部API。我知道通常你会使用代理服务器或其他东西来做这件事,但要做到限制我们必须在客户端做这一切(使用oauth-1.0a签署请求)。

我不是CORS问题的专家,一般来说,当这个问题出现在后端团队设置Access-Control-Allow-Origin: *时,一切都按预期工作,我们称之为一天。遗憾的是问题仍然存在,我认为问题的根源在于我对CORS / OAuth请求的理解上的差距。

下面是一个将请求包装在Promise中的函数:

const fetch = (url) => {
  //  the request data to be signed
  const reqData = { method: 'GET', url: url };

  //  now we sign the request
  //  more details on this method: https://github.com/ddo/oauth-1.0a 
  const auth = oauth.authorize(reqData);

  //  generates the auth headers for us
  const authHeader = generateAuthHeaders(auth);

  //  returns a promise that:
  //  - resolves if valid data it returned
  //  - rejects if request fails for any reason
  return new Promise((res, rej) => {
    const r = new XMLHttpRequest();
    r.open('GET', url, true);

    //  Setting to true results in this error:
    //  "A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true."
    r.withCredentials = false;

    //  Adding the Authorization request header
    r.setRequestHeader('Authorization', authHeader);

    //  Listen for a response
    r.onreadystatechange = () => {
      if (r.readyState === 4) {
        if (r.status === 200) {
          return res(r.responseText);
        }
        return rej(new Error(`Request to ${url} failed!`));
      }
    };
    r.send(null);
  });
};

大约一半的时间可以工作并按预期返回数据。但其余的时间它在预检OPTIONS请求中出现401错误而失败。为什么每次都不会发生这个问题?我做错了什么?

修改 后端团队已正确设置服务器/负载平衡器,因此这不是错误配置平衡器中的一台服务器的问题。

0 个答案:

没有答案