Подключитесь с помощью javascript к удаленному узлу geth с включенной аутентификацией HTTP

Я пытаюсь настроить HTTP-аутентификацию для моего частного узла geth на своем сервере, используя nginx в качестве обратного прокси-сервера. Я следовал этой инструкции: https://ethereum.stackexchange.com/questions/30357/restricted-access-authentication-for-a-remote-geth-node

Я протестировал свою установку с помощью curl, и пока она работает нормально:

curl
     -X POST
     --header "Content-Type: application/json"
     --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}'
     https://<user>:<pw>@<domain>

Результат: {"jsonrpc":"2.0","id":1,"result":[<addresses>]}

Открытие домена в моем браузере также работает нормально, я вижу запрос на аутентификацию, и после ввода учетных данных ошибки нет.

Мой узел выглядит так:

docker run -d ethereum/client-go:stable
    --datadir "/root"                  
    --port 30001                       
    --nat "any"                        
    --nodiscover                       
    --rpc                              
    --rpcaddr "0.0.0.0"                
    --rpcport 8545                     
    --rpcapi "eth,net,web3,rpc"        
    --rpccorsdomain "*"                
    --rpcvhosts "*"

Проблема

К сожалению, я не могу подключиться к своему узлу с помощью web3:

web3 = new Web3(new Web3.providers.HttpProvider("https://<user>:<pw>@<domain>"));
console.log(web3.eth.coinbase);

Результат в браузере:

Error: CONNECTION ERROR: Couldn't connect to node https://<user>:<pw>@<domain>.

// this error I just get in Chrome, not in Firefox. But if I ask with `curl -I` I can see `Access-Control-Allow-Origin` is set.
web3.min.js:1 Access to XMLHttpRequest at 'https://<user>:<pw>@<domain>' from origin 'https://localhost' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

person Community    schedule 13.01.2019    source источник


Ответы (1)


Для начала вы хотели бы, чтобы ваш запрос кода выглядел как ваш запрос curl.

Вы не указываете тип запроса, и вам не хватает заголовков, которые вы используете с вашим запросом на завивание. По умолчанию большинство http-библиотек будут использовать запрос GET, если он не указан (я не использовал web3), что вы и делаете с web3.

Я бы начал с добавления запроса и заголовка к вашему запросу web3. Вот пример использования httpheaderprovider (источник: https://github.com/EthereumEx/httpheaderprovider )

var Web3 = require('web3');
var web3 = new Web3();

var HttpHeaderProvider = require('httpheaderprovider');

var headers = {
  "Ocp-Apim-Subscription-Key": "mykeyfromtheapiportal",
  "header2": "foobar"
}
var provider = new HttpHeaderProvider('https://scicoria.azure-api.net', headers);

web3.setProvider(provider);

var coinbase = web3.eth.coinbase;
console.log(coinbase);

var balance = web3.eth.getBalance(coinbase);
console.log(balance.toString(10));

также см. это

person user3738936    schedule 13.01.2019
comment
Эй, спасибо за ваш ответ. Ваш код для nodejs. Я попробовал это с nodejs, и он работает без проблем, даже если я просто использую web3 без httpheaderprovider . Но мой код на стороне клиента JS. - person ; 13.01.2019