Операция публикации завершается с ошибкой с ошибкой проверки токена CSRF

Я пытаюсь выполнить операцию POST для объекта SAP Hybris C4C.

Я встречал много блогов, где упоминалось, что нам нужно отправить X-CSRF-Token во время POST, который сначала можно получить с помощью операции GET.

Мне удалось это сделать с помощью Postman. поскольку Почтальон хранит cookie, не вызывая сбоя проверки токена CSRF.

Но на самом деле я хочу назвать это с помощью golang. И я каждый раз получал ошибку, так как «Ошибка проверки токена CSRF». Затем, просмотрев множество блогов, я обнаружил, что нам нужно не только установить X-CSRF-Token, но и Cookie, чтобы HTTP POST не обрабатывался как новый сеанс. в противном случае отправленный нами токен csrf не соответствует текущему сеансу, вызывая ошибку.

Даже после двух приведенных выше запросов я все еще получаю ошибку. Ниже приведен фрагмент кода, я не уверен, чего еще не хватает.

Фрагмент кода:

auth := "******:*****"
basicAuth := base64.StdEncoding.EncodeToString([]byte(auth))

geturl := "https://******.crm.ondemand.com/sap/c4c/odata/v1/c4codataapi"
req, _ := http.NewRequest("GET", geturl, nil)
req.Header.Set("Authorization", "Basic "+basicAuth)
req.Header.Set("X-Csrf-Token", "Fetch")
cli := &http.Client{}
res, _ := cli.Do(req)

inputMap := make(map[string]interface{})
inputMap["PriorityCodeText"] = "Normal"
inputJSON, _ := json.Marshal(inputMap)

url := "https://*******.crm.ondemand.com/sap/c4c/odata/v1/c4codataapi/OpportunityCollection"
request, _ := http.NewRequest("POST", url, bytes.NewBuffer(inputJSON))
request.Header.Set("Authorization", "Basic "+basicAuth)
request.Header.Set("X-Csrf-Token", res.Header.Get("X-Csrf-Token"))
request.Header.Set("Cookie", res.Header.Get("Set-Cookie"))
request.Header.Set("X-Requested-With", "XMLHttpRequest")
request.Header.Set("Content-Type", "application/atomsvc+xml")
request.Header.Set("DataServiceVersion", "2.0")
//request.Header.Set("Accept", "application/atom+xml")
client := &http.Client{}
resp, _ := client.Do(request)
fmt.Printf("Response status code is: %d", resp.StatusCode)
jsonResponseData, _ := ioutil.ReadAll(resp.Body)
fmt.Printf("Response is: %s", jsonResponseData)

person Asha Kabra    schedule 07.10.2018    source источник
comment
здесь может быть больше одного файла cookie, необходимого для сеанса. лучше, чем копирование файлов cookie, использовать банку для файлов cookie, которая заботится об обработке файлов cookie ... это может помочь stackoverflow.com/questions/12756782/   -  person gp.    schedule 07.10.2018


Ответы (2)


Это сработало! Как упоминалось в @gp, мне пришлось скопировать все файлы cookie, а не просто установить заголовок. Я внес изменения в фрагмент кода ниже

//request.Header.Set("Cookie", res.Header.Get("Set-Cookie"))
for i := 0; i < len(res.Cookies()); i++ {
    request.AddCookie(res.Cookies()[i])
}
person Asha Kabra    schedule 07.10.2018

Иногда я сталкиваюсь с этим с tomcat 9, в моем случае просто выйдите из системы и снова войдите, чтобы решить проблему.
Кажется, что приложение java использовало просроченный cookie, но по ошибке не перенаправило меня на страницу выхода.

person Hasnaa Ibraheem    schedule 12.01.2021