在 Rails api 应用程序中存储会话

Posted

技术标签:

【中文标题】在 Rails api 应用程序中存储会话【英文标题】:storing session in rails api application 【发布时间】:2016-06-16 12:23:15 【问题描述】:

我有一个仅限 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

在 application_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

注意:但是,在 chrome 中执行此操作后,我正在检查 cookie,但未设置任何内容...

然后在同一个控制器中,但在另一个动作中,我试图像这样读取会话:

def readsession
    userId = session[:userid]
    render :text => userId
end

什么都没有渲染.. :(

有什么我错过的吗?

我尝试按照答案here 建议我设置config.api_only = false,但是结果是一样的(我没有设置cookie,当在另一个控制器中读取时,会话仍然是空的

对不起,这是一个如此基本的问题(或初始配置问题),我对ruby和rails还是很陌生..

【问题讨论】:

支持您的 API 由主板应用程序使用,那么该应用程序将如何存储 cookie?当然,浏览器可以使用 cookie,但通用应用程序或 API 的一般使用者可能无法这样做。所以你最好需要使用令牌进行身份验证。 @BilalMaqsood:哦.. 是的,它适用于移动设备!我没有想到..我如何使用令牌进行身份验证? :O @BilalMaqsood:cookie 确实在移动设备中可用,在 android 中结帐 CookieManager,并且 NSUrlConnection 还在 ios 中自动处理 cookie。我想知道你是如何处理令牌的。我知道解析。 com也是这样做的 我已经给出了通过令牌进行身份验证的答案。看看吧。 【参考方案1】:

由于 API 始终独立于客户端,因此最好使用令牌进行身份验证。

方法如下:

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

【讨论】:

感谢您的解释!你有这方面的额外资源吗?我目前正在谷歌搜索,并且对数据库支持的 cookie 与用于身份验证的令牌(也存储在 db 中)感到非常困惑。它们是非常相似的概念(你发回一些令牌 id)但可能会有所不同,哈哈 几个月前,我构建了一个 API,并从头构建了所有身份验证功能。这并不难。对于您的情况,如果您返回不同的令牌 ID,只需告诉用户:“您必须登录才能访问此应用程序。”仅使用有效令牌,您就可以假定用户已登录。 @HakimHauston 如果我的回答对您有帮助,您可以接受。 我认为这是一种非常糟糕的方法。首先,您还必须将其存储在 FE 端(localStorage、cookie 等),这是双重工作。那么你是如何处理令牌过期和令牌刷新的呢?此外,当您从 Db 中删除它时,它也必须在 FE 上删除,因此再次加倍工作。对我来说,最好的方法是 Oauth2 身份验证或将 httpOnly 标志设置为 true 的 cookie 会话。

以上是关于在 Rails api 应用程序中存储会话的主要内容,如果未能解决你的问题,请参考以下文章

Rails:如何在会话中存储数据?

Rails ActiveRecord 会话存储在 HTML5 SessionStorage 中而不是 Cookie

获取向 Rails 服务器发出请求的 API

Rails 没有在 ajax 帖子上重新加载会话

在 Rails 中存储持久会话数据而不影响正常会话过期

会话存储在 Rails 中的啥位置?