我正在使用 React/Redux 前端和運行后端的 Rails 服務器。我有一個按鈕,onClick 將發送觸發一個動作,該動作由兩個調度和一個獲取組成,一個在之前和一個之后調度。fetch 正確地找到了服務器,但我收到了 422 錯誤,這意味著在接受請求后 Rails 方面存在一些問題。錯誤如您在標題中所見ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken)。但是,我必須建立到PARAMSrequire一個player物件,并permit在適當的屬性。提取操作(我知道有效)如下所示
export default function completeAttributeSelection(playerObj){
const playerPOST = ({
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({
atk: playerObj.atk,
sAtk: playerObj.sAtk,
def: playerObj.def,
sDef: playerObj.sDef,
spd: playerObj.spd,
hp: playerObj.hp,
name: playerObj.name
})
})
return (dispatch) => {
dispatch({type: "LOADING"})
console.log("Domain: " DOMAIN())
fetch((DOMAIN() "/players/update_or_create"), playerPOST)
.then(resp => resp.json())
.then(json => {
console.log(json)
dispatch({type: "ATTRIBUTE_UPDATE_COMPLETE", payload: json})
})
}
}
這是處理請求的控制器:
class PlayersController < ApplicationController
def update_or_create
puts ("Update or Create hit")
@player = Player.create_or_find_by(name: player_params[:name])
puts (player_params)
@player.update(class: player_params[:class], lvl: player_params[:level], atk: player_params[:atk], sAtk: player_params[:sAtk], def: player_params[:def], sDef: player_params[:sDef], spd: player_params[:spd], hp: player_params[:hp])
render json{@player}
end
private
def player_params
params.require(:player).permit(:name, :inv_hash, :lvl, :name, :class, :atk, :def, :sAtk, :sDef, :spd, :hp, :move_distance)
end
end
因為我沒有使用任何秘密、密鑰或任何類似的東西,has_secure_password所以我正在努力了解究竟是什么被它抓住了。我從 Rails 終端(在長期混亂的錯誤之前)得到的全部提示如下......
Processing by PlayersController#update_or_create as JSON
Parameters: {"atk"=>6, "sAtk"=>6, "def"=>5, "sDef"=>9, "spd"=>10, "hp"=>85, "name"=>"test01", "player"=>{"name"=>"test01", "atk"=>6, "def"=>5, "sAtk"=>6, "sDef"=>9, "spd"=>10, "hp"=>85}}
HTTP Origin header (http://localhost:3000) didn't match request.base_url (http://localhost:3006)
Completed 422 Unprocessable Entity in 0ms (ActiveRecord: 0.3ms | Allocations: 394)
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
uj5u.com熱心網友回復:
使其作業的簡短答案是添加protect_from_forgery with: :null_session到您的控制器中。
class PlayersController < ApplicationController
protect_from_forgery with: :null_session
# ...
end
較長的答案涉及 CSRF 和所謂的真實性令牌。這似乎是一個很好的來源https://blog.nvisium.com/understanding-protectfromforgery
跨站點請求偽造是一個嚴重的漏洞,它源于 Web 應用程式對在瀏覽器和服務器之間傳遞的會話標識 cookie 的信任。有關 CSRF 的更詳細說明,我建議查看跨站點請求偽造的 OWASP 指南。
Rails 包含一個內置的防止 CSRF 的機制,protect_from_forgery,它在生成新應用程式時默認包含在 application_controller.rb 控制器中。這個protect_from_forgery 方法利用魔法來確保您的應用程式免受黑客攻擊!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/351606.html
上一篇:PHP物件中的if陳述句
