Ошибка подключения к веб-сервису rest с аутентификацией x-csrf-token - PullRequest
0 голосов
/ 06 августа 2020

Я пишу небольшой скрипт в groovy, чтобы отправить сообщение в службу отдыха, я успешно получил токен, когда я извлекаю токен, но при передаче его методу публикации я всегда получал ошибку 403

/*Method Get fetching token*/
def client = new RESTClient(urlWs)
client.authorization = new HTTPBasicAuthorization(user,pass)

def responseHead =  client.get(headers:["x-csrf-token": "fetch"])

def token  = responseHead?.headers['x-csrf-token']
def cookie = responseHead?.headers['set-cookie']

println "Token  -> " + token
println "Cookie -> " + responseHead?.headers['set-cookie']

/* Post Method using fetched token */
def clientPost = new RESTClient(urlWs)   
clientPost.authorization =  new HTTPBasicAuthorization(user,pass)

def responsePost =  clientPost.post(headers:["content-type":"application/json",
                                              "cookie":cookie,
                                              "X-CSRF-TOKEN": token ]){
                        json([
                            "DealerId": "V525",
                            "CustomerId": "00011"
                            ])}

Служба работает нормально, когда я тестирую ее с помощью почтальона или insomina, но когда я пытаюсь использовать свой скрипт, я не могу отправить сообщение, есть ли что-то, чего мне не хватает? Любые советы будут оценены. Я использую groovy -wslite: 1.1.3 libs.

1 Ответ

0 голосов
/ 11 августа 2020

Я нашел решение, wslite lib, которое я использовал, RESTClient всегда возвращает доступ 403 Forbiddem, даже когда я использую тот же экземпляр http в методах get и post, поэтому я меняю на Apache компоненты Httpclient и все идет как шарм, ниже код для groovy / grails

def urlWs = "http://dev.url.com/accountlookup"
def user = "user"
def pass = "pass"

/*Creates Http client instance*/
def httpclient  = HttpClients.createDefault()

def credentials =  user + ":" + pass
def encodeCred = encodeBase64String(credentials.getBytes())
def X_CSRF_TOKEN = ""
def COOKIE = ""

/*HttpGet Method for retrieving X-CSRF-Token*/
def reqGet = new HttpGet(urlWs)
reqGet.setHeader("Authorization", "Basic " + encodeCred)
reqGet.setHeader("x-csrf-token", "fetch")

println "request:------------------->"
println(reqGet.getRequestLine())

def headers = reqGet.getAllHeaders()
for (Header h : headers) {
    println(h.getName() + " : " + h.getValue())
}

def getResponse = httpclient.execute(reqGet)

println "response:------------------->"
println "${getResponse.getStatusLine()}"

headers = getResponse.getAllHeaders()
for (Header h : headers) {
    println(h.getName() + " : " + h.getValue())

    if (h.getName() == "x-csrf-token") {
        X_CSRF_TOKEN = h.getValue()
    }
    /*If you need get the cookie from header*/

    if (h.getName() == "set-cookie") {
        COOKIE = h.getValue()
    }
}

println "COOKIE ---> ${COOKIE}"


/*The main POST REQUEST*/

def postRequest = new HttpPost(urlWs)

postRequest.setHeader("Authorization", "Basic ${encodeCred}")
postRequest.setHeader("Content-Type", "application/json")
postRequest.setHeader("x-csrf-token","${X_CSRF_TOKEN}")

//postRequest.setHeader("Cookie","${COOKIE}")
//postRequest.setHeader("Accept",'application/json')

def JSON_STRING = '''{"DealerId":"V525"}'''

def entity = new StringEntity(JSON_STRING,ContentType.APPLICATION_JSON)
postRequest.setEntity(entity)

println "Post Execute......................................"

def postResponse = httpclient.execute(postRequest)
println "Http Post Response: " + postResponse

println "Post Response......................................"

def result = EntityUtils.toString(postResponse.getEntity())
println "Http Response: " + result

def responseCode =  postResponse.getStatusLine().getStatusCode()
println "Http Response: code " + responseCode
...