當我運行 Spring 應用程式然后嘗試與 REST API 通信時,它允許我獲取但不能發布。
所以這有效:
curl -u user:a75fd7ea-9a6e-4943-bc0c-3b0a96bda51b http://localhost:5000/activity/getall
這不起作用:
curl -u user:a75fd7ea-9a6e-4943-bc0c-3b0a96bda51b
-H "Accept: application/json"
-X POST
-d '{
"name":"Sleep",
"criteria":"Sleep at least 8 hrs",
"ini":"2022-08-30",
"periodicity":"DAY",
"periodicityCount":"1"
}'
http://localhost:5000/activity/post
如果您注意到是相同的用戶名和密碼。
這是我得到的回應:
HTTP/1.1 403
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json
Transfer-Encoding: chunked
Date: Mon, 29 Aug 2022 19:25:27 GMT
Connection: close
{
"timestamp": "2022-08-29T19:25:27.510 00:00",
"status": 403,
"error": "Forbidden",
"path": "/activity/post"
}
uj5u.com熱心網友回復:
您的 API 呼叫失敗的原因是您在 Spring Security 配置中啟用的 CSRF 保護。
它的作業方式是,對于每個非 GET 請求(= POST、PUT、PATCH 或 DELETE),您需要包含一個 CSRF 令牌。
要獲取 CSRF 令牌,您首先需要觸發 GET 請求(例如http://localhost:5000/activity/getall)。在回應標頭中,您應該會看到一個Set-Cookie包含XSRF-TOKENcookie 的標頭。例如:
Set-Cookie: XSRF-TOKEN=098b732a-282a-11ed-a261-0242ac120002
現在您需要復制XSRF-TOKENcookie 的值(應該包含 UUID),并將其設定為X-XSRF-TOKEN標頭的值:
curl \
-u user:a75fd7ea-9a6e-4943-bc0c-3b0a96bda51b
-H "Accept: application/json"
-H "X-XSRF-TOKEN: 098b732a-282a-11ed-a261-0242ac120002"
-X POST \
-d '{
"name":"Sleep",
"criteria":"Sleep at least 8 hrs",
"ini":"2022-08-30",
"periodicity":"DAY",
"periodicityCount":"1"
}'
http://localhost:5000/activity/post
之后,您的請求應該會成功。請注意,此 POST 請求的回應將包含一個新的 CSRF 令牌,您必須將其復制到下一個請求中。
.csrf().disable()或者,您可以通過在 Spring Security 配置中設定來禁用 CSRF 保護。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504460.html
