在Rails 5.2应用程序和Golang之间共享Web会话

时间:2018-10-04 23:32:16

标签: ruby-on-rails go jwt

我们有一个Rails应用程序作为主站点,但是我们在Golang中创建了一个单独的应用程序,该应用程序可以处理许多其他实时功能,例如视频和音频呼叫,消息传递和白板部分。

我们现在遇到的问题是,我们不知道如何在两个应用程序之间共享Web会话。在Rails应用和Golang之间切换时。就像从Gmail到Google云端硬盘再到YouTube一样,会话仍保持不变,即使这些应用程序以不同的子域(有时甚至是不同的语言)运行。

我能够将Rails + Devise / Warden中的会话添加到浏览器cookie中,但是该cookie是加密的。如何在Go中解密或使用此Cookie验证用户身份?

你们能和我分享一下您将如何在自己的应用中解决此问题的方法吗?

使用此answer,我可以使会话cookie既出现在React + Rails的主站点中,又出现在React + Golang的子域中,但是cookie是经过加密的,我们如何解密/获取那里的价值?例如user_id?

2 个答案:

答案 0 :(得分:1)

您可以使用TextObject text =(TextObject)CrystalReport21.ReportDefinition.Sections["Section3"].ReportObjects["Text19"]; text.Text = comboBox2.Text; crystalReportViewer1.ReportSource = name your crystalreport; crystalReportViewer1.Refresh(); 数据存储区作为中央共享内存在两个后端(无论后端)之间共享会话。

因此,每当您在redisRails应用中创建新会话时:

  • 创建一个会话ID(例如,UUID)Go
  • 您将使用唯一的会话ID(a59eb448-d268-413e-a837-b5aefc65a4b2)将会话详细信息存储在redis中。
  • 您将会话ID存储在两个平台域之间共享的cookie中。因此,如果它是a59eb448-d268-413e-a837-b5aefc65a4b2rails.mydomain.com,则需要使cookie可以从两个子域go.mydomain.com访问。
  • 具有此cookie的用户访问您的任何平台时。您可以从他的cookie中读取session-id,并用它来查询redis并获取会话信息(user_id等)。

这样,您可以使用Cookie在客户端的不同子域之间共享会话,并使用Redis在服务器端的不同后端之间共享会话。

答案 1 :(得分:1)

您应该尝试尝试rails5session library

来自Readme

使用Rails会话秘密密钥库创建加密实例(指定 在config / secrets.yml中)

encryption := rails5session.NewEncryption(
    secretKeyBase,
    cookieSalt,
    signedCookieSalt,
)
  • 您可以通过运行以下Ruby代码获取cookieSalt:

    Rails.application.encryption.action_dispatch.encrypted_cookie_salt
    
  • 您可以通过运行以下Ruby代码来获取您的signedCookieSalt:

    Rails.application.encryption.action_dispatch.encrypted_signed_cookie_salt
    

然后验证并解密用户的cookie,它将返回解密的字节片 和错误(如果有)。

data, err := rails5session.VerifyAndDecryptCookieSession(encryption, cookie)
if err != nil {
    panic(err)
}