我在rails api中禁用了会话,例如config.skip_session_storage = [:http_auth, :token_auth]
api的“注销”是否有意义?如果它确实如何获取current_user,因为下面的代码抛出current_user = nil错误或warden.authenticate失败。
# class Api::V1::SessionsController < Devise::SessionsController
def create
# create token
end
def destroy
# We don't need this because the user is authenticated by the token.
warden.authenticate!(:scope => resource_name, :store => false, :recall => "#{controller_path}#failure")
current_user.reset_authentication_token!
render :status => 200,
:json => { :success => true,
:info => t("devise.sessions.signed_out"),
:data => {} }
end
答案 0 :(得分:1)
API没有状态,因为它不依赖于浏览器来缓存任何内容。通常,如果您想要保护API,您可以为每个用户提供某种访问令牌(通过呈现的html或直接在javascript中(请参阅gon
gem))然后通过SSL操作API,需要每次调用拥有该访问令牌。
例如,您可以致电https://mysite.com/api/v1/users?token=...
然后根据该令牌获取current_user
。
或者,只要进行API调用,就可以在标头中包含令牌。无论哪种方式,您都希望使用SSL保护它,以便没有人路由请求(例如假的星巴克的wifi)可以嗅探请求,获取令牌并自行使用它。