【发布时间】:2014-07-18 07:01:49
【问题描述】:
我正在尝试发出经过身份验证的发布请求,并且我需要 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"}
如何手动生成令牌以传递给发布请求?
哦,好的,我想我需要将authentity_token(在获取登录表单后在会话中设置)提交到登录表单,然后将其永久放入会话中!这有效:
app.post '/community_members/login', {'authenticity_token'=>'GfT5GtcUmYQ927oNQmh2MR0NKQucGSx8mtMg3Ph9kXw=', "refinery_user[login]"=>'chloe', 'refinery_user[password]'=>'test'}
【问题讨论】:
标签: ruby-on-rails csrf refinerycms