使用Intuit-Oauth Node库调用API时如何正确传递access_token?
问题原因
你当前的报错来自两个核心逻辑错误:
/callback接口中createToken是异步Promise操作,你没有等待该操作完成就执行了跳转,导致前端跳转后调用/getCompanyInfo时,access_token还未完成赋值,仍然是初始的null值。- 你手动构造的
Authorization请求头格式不符合要求,头字段的值应为Bearer <token>的字符串格式,你写的嵌套对象结构无法被服务端正确识别。
另外你使用的intuit-oauth SDK本身会自动存储已获取的token,无需手动提取后再传参,手动传参反而容易出现格式错误。
修正方案
1. 调整/callback接口的异步逻辑
将跳转逻辑移入createToken的成功回调中,保证token处理完成后再执行跳转:
app.get("/callback", function (req, res) { console.log('it got here') oauthClient .createToken(req.url) .then(function (authResponse) { oauth2_token_json = JSON.stringify(authResponse.getJson(), null, 2); // token已自动存储在oauthClient实例中,无需手动提取赋值 res.redirect("http://localhost:3000/companyInfo" ); }) .catch(function (e) { console.error(e); res.status(500).send("授权失败:" + e.message); }); });
2. 简化/getCompanyInfo接口
移除手动配置的授权头,SDK的makeApiCall方法会自动拼接符合要求的授权信息:
app.get("/getCompanyInfo", (req, res) => { // 增加授权状态校验,避免未授权访问时报错 if(!oauthClient || !oauthClient.isTokenValid()) { return res.status(401).send("未授权,请先完成授权流程"); } let companyID = oauthClient.getToken().realmId; let url = oauthClient.environment == "sandbox" ? OAuthClient.environment.sandbox : OAuthClient.environment.production; oauthClient .makeApiCall({ url: url + "v3/company/" + companyID + "/companyinfo/" + companyID }) .then(function (authResponse) { console.log("API调用响应为:" + JSON.stringify(authResponse)); res.send(JSON.parse(authResponse.text())); }) .catch(function (e) { console.error(e); res.status(500).send("接口调用失败:" + e.message); }); });
如果你确实需要手动传递授权头,正确的格式如下:
headers:{ 'Authorization': 'Bearer ' + access_token }
内容的提问来源于stack exchange,提问作者Josh Simon
相关产品推荐
相关产品推荐

