Hyperledger Composer中的JWT身份验证失败

时间:2018-10-11 14:54:48

标签: hyperledger-composer passport-jwt

我一直遵循Caroline's blog来设置多用户作曲家休息服务器。因此,我有两个服务器,即。管理服务器和用户服务器。

如本教程I中所述:

  1. 以没有身份验证和单用户模式启动Admin Server。我用管理员卡启动了该服务器。
  2. 在多用户模式下使用通行证JWT身份验证启动用户服务器。我也使用管理员卡启动了该服务器。
  3. 创建了一个用户参与者,并从管理服务器为用户生成了一张卡。
  4. 在这一步中,我尝试与用户服务器(#2)交换JWT令牌,并且也能够获得该令牌。
  5. 使用JWT令牌对用户服务器执行Ping操作。这将导致“错误:需要授权”。

我已经关注Chris Ganga's博客以实现JWT。我的COMPOSER_PROVIDERS是:

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

我是第一次从Java服务交换JWT令牌。为了创建承载令牌,我编写了以下代码:

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 通常,当我们首次使用auth承载交换JWT时,会在mongo中创建一个名为“ test”的数据库。该数据库包含三个集合:accessToken,user和userIdentity。但是,在我交换令牌的情况下,在mongo中没有创建任何数据库。关于如何调试它的任何建议?

注意: 在我决定修剪并从头开始重新启动网络之前,整个设置工作都很好。

1 个答案:

答案 0 :(得分:1)

这里的问题是我在所有主机上对mongodb容器使用了相同的名称。而且由于所有容器都连接到了群集网络,所以有8个名称相同的mongodb容器,这是一个很愚蠢的错误。当composer-rest-server的docker容器尝试连接到mongodb容器时,它引起了一个问题。此连接在COMPOSER_DATASOURCES变量中定义。在所有主机上为每个mongo容器使用不同的名称可以解决此问题。