Сбой аутентификации JWT в Hyperledger Composer - PullRequest
0 голосов
/ 11 октября 2018

Я следил за блогом Кэролайн , чтобы настроить многопользовательский сервер отдыха композитора.Итак, у меня есть два сервера, а именно.Сервер администратора и сервер пользователя.

Как уже упоминалось в руководстве I:

  1. Запущен сервер администратора без аутентификации и однопользовательского режима.Я запустил этот сервер с картой администратора.
  2. Запустил пользовательский сервер с паспортной аутентификацией JWT в многопользовательском режиме.Я также запустил этот сервер с картой администратора.
  3. Создал участника пользователя и сгенерировал карту для пользователя с сервера администратора.
  4. На этом этапе я пытаюсь обменять токен JWT напользовательский сервер (# 2), и я также могу получить токен.
  5. Ping пользовательский сервер с токеном JWT.Это приводит к «Ошибка: требуется авторизация».

Я следил за блогом Криса Ганги по реализации JWT.Мои COMPOSER_PROVIDERS:

COMPOSER_PROVIDERS='{
  "jwt": {
      "provider": "jwt",
      "module": "/home/composer/node_modules/custom-jwt.js",
      "secretOrKey": "somesecretkey",
      "authScheme": "saml",
      "successRedirect": "/",
      "failureRedirect":"/"
  }
}'

Я впервые обмениваюсь токеном JWT из службы Java.Чтобы создать токен на предъявителя, я написал следующий код:

public static String getBearerToken(String username, String id) throws UnsupportedEncodingException {
    return Jwts.builder()
            .claim("timestamp", System.currentTimeMillis())
              .claim("username", username)
              .claim("id", id)
              .signWith(
                SignatureAlgorithm.HS256,
                "somesecretkey".getBytes("UTF-8")
              ).compact();
}

С этим я могу получить токен.Далее я использую этот токен для импорта карты в кошелек на сервере пользователя:

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
headers.set("X-Access-Token",getAccess_token(participantEmail));
headers.set("x-api-key", userServerKey);

LinkedMultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
params.add("card", new FileSystemResource(card));
params.add("name", participantEmail);

HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(CARD_IMPORT_URL);


ResponseEntity<String> responseEntity = restTemplate.exchange(builder.build().encode().toUri(),
                HttpMethod.POST, requestEntity, String.class);

Однако это приводит к:

Необработанная ошибка для запроса POST / api / Wallet/ import: Ошибка: Требуется авторизация

Поиск 1 Как правило, когда мы впервые обмениваемся JWT с использованием носителя аутентификации, в Монго создается база данных с именем «test».Эта БД содержит три коллекции: accessToken, user и userIdentity.Однако в моем случае, когда я обмениваю токен, в монго не создается БД.Любые предложения о том, как я могу отладить это?

Примечание: Вся эта установка работала прекрасно, пока я не решил удалить и перезапустить сеть с нуля.

1 Ответ

0 голосов
/ 13 октября 2018

Проблема заключалась в том, что я использовал одно и то же имя для контейнера mongodb на всех хостах.И поскольку все контейнеры подключены к сети роя, было 8 контейнеров mongodb с одинаковым именем, что является довольно глупой ошибкой.Это вызвало проблему, когда Docker-контейнер composer-rest-server пытался подключиться к контейнеру mongodb.Это соединение определено в переменной COMPOSER_DATASOURCES.Использование разных имен для каждого контейнера mongo на всех хостах решило эту проблему.

...