使用 Web3.js HttpProvider 调用 API 时如何向 Ankr 提供凭据?

How to provide credentials to Ankr when calling the API with Web3.js HttpProvider?

我正在尝试访问 Ankr API 地址,例如:

https://apis.ankr.com/XXXX/YYYY/full/main

当通过浏览器访问这个link时,我可以输入我在Ankr面板控件上创建的凭据,我可以成功通过。但是现在我正在尝试在节点上使用 Web3.js 来做到这一点:

var options = {
    headers: [
        {
            name: 'Authorization',
            value: 'Basic myUsername:myPassword',
        },],};

const web3 = new Web3(new Web3.providers.HttpProvider('https://apis.ankr.com/XXXX/YYYY/full/main', options))

并且我收到了 401 未经授权的错误响应。我假设我的凭据是正确的,因为我可以通过浏览器上的 link 访问它们,但在传递 header 时它们似乎不起作用。代码有什么问题或缺少什么?

您需要传递 myUsername:myPassword 的 base64,而不是实际的明文。

// base64 encoded
value: 'Basic ' + Buffer.from('myUsername:myPassword').toString('base64'),

有关详细信息,请参阅 MDN docs

问题是凭据必须以某种方式进行哈希处理。

我不知道这是否是最合适的解决方案,但我最终通过浏览器访问地址(https://apis.ankr.com/XXXX/YYYY/full/main)解决了这个问题,在Chrome上打开开发工具,并登录介绍我的证书。

然后我通过检查请求的 HEADER(在 Chrome 上,在 Network>therequest>Request Headers>authorization 中完成)获得了请求中发送的散列凭证。我只是 copy/pasted js 代码上的这个散列凭证并且它有效!