我正在尝试进行身份验证的POST请求,需要CSRF令牌。但是当我登录时,由于某种原因它没有生成 _csrf_token
:
2.0.0p247 :126 > app.post '/community_members/login', {"refinery_user[login]"=>'chloe', 'refinery_user[password]'=>'test'}
=> 302
2.0.0p247 :127 > app.session
=> {"warden.user.refinery_user.key"=>[[56], "$2a$10$gr/rTcQfuXnes1Zml3qOPu"], "session_id"=>"f77d89cef9ff1710890f575b479bb690"}
在登录前,我尝试过app.session[:_csrf_token] ||= SecureRandom.base64(32)
,但它总是被删除。我还尝试先获取登录表单,但_csrf_token
仍未设置。
2.0.0p247 :133 > app.get '/community_members/sign_in'
2.0.0p247 :134 > app.response # authenticity_token is burried in the raw HTML
2.0.0p247 :136 > app.post '/community_members/login', {"refinery_user[login]"=>'chloe', 'refinery_user[password]'=>'test'}
2.0.0p247 :137 > app.session
=> {"warden.user.refinery_user.key"=>[[56], "$2a$10$gr/rTcQfuXnes1Zml3qOPu"], "session_id"=>"c2c564229e55b81ca788788558d7d11a"}
我该如何手动生成令牌以传递给POST请求?
哦,好的,我认为我需要提交authenticity_token(在GET登录表单后设置的)到登录表单,然后它会永久地将其放入会话中! 这个方法可以解决问题:
app.post '/community_members/login', {'authenticity_token'=>'GfT5GtcUmYQ927oNQmh2MR0NKQucGSx8mtMg3Ph9kXw=', "refinery_user[login]"=>'chloe', 'refinery_user[password]'=>'test'}
这里有一个完整的示例:https://dev59.com/qHVC5IYBdhLWcg3w51hv#23899701。