我之前使用了会话变量,即session[:user_id]
来跟踪当前用户,但我现在正试图让我的应用程序与EmberJS一起使用,需要Grape API后端而不是控制器等。我想知道,跨页面跟踪用户凭据的最佳方法是什么:会话,Cookie或线程?我此刻倾向于线程,但我想知道每个人的利弊是什么?
答案 0 :(得分:0)
API中的身份验证略有不同。通过传递某种类型的令牌而不是每次会话一次,应该对每个请求授权用户。
通常,您将拥有一条接受用户名/密码的路由,该路由将返回一个身份验证令牌,然后该令牌将作为BasicAuth的一部分传递或在每个请求的头文件中传递。在Grape中,有几种方法可以做到这一点。您可以添加身份验证帮助程序:
module ApiHelpers
module Authentication
def authenticate!
error!('401 Unauthorized', 401) unless current_user
end
def current_user
if token_from_headers
@current_user ||= User.find_by api_key: token_from_headers[1]
end
end
def authenticate!
error!('401 Unauthorized', 401) unless current_user
end
def token_from_headers
/Token token="(.+)"/.match(headers['Authorization'])
end
end
end
在主api文件中包含:
class API < Grape::API
helpers ApiHelpers::Authentication
end
然后,对于每个需要身份验证的请求:
resource :items do
get do
authenticate!
present current_user.items, with: Entities::Item
end
end
您还可以添加自定义中间件进行身份验证或使用基本身份验证进行身份验证。关于Grape自述文件中的更多信息:https://github.com/intridea/grape#authentication
我假设您的终端使用SSL?