在 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 应用程序中存储会话的主要内容,如果未能解决你的问题,请参考以下文章