我一直在尝试使用Angular和带有Rails 4的API实现SPA。我决定使用会话控制器从API的设计会话控制器继承,并使用warden进行基于机架的身份验证。设计工作正常,直到我登录,它成功重定向到仪表板页面然而在API命名空间会话控制器我无法与warden进行身份验证。
class Api::SessionsController < Devise::SessionsController
before_action :warden_authenticate
def create
sign_in(resource_name, resource)
resource.create_authentication_token!
render json: {authenticate_token: resource.authenticate_token}
end
def destroy
sign_out(resource_name)
resource.clear_authentication_token!
render nothing:true
end
private
def warden_authenticate
self.resource = warden.authenticate!(auth_options)
end
end
当我使用用户名和密码卷曲时
curl http://localhost:3000/api/session -d '' -u abc@123.com:12345678
Started POST "/api/session" for 127.0.0.1 at 2016-04-28 14:35:23 +0300
Processing by Api::SessionsController#create as JSON
Completed 401 Unauthorized in 1ms (ActiveRecord: 0.0ms)
它抱怨csrf之前我在基础控制器中修复了
protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format.include? 'application/json' }
我做错了吗?我检查了warden在会话结束后的中间件列表中。当设计回滚其token_authentication时,我只想在每次用户登录时创建自定义令牌,并通过http头发送它仅用于安全api。我现在完全迷失了。