我们正在使用空手道框架自动化测试。在我们的一个功能中,我们需要解码令牌并在响应中获取范围。除了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不被识别?我们该怎么办?谢谢你的帮助
我很确定Buffer
是高级/非标准或NodeJS所以它可能不受JVM JS引擎(Nashorn)的支持。
这是我的建议。对于这种情况,使用Java实用程序完成工作。
例如,查看使用Base64编码的Karate basic-auth example in the doc。
如果它真的很复杂,只需创建一个Java静态函数,它就会更容易测试作为一个副作用。希望这可以帮助 !
我能够使用以下代码成功地将JSTT令牌有效负载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
而不是def
,因为如果它将字符串解析为json本身,则Karate会更好。此外,您可以从标头而不是Cookie中获取令牌,如果是这样,只需更改您要查找的responseHeader即可。