在请求标头中传递 JWT 在时髦的脚本中不起作用



我正在尝试通过时髦的脚本从CMDB(BMC中庭(访问CI数据,它分两步进行。

首先发送 POST 请求以登录 api 并获取授权令牌。

其次,在后续 api 调用中使用此令牌。

我已经在邮递员中测试了这两个 API,它们工作正常。

获取令牌的部分在 groovy 脚本中工作正常,但使用此令牌获取 CI 数据的部分返回错误 json:

"JsonResponse is[{"messageType":"ERROR","messageText":"必须在控制记录中提供用户名","messageAppendedText":null,"messageNumber":149}]">

这是有趣的部分,我回到邮递员,在授权标头中,我只是放置了一个新生成的令牌,它给了我与上面提到的相同的错误 JSON。当我在授权标头中附加带有令牌值的"AR-JWT"时 - 它工作正常!

我尝试在标题中传递不同的值,例如

  • AuthenticationInfoValue.authentication = 用户名 , 授权类型 , 用户名和密码 等,但似乎没有任何效果。

我已经检查了BMC官方网站的文档,但根据它,我做的一切都是正确的。 如果有人能指出我做错了什么,那将是非常有帮助的。

这是时髦的脚本

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7')
//post call to get the token
def token
def httpRequester = new 
groovyx.net.http.HTTPBuilder("http://<localhost>:<port>/api/jwt/login");
httpRequester.request(groovyx.net.http.Method.POST) { req ->
requestContentType = groovyx.net.http.ContentType.URLENC
body = [username:'user', password:'pass']
response.success = { resp , reader ->
println "response success"                
httpResponse = resp
println "httpResponse : "+httpResponse
token = reader.getText()
println "token : "+token
}

response.failure = { resp , reader ->
println "response failure"                
httpResponse = resp
println "httpResponse : "+httpResponse
token = reader.getText()  
println "token : "+token                  
}
}
//Get call to fetch the CI Data
httpRequester = new groovyx.net.http.HTTPBuilder("http://<localhost>:<port>/api/arsys/v1/entry/AST:ComputerSystem")
def finalToken = "AR-JWT" + " " + token ;
httpRequester.request(groovyx.net.http.Method.GET) { req ->
println "Inside request"
def headerMap = ['Content-Type': 'application/x-www-form-urlencoded' , 
'Authorization': finalToken]
httpRequester.setHeaders(headerMap)
println "headers  :  "+httpRequester.getHeaders()
requestContentType = groovyx.net.http.ContentType.URLENC
response.success = { resp, json ->
println "response success"                
httpResponse = resp
jsonResponse = json
}

response.failure = { resp, json ->
println "response failure"                
httpResponse = resp
jsonResponse = json
}
}



jsonResponse = new groovy.json.JsonBuilder(jsonResponse);
println "JsonResponse is" +jsonResponse.toString();



经过大量调试后,我发现了问题,结果证明它很愚蠢。

在 GET API 调用中必须设置如下所示的标头。

headers.'Content-Type'='application/x-www-form-urlencoded'
​headers.'Authorization'=finalToken

并注释掉或删除下面的行。

//def headerMap = ['Content-Type': 'application/x-www-form-urlencoded' , 'Authorization': finalToken]
//httpRequester.setHeaders(headerMap)

最新更新