发布操作失败,并显示“ CSRF令牌验证失败”错误

时间:2018-10-07 10:29:56

标签: go sap csrf hybris

我正在尝试对SAP Hybris C4C实体进行POST操作。

我遇到了很多博客,其中提到我们需要在POST期间发送X-CSRF-Token,这可以首先使用GET操作进行检索。

我可以使用邮递员成功地做到这一点。因为邮递员存储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)

2 个答案:

答案 0 :(得分:0)

成功了! 如@gp所述,我不得不复制所有cookie,而不仅仅是设置标头。我在下面做了代码片段的更改

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

答案 1 :(得分:0)

有时我会用 tomcat 9 面对它,就我而言,只需注销并重新登录即可解决问题。
Java 应用程序似乎使用了过期的 cookie,但没有错误地将我重定向到注销页面。