无法识别 JS 文件中的缓冲区(使用空手道框架进行 API 测试自动化)

IT技术 javascript karate
2021-03-07 03:16:14

我们正在使用空手道框架自动化我们的测试。在我们的一项功能中,我们需要解码一个令牌并在响应中获得一个范围。一切正常,除了 js 中的这段代码。

function(token) {
    return JSON.parse(new Buffer(token.split('.')[1],'base64').toString('ascii')).scope;
}

错误:

Caused by: <eval>:2 ReferenceError: "Buffer" is not defined
Caused by: jdk.nashorn.internal.runtime.ECMAException

在官方教程中说 javascript 是空手道的“原生”,所以我们不明白为什么 Buffer 不被识别?我们应该怎么做?谢谢你的帮助

3个回答

我能够使用以下代码成功将 JWT 令牌有效负载 base64Decode 到 JSON,而无需 Java 方法:

  Background:
    * def parseJwt =
  """
  function(token) {
      var base64Url = token.split('.')[1];
      var base64Str = base64Url.replace(/-/g, '+').replace(/_/g, '/');
      var Base64 = Java.type('java.util.Base64');
      var decoded = Base64.getDecoder().decode(base64Str);
      var String = Java.type('java.lang.String')
      return new String(decoded)
  };
  """

  Scenario: JWT Token
    Given path  'jwt/authenticate'
    And header x-goog-authenticated-user-email = 'email'
    And request {}
    When method get
    Then status 200
    * json result = parseJwt(responseHeaders['Set-Cookie'][0])
    * match result == {permissions: [1,2,3], iss: "us", exp: "#number", email: "email"}

注意:如果将字符串解析为 json 本身,它似乎确实需要使用json而不是def空手道做得更好。此外,您可以从标头而不是 cookie 中获取令牌,如本示例中所示,如果是这样,只需更改您正在查找的 responseHeader。

谢谢 !是否有在线/公共 JWT 示例,如果您同意的话,我想在某个时候将此代码添加到空手道演示中
2021-04-20 03:16:14
谢谢 !您可以使用 OAuth2 示例作为参考:github.com/intuit/karate/blob/master/karate-demo/src/test/java/...
2021-05-04 03:16:14
jwt.io可能有一些东西。他们当然有硬编码的字符串和一个很好的调试器。我只是不确定标头或 cookie 上的令牌。您是否有喜欢演示的特定风格?我很高兴作为 PR 贡献一份。
2021-05-10 03:16:14

我很确定这Buffer是高级/非标准或 NodeJS,因此 JVM JS 引擎 (Nashorn) 可能不支持它。

这是我的建议。对于这种情况,请使用 Java 实用程序完成这项工作。

例如,查看文档中使用 Base64 编码Karate basic-auth 示例

如果真的很复杂,只需创建一个Java静态函数,作为附带好处进行测试会容易得多。希望这可以帮助 !

抱歉无法理解这一点。最好的选择是提出缺陷,但您必须包含一个清晰、简单的可以复制问题的工作示例。
2021-04-15 03:16:14
我们在 Java 中尝试了这个并且它有效,但在空手道中没有:* def decoder = """ function(token) { var Base64 = Java.type("java.util.Base64"); var getB = Base64.getDecoder().decode(token.getBytes()); var decoded = new String(getB); return decoded; } """,然后我们尝试没有var decoded = new String(getB);并添加* string dec = decoder token但它不起作用。很抱歉打扰您,@Peter Thomas,但如果我们可以直接在功能中管理“新字符串”,那将非常有帮助。提前致谢
2021-04-17 03:16:14
非常感谢,@Peter Thomas,我在 JS 中尝试了一切,最后我使用了 Java: public static String getWishedClaim(String token, String yourClaim){ String result = null; 尝试 { DecodedJWT jwt = JWT.decode(token); 结果 = jwt.getClaim(yourClaim).asString(); } catch (JWTDecodeException exception){ //无效的token } return result; 在我的功能中,我称之为静态方法。我开始更好地理解你的教程。
2021-04-20 03:16:14
编写一个普通的 Java 方法,以便您可以在用于空手道之前对其进行测试。向了解您正在尝试进行的解码的人寻求帮助。
2021-05-12 03:16:14

关于职位空手道:使用不记名令牌的请求问题 | 空手道在响应中显示“org/apache/commons/codec/binary/Base64”而不是 HTTP 401

我的查询被标记为重复,因此发布了我们在项目中找到的答案/解决方案。

我们在空手道核心中对错误进行了一些调试。似乎缺少依赖项。

在此处输入图片说明

我们在 POM.xml 中添加了依赖

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>

后来问题解决了,我们开始得到HTTP 401。我不确定它是否可以添加到空手道核心。