Xero SDK - 状态参数的 OAuth 实现

Xero SDK - OAuth implementation of state parameter

我目前已经实现了一个 NodeJs,用 xero-node sdk 包表达 api,我 运行 遇到了一个问题,它似乎没有 OAuth 状态参数未被使用(尽管我看到它被定义为 XeroClient 构造函数的可选参数:

export interface IXeroClientConfig {
  clientId: string,
  clientSecret: string,
  redirectUris: string[],
  scopes: string[],
  state?: string
}

谁能确认这是否已实施?

我假设它会像这样工作:

const xero = new XeroClient({
  clientId: xeroParams.clientId,
  clientSecret: xeroParams.clientSecret,
  redirectUris: [xeroParams.redirectUrl],
  scopes: xeroParams.scopes.split(' '),
  state: this.callback_state,
});

//then when building the consent url like this, the state param would be included
const consentUrl = await xero.buildConsentUrl();

然后当回调被触发时,我希望能够访问 state code 作为查询参数之一。一些沿线解释 here

我已经看到返回的 session_state 参数,但这与我提供的州代码不匹配。

以下是使用 xero-node SDK 通过 OAuth 流程传递状态的方法:

https://github.com/SerKnight/xero-node-basic-app/blob/master/index.js#L37

示例:

  • 首先生成 consentUrl,然后附加您的自定义参数。
app.get('/connect', async function(req, res) {
  try {
    let consentUrl = await xero.buildConsentUrl();
    res.redirect(consentUrl + "&state=THIS_IS_A_STANDARD_OAUTH_2_STATE_PARAMETER"); // Append any type of state/params you would like
  } catch (err) {
    res.send("Sorry, something went wrong");
  }
})

...

app.get('/callback', async function(req, res) {
  let url = redirectUri + req.originalUrl;

  console.log('req.query: ', req.query) // this will the the same state/params you passed to the API

  // ...do api stuff..
  // ref: https://github.com/XeroAPI/xero-node-oauth2-app

  res.send(req.query);
})

https://github.com/SerKnight/xero-node-basic-app/blob/master/index.js#L37

值得注意的是 XeroClient 的可选 state: 参数是为 openidclient 东西保留的。不要使用它。只需将其附加到同意 url.