Соединитесь с javascript к удаленному узлу geth с включенной аутентификацией HTTP - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь настроить 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.

1 Ответ

0 голосов
/ 13 января 2019

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

Вы не указываете тип запроса, и вам не хватает ваших заголовков, которые вы используете в своем запросе 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));

также посмотрите это

...