调用Indeed API获取认证token时fetch请求返回400错误排查
问题原因
你现在的代码存在3个核心问题:
- 错误设置了
mode: 'no-cors':该模式下浏览器会限制你读取响应内容,返回的opaque类型响应默认状态码为0,你无法拿到真实的接口返回结果,同时跨域请求如果没有目标服务的CORS授权,前端直接调用本身就会触发跨域拦截。 - 请求头和请求体格式不匹配:你声明了
Content-Type: application/x-www-form-urlencoded,但实际body传入的是JSON序列化后的字符串,和声明的格式完全不符,服务端无法正确解析参数,所以返回400错误。 - 严重安全隐患:client_credentials授权模式严禁在前端调用,你将client_secret明文写在前端代码中,任何人都可以直接获取你的凭证滥用API权限。
临时测试修复方案
如果只是本地临时调试,可以修改代码如下:
fetch(`https://apis.indeed.com/oauth/v2/tokens`, { method: 'POST', headers: { 'Accept':'application/json' }, body: new URLSearchParams({ client_id:'10efaf31aee65fb0b3dfe149c1e7c902c6c909bd02b1bec27c0a1ba1ae600bd4', client_secret:'Mtabdk9KbUulH9WQSvK5dvm3FTDWRflWJXjpcHiqNn4KozUBXRfBMA02MnTl01uK', grant_type:'client_credentials', scope:'employer_access' }) }) .then(response => response.json()) .then(data => { console.log(data); }) .catch(error => { console.log(error); })
如果调试时仍然出现跨域错误,说明Indeed的API没有开放前端跨域调用权限,这是正常现象,该接口本身就设计为服务端调用。
生产环境正确方案
所有client_credentials授权流程必须在你的后端服务中完成,前端只需要向后端请求已经生成好的access token即可,绝对不要将client_secret暴露到前端环境。
内容的提问来源于stack exchange,提问作者Piotr Ciebień
相关产品推荐
相关产品推荐

