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

Posted

技术标签:

【中文标题】使用 Web3.js HttpProvider 调用 API 时如何向 Ankr 提供凭据?【英文标题】:How to provide credentials to Ankr when calling the API with Web3.js HttpProvider? 【发布时间】:2021-07-31 08:30:20 【问题描述】:

我正在尝试访问 Ankr API 地址,类似于:

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

通过浏览器访问此链接时,我可以引入我在 Ankr 面板控件上创建的凭据,并且可以成功通过。但是现在我正在尝试使用 Node 上的 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 Unauthorized 错误响应。我认为我的凭据是正确的,因为我可以通过浏览器上的链接访问它们,但在传递标头时它们似乎不起作用。代码有什么问题或缺少什么?

【问题讨论】:

【参考方案1】:

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

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

请参阅MDN docs 了解更多信息。

【讨论】:

是的,这确实比我找到的 hacky 解决方案要好得多,谢谢【参考方案2】:

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

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

然后我通过检查我的请求的 HEADER(在 Chrome 上,这是在 Network>therequest>Request Headers>authorization 中完成的)获得了在请求中发送的散列凭据。我只是在 js 代码上复制/粘贴了这个散列凭据,它就起作用了!

【讨论】:

散列是一种单向函数(无法从散列中取回原始函数)。 Base64 是一个 encoding 函数(可以解码回原来的)。所以在这种情况下,凭证是编码的,而不是散列的。在您寻找更多资源时可能会很有用。

以上是关于使用 Web3.js HttpProvider 调用 API 时如何向 Ankr 提供凭据?的主要内容,如果未能解决你的问题,请参考以下文章

在 web3.py 中检测还原的事务

使用 web3.js v0.2.6 创建帐户

使用 web3 js 调用智能合约函数

将 web3.js 与 Jest 一起使用时出错

使用 web3.js 的“发送”有啥问题?

web3使用web3.js发布并执行智能合约