Ruby on rails 在rails api应用程序中存储会话

Ruby on rails 在rails api应用程序中存储会话,ruby-on-rails,ruby,session,cookies,session-cookies,Ruby On Rails,Ruby,Session,Cookies,Session Cookies,我有一个只支持rails api的应用程序[config.api_only=true],我在其中通过以下几行启用cookie: 在application.rb中: config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::Cookies config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::Sessio

我有一个只支持rails api的应用程序
[config.api_only=true]
,我在其中通过以下几行启用cookie:

在application.rb中:

config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::Cookies
config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::Session::CookieStore
在应用程序中_controller.rb

include ActionController::Helpers
include ActionController::Cookies
我还添加了secret_token.rb,如下所示:

Rails.application.config.secret_token = 'token'
在我的控制器中,我尝试如下方式存储会话:

def index
    #other codes
    session[:userid] = useridstring
    render :text => session[:userid]
end
def readsession
    userId = session[:userid]
    render :text => userId
end
注意:但是,在chrome中执行此操作后,我正在检查cookie,没有设置任何cookie

然后在同一个控制器中,但在另一个操作中,我尝试如下读取会话:

def index
    #other codes
    session[:userid] = useridstring
    render :text => session[:userid]
end
def readsession
    userId = session[:userid]
    render :text => userId
end
而没有任何东西被渲染..:(

有什么我错过的吗

我尝试按照答案进行操作,这表明我设置了
config.api_only=false
,但是结果是一样的(我没有设置cookie,当在另一个控制器中读取时,会话仍然为空)


很抱歉,这是一个基本问题(或初始配置问题),我对ruby和rails还是很陌生。

因为API总是与客户端无关的,所以最好使用令牌进行身份验证

以下是方法:

  • users
    表中添加一个名为
    token
    的列
  • 一个用户进来并登录
  • 当他登录时,会生成一个令牌(一个随机字符字符串),并保存在数据库中
  • 字符串也会被传递,任何后续的请求都会附带该令牌
  • 由于每个请求都附带一个令牌,因此您可以检查令牌的数据库存在性以及与正确用户的关联
  • 当用户注销时,从数据库中删除令牌

  • 支持您的API被mobo应用程序使用,那么该应用程序将如何存储Cookie?当然,浏览器可以使用Cookie,但普通应用程序或您的API的普通消费者可能无法使用Cookie。因此,您最好使用令牌进行身份验证。@BilalMaqsood:ohh。。是的,它是用于移动的!我没有想到这一点。。怎么做我改为使用令牌进行身份验证?:O@BilalMaqsood:cookie确实在手机中可用,Android中的checkout CookieManager和iOS中的NSUrlConnection也会自动处理cookie。不过我想知道您是如何处理令牌的。我知道parse.com是这样做的。我已经给出了通过令牌进行身份验证的答案。请查看。谢谢或者解释一下!你有关于这方面的额外资源吗?我目前在谷歌上搜索,对数据库支持的cookie和身份验证令牌(也存储在db中)非常困惑…它们的概念非常相似(你发回一些令牌id)但可能会有所不同,几个月前,我构建了一个API,我从头开始构建了所有的身份验证功能。这并不是那么困难。对于您的情况,如果您得到一个不同的令牌id,只需告诉用户:“您必须登录才能访问此应用程序。”只有一个有效的令牌,您就可以假设用户已登录。@Hak如果我的回答对您有所帮助,您可以接受。我认为这是一种非常糟糕的方法。首先,您还必须将其存储在FE端(本地存储、cookie等)这是双重工作。那么您是如何处理令牌过期和令牌刷新的?另外,当您从Db中删除它时,它也必须在FE上删除,因此再次双重工作。对我来说,最好的方法是Oauth2身份验证或将httpOnly标志设置为true的cookie会话。