【问题标题】:Post operation fails with "CSRF token validation failed" error发布操作失败并出现“CSRF 令牌验证失败”错误
【发布时间】:2018-10-07 10:29:56
【问题描述】:

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

我看到很多博客都提到我们需要在 POST 期间发送 X-CSRF-Token,可以首先使用 GET 操作检索。

我使用 Postman 成功地做到了这一点。因为 Postman 存储 cookie 不会导致 CSRF 令牌验证失败。

但是,我实际上想使用 golang 来调用它。而且我每次都收到错误,因为“CSRF 令牌验证失败”。然后在浏览了很多博客之后,我发现我们不仅要设置 X-CSRF-Token 还要设置 Cookie,这样 HTTP POST 就不会被视为新会话。否则我们发送的 csrf 令牌与当前会话不匹配导致错误。

即使遵循上述两条线索,我仍然遇到错误。下面是sn-p的代码,不知道还少了什么。

代码sn-p:

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)

【问题讨论】:

标签: go csrf hybris


【解决方案1】:

成功了! 正如@gp 所提到的,我必须复制所有cookie 而不仅仅是设置标题。我在代码 sn-p 中做了以下更改

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 2012-05-16
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 2017-10-15
      相关资源
      最近更新 更多