Xero-Node 未定义的回调参数
Xero-Node undefined Call Back Params
我正在使用以下内容:
https://github.com/XeroAPI/xero-node
我正在使用 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;
这 returns URL 到我的 React 前端,这会触发重定向
这很好用,我正在进入 Xero Auth 页面,然后将我重定向回本地主机,我的 React 前端从后端调用 .callback.js,沿着 URL 从 Xero 过去:
{"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客户端还没有正确初始化
https://github.com/XeroAPI/xero-node/blob/master/src/XeroClient.ts#L99
正如您在下面的代码(上面链接)中看到的那样,callbackParams 函数是 openIdClient(一个 oauth2.0 库)上的一个方法 - 为了完全设置他们的客户端,您需要调用 xero.initialize()
或 xero.buildConsentUrl()
看起来你应该传回 req.url,尽管 req.body 可能仍然有效..
this.openIdClient.callbackParams(callbackUrl)
以这种方式设置是为了允许那些不需要 openid-client need/want 访问助手的人有更多不同的用例。
// This needs to be called to setup relevant openid-client on the XeroClient
await xero.initialize()
// buildConsentUrl calls `await xero.initialize()` so if you wont
// need to also call initialize() if you are sending user through auth
await xero.buildConsentUrl()
// You can also refresh the token without needing to initialize the openid-client
// helpful for background processes where you want to limit any dependencies (lambda, etc)
await xero.refreshWithRefreshToken(client_id, client_secret, tokenSet.refresh_token)
我正在使用以下内容: https://github.com/XeroAPI/xero-node
我正在使用 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;
这 returns URL 到我的 React 前端,这会触发重定向
这很好用,我正在进入 Xero Auth 页面,然后将我重定向回本地主机,我的 React 前端从后端调用 .callback.js,沿着 URL 从 Xero 过去:
{"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客户端还没有正确初始化
https://github.com/XeroAPI/xero-node/blob/master/src/XeroClient.ts#L99
正如您在下面的代码(上面链接)中看到的那样,callbackParams 函数是 openIdClient(一个 oauth2.0 库)上的一个方法 - 为了完全设置他们的客户端,您需要调用 xero.initialize()
或 xero.buildConsentUrl()
看起来你应该传回 req.url,尽管 req.body 可能仍然有效..
this.openIdClient.callbackParams(callbackUrl)
以这种方式设置是为了允许那些不需要 openid-client need/want 访问助手的人有更多不同的用例。
// This needs to be called to setup relevant openid-client on the XeroClient
await xero.initialize()
// buildConsentUrl calls `await xero.initialize()` so if you wont
// need to also call initialize() if you are sending user through auth
await xero.buildConsentUrl()
// You can also refresh the token without needing to initialize the openid-client
// helpful for background processes where you want to limit any dependencies (lambda, etc)
await xero.refreshWithRefreshToken(client_id, client_secret, tokenSet.refresh_token)