我有一个客户端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错误而失败。为什么每次都不会发生这个问题?我做错了什么?
修改 后端团队已正确设置服务器/负载平衡器,因此这不是错误配置平衡器中的一台服务器的问题。