Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Xero节点未定义回调参数_Javascript_Node.js_Oauth 2.0_Xero Api - Fatal编程技术网

Javascript Xero节点未定义回调参数

Javascript Xero节点未定义回调参数,javascript,node.js,oauth-2.0,xero-api,Javascript,Node.js,Oauth 2.0,Xero Api,我正在使用以下工具: 我正在使用React应用程序,与Nodejs后端对话。React应用程序调用节点文件connect.js,如下所示: // connect.js (node module) const XeroClient = require('xero-node').XeroClient; async function connect(req, res, next) { try { const xero = new XeroClient({ clientId: '9........

我正在使用以下工具:

我正在使用React应用程序,与Nodejs后端对话。React应用程序调用节点文件connect.js,如下所示:

// connect.js (node module)
const XeroClient = require('xero-node').XeroClient;
async function connect(req, res, next) {
try {
const xero = new XeroClient({
  clientId: '9.............(hidden for SO)',
  clientSecret: 'p...........(hidden for SO)',
  redirectUris: [`http://localhost:3000/xeroCallback`],
  scopes: 'openid profile email accounting.transactions offline_access'.split(" ")
});
let consentUrl = await xero.buildConsentUrl();
res.send(consentUrl);
} catch (err) {
console.log(err);
}
}
module.exports = connect;
这会将URL返回到我的React前端,从而触发重新定向

这很好,我转到Xero Auth页面,然后将我重新定向回localhost,在那里我的React前端从后端调用.callback.js,并从Xero发送URL:

{"http://localhost:3000/xeroCallback?code":"3......(hidden for SO)","scope":"openid profile email accounting.transactions","session_state":"E.........(hidden for SO)"}
这是我在callback.js中的代码

// callback.js (node module)
const { TokenSet } = require('openid-client');
const XeroClient = require('xero-node').XeroClient;
 async function callback(req, res) {
  const xero = new XeroClient({
  clientId: '9.............(hidden for SO)',
  clientSecret: 'p...........(hidden for SO)',
  redirectUris: [`http://localhost:3000/xeroCallback`],
  scopes: 'openid profile email accounting.transactions offline_access'.split(" ")
 });
 try {
  await xero.initialize()
  const TokenSet = await xero.apiCallback(req.body);
  res.send(TokenSet);
 } catch (err) {
   console.log(err);
 }
}
module.exports = callback;

在“const TokenSet=await xero.apiCallback(req.body);”中出现错误,“给我”访问令牌未定义!“

因此,错误是因为Xero客户端尚未正确初始化

正如您在下面的代码(链接在上面)中所看到的,callbackParams函数是openIdClient(oauth2.0库)上的一个方法-为了完全设置它们的客户端,您需要调用
xero.initialize()
xero.buildApproveUrl()
看起来您还应该传回req.url,尽管req.body可能仍然有效

this.openIdClient.callbackParams(callbackUrl)
通过这种方式进行设置,可以为那些不需要/不想通过需要openid客户端访问帮助程序的人提供更多不同的用例

//需要调用此命令在XeroClient上设置相关的openid客户端
等待xero.initialize()
//BuildApproveURL调用“wait xero.initialize()”,如果您不愿意
//如果通过身份验证发送用户,还需要调用initialize()
等待xero.buildApproverURL()
//您还可以刷新令牌,而无需初始化openid客户端
//有助于限制任何依赖项(lambda等)的后台进程
等待xero.refreshWithRefreshToken(客户端\u id、客户端\u机密、令牌集.RefreshToken)

因此,错误是因为Xero客户端尚未正确初始化

正如您在下面的代码(链接在上面)中所看到的,callbackParams函数是openIdClient(oauth2.0库)上的一个方法-为了完全设置它们的客户端,您需要调用
xero.initialize()
xero.buildApproveUrl()
看起来您还应该传回req.url,尽管req.body可能仍然有效

this.openIdClient.callbackParams(callbackUrl)
通过这种方式进行设置,可以为那些不需要/不想通过需要openid客户端访问帮助程序的人提供更多不同的用例

//需要调用此命令在XeroClient上设置相关的openid客户端
等待xero.initialize()
//BuildApproveURL调用“wait xero.initialize()”,如果您不愿意
//如果通过身份验证发送用户,还需要调用initialize()
等待xero.buildApproverURL()
//您还可以刷新令牌,而无需初始化openid客户端
//有助于限制任何依赖项(lambda等)的后台进程
等待xero.refreshWithRefreshToken(客户端\u id、客户端\u机密、令牌集.RefreshToken)

啊,我明白了-谢谢!我输入了'xero.initialize()'并且它可以工作,但是现在我得到了“访问令牌未定义”。我在节点服务器上有一个React应用程序,使用一个Connect JS文件和一个回调JS文件。我是否应该将这些结合起来,在回调的同一文件/函数中使用“xero.buildApproveURL()”?嗯,您是否有从用户calback保存的有效访问令牌(令牌集的一部分)?在进行api调用之前,需要在客户端上设置访问令牌。。您是否已签出示例节点应用程序?它有大量的示例用法:如果您从授权流返回并调用
.apiCallback
-这应该在客户端上设置访问令牌(+整个令牌集,包括刷新令牌),但是如果您只是在用户已经授权您后在另一个进程中设置客户端,您需要调用
等待xero.setTokenSet(tokenSet)
在客户端上设置正确的令牌集。谢谢,我已经编辑了我的问题。基本上,我的工作流程是到达后端,使用“xero.buildApproveURL”获取xero re direct URL。一旦我在Xero中单击Authorization,它就会将我带回我的应用程序,调用后端模块“callback”,我将其与“Xero.apiCallback”一起使用-假设这就是生成访问令牌的原因?因此,基本上,我是第一次尝试授权,我假设使用Xero给我的url调用“wait Xero.apiCallback(url);”,应该给我一个填充了访问令牌的令牌集吗?否则,我会有点困惑,我应该在哪里/如何获得访问权?啊,我明白了-谢谢!我输入了“xero.initialize()”,它可以工作,但是现在我得到了“访问令牌未定义”。我在节点服务器上有一个React应用程序,使用一个Connect JS文件,然后是一个回调JS文件。我应该将这些文件结合起来,在回调的同一文件/函数中使用“xero.buildApproveURL()”?嗯,你有有效的访问令牌吗(令牌集的一部分)是从用户calback保存的?在进行api调用之前,您需要在客户端上设置访问令牌。您是否签出了示例节点应用程序?它有大量示例用法:如果您从授权流返回并调用
。apiCallback
,则应该设置访问令牌客户端上的(+整个令牌集,包括刷新令牌),但如果用户已经授权您,您只是在另一个进程中设置客户端,则需要调用
wait xero.setTokenSet(令牌集)
在客户端上设置正确的令牌集。谢谢,我已经编辑了我的问题。基本上,我的工作流程将到达我的后端,使用“xero.BuildApproveURL”获取我的xero re direct URL。一旦我在xero中单击“授权”,它将带我回到我的应用程序,该应用程序调用后端模块“回调”,我将其与“xero.apiCallback”一起使用-假设这就是生成访问令牌的原因?因此,基本上,我是第一次尝试授权,并且我假设使用url Xer调用“wait xero.apiCallback(url);”