为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
凤凰求蛊 2023-04-17 16:22:30
我们有一个 Rails 应用程序作为主站点,但我们在 Golang 中创建了一个单独的应用程序来处理许多其他实时功能,例如视频和音频呼叫、消息传递和白板部分。我们现在遇到的问题是我们不知道如何在两个应用程序之间共享网络会话。当您在 Rails 应用程序和 Golang 之间切换时。就像从 Gmail 到 Google Drive 再到 YouTube 一样,会话保持不变,即使这些应用程序运行在不同的子域中,有时甚至使用不同的语言。我能够将来自 Rails + Devise/Warden 的会话添加到浏览器 cookie 中,但 cookie 是加密的。我如何解密或使用此 cookie 来验证 Go 中的用户?你们能和我分享一下你们将如何在自己的应用程序中解决这个问题吗?使用这个答案,我能够让会话 cookie 出现在 React + Rails 的主站点和 React + Golang 的子域中,但是 cookie 是加密的,我们如何解密/获取其中的值?例如 user_id?
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

您应该尝试使用rails5session 库:

从自述文件:

使用您的 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)

}


查看完整回答
反对 回复 2023-04-17
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

redis您可以使用数据存储作为中央共享内存在两个后端(无论后端如何)之间共享会话。

Rails因此,每当您在或应用程序中创建新会话时Go

  • 创建会话 ID(例如 UUID)a59eb448-d268-413e-a837-b5aefc65a4b2

  • redis您将使用该唯一会话 ID ( )存储您的会话详细信息a59eb448-d268-413e-a837-b5aefc65a4b2

  • 您将会话 ID 存储在两个平台域之间共享的 cookie 中。因此,如果是rails.mydomain.comgo.mydomain.com那么您需要使 cookie 可以从两个子域访问*.mydomain.com

  • 当具有此 cookie 的用户访问您的任何平台时。你可以从他的 cookie 中读取 session-id 并用它来查询 redis 并获取会话信息(user_id 等)。

通过这种方式,您可以使用 cookie 在客户端的不同子域之间共享会话,并使用 redis 在服务器端的不同后端共享。


查看完整回答
反对 回复 2023-04-17
  • 2 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信