Hyperledger Composer 中的 JWT 身份验证失败

Posted

技术标签:

【中文标题】Hyperledger Composer 中的 JWT 身份验证失败【英文标题】:JWT Authentication fails in Hyperledger Composer 【发布时间】:2019-03-16 17:14:53 【问题描述】:

我一直在关注Caroline's blog 来设置一个多用户作曲家休息服务器。所以,我有两台服务器,即。管理服务器和用户服务器。

如教程一中所述:

    在没有身份验证和单用户模式的情况下启动了管理服务器。我用管理员卡启动了这个服务器。 在多用户模式下使用护照 JWT 身份验证启动用户服务器。我也用管理员卡启动了这个服务器。 创建了一个用户参与者并从管理服务器为用户生成了一张卡片。 在此步骤中,我尝试与用户服务器 (#2) 交换 JWT 令牌,并且我也能够获取令牌。 使用 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 bearer 交换 JWT 时,会在 mongo 中创建一个名为“test”的 db。该数据库包含三个集合:accessToken、user 和 userIdentity。但是,就我而言,当我交换令牌时,在 mongo 中没有创建任何数据库。关于如何调试它的任何建议?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Hyperledger Composer 中的 JWT 身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章

hyperledger composer

区块链100讲:Hyperledger Composer及其开发流程

Hyperledger composer使用REST服务器POST命令插入记录大约需要3秒钟

Ubuntu上的Hyperledger composer CLI安装问题

安装 Hyperledger Composer 时出错

如何使用Hyperledger Fabric和Composer构建区块链网络(上)