在请求标头中传递JWT无法在groovy脚本

时间:2018-05-15 11:37:20

标签: groovy jwt remedy cmdb bmc

我正试图通过groovy脚本从CMDB(BMC atrium)访问CI数据,它分两步进行。

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

其次是在后续api调用中使用此标记。

我已经测试了postman中的两个API,但它们工作正常。

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

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

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

我试过在标题中传递不同的值   - AuthenticationInfoValue.authentication =用户名,授权类型,用户名和密码等,但似乎没有任何效果。

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

这是groovy脚本

    @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();

1 个答案:

答案 0 :(得分:0)

经过大量的调试后我发现了问题,事实证明这很愚蠢。

在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)