分布式ruby环境下xero oauth2令牌刷新

mzillmmw  于 2021-06-10  发布在  Redis
关注(0)|答案(2)|浏览(431)

我们有一个RubyRails前端和分布式后端服务,通过redis运行批处理作业。
前端将获取初始的xerooauth2令牌。
令牌将在30分钟后过期,刷新令牌持续60天(很好),但只能使用一次。
当多个后端进程尝试访问xero并且令牌已过期时,只有一个进程可以成功,其他进程将失败,因为刷新令牌是一次性使用的。
数据库事务边界使得通过数据库共享令牌变得不切实际。
我考虑过以下解决方案(我不喜欢其中任何一个):
处理所有xero交互的单例。
在重试进程中 Package xero,并检查redis中可能已被另一个进程更新的令牌。
让用户反复通过oauth2登录,为每个后端进程获取一个令牌。
不幸的是,我对ruby和redis都是新手,所以在这种环境下实现的细节将非常有用。

w3nuxt5m

w3nuxt5m1#

所以这就是我采取的方法。
从数据库获取令牌或刷新令牌时:在新线程上执行此操作,以确保活动记录使用单独的数据库连接。这确保了数据库事务不会干扰查看令牌的最新版本。

m2xkgtsf

m2xkgtsf2#

我强烈建议您不要将具有实际令牌凭据的作业作为传递给redis的元数据排队。
您的访问令牌和刷新令牌应该只存储在一个地方。当您将作业排队时,您应该只向它传递一个用户标识,在这种情况下,当处理作业时,它将查找user.token\u集,然后使用xero ruby sdk将该user.token\u集['access\u token']传递到xero\u客户端(或以任何方式设置)。
刷新访问\u令牌时,将返回一个新的令牌\u集,包括一个新的刷新\u令牌。冲洗并重复。
数据库事务边界使得通过数据库共享令牌变得不切实际
这让我有点困惑。后台作业在做什么?他们是否正在处理数据并将其读/写到您将要存储该令牌集的同一数据库中?他们是否严格调用非应用程序级db/API?

相关问题