Ruby 服务端 token 怎样设计

whatisruby · 2012年12月05日 · 最后由 leonkaiyu 回复于 2012年12月10日 · 20548 次阅读

最近要给 手机应用客户端提供 api 目前还不确定用哪些,或则 sinatra 还是 grape?,求推荐!!

回到主题 因为 api 需要权限控制,所以有些 api 需要带上 token。 请教大家:服务端产生的 token,一般是放在数据库,每次请求 api 都查询一次 还是放在内存中,然后设计过期时间?

麻烦大家提供靠谱点的思路

(我看了下 ruby-china 的代码,好像直接存入 user 表,每次请求查询一次的)

内存和数据库都需要,内存可以加快请求速度,减少数据库请求。

产生过程和验证过程可以参考 oauth 的 token 验证和授权过程。

或者是一个简单的,我们现在使用的就是 token。 在访问任何服务之前都需要先访问一个获取 token 的服务,服务在后台生成一个 token,存入数据库。 后续的服务访问,都需要传入 username 和 token,服务会判断 token 是否和 username 匹配,token 是否过期。 过期用的定时服务,定时删除超时的 token,下次验证就可以做过期提示了。

这个比较简单。 可以增加一个授权的过程。 就是 client 提交 key-secret,验证 client 是否合法 client。 如果是合法 client,返回一个未授权的 token,然后再用这个 token 请求一个授权的 token。 使用授权的 token 访问服务。

session 验证满足不了你的需求么

个人建议用 sinatra,更灵活 token 的话,不如直接上 oauth? https://github.com/songkick/oauth2-provider

#4 楼 @woaigithub 后台服务的数据库应该还是需要用到内存数据库吧 #5 楼 @hooopo session 怎么用? #6 楼 @allenwei 刚接触 ruby 不久,不是很理解咋用这个啊 - -!

用内存数据库是因为可以加快访问和验证,现从数据库获取验证也是可以的。

每次请求都要带上其实是 session token 一般是用来做一次验证,短时间过期,验证通过之后换 session session 解决方案很多,不用自己做了

#8 楼 @woaigithub#9 楼 @sparkle 嗯嗯,哪里有现成的 demo 让我喵一眼啊 呵呵

rails 里面就有很多 session 内存、文件、数据库、dbr、redis 都有

#11 楼 @sparkle session 应该保存不了吧,手机客户端请求服务端,没有浏览器的支持,估计 session 是马上消失的,我都打算禁用 session 呢

不是说通过浏览器的 cookie 传进来的 session id 才叫 session session id 可以自己的代码传进来

#13 楼 @sparkle 恩,所以这个 session 只是名字上是 session 而已,对吧 我现在打算的做法是:把 key(token):value(user_id) 放在 redis 内存数据库 然后设置这个 key 的过期时间,这个做法靠谱不?

我前面的做法不对,我理解 13 楼 sparkle 的说法了

匿名 #16 2012年12月10日

#13 楼 @sparkle 我一直非常关注这块,学习 Ruby 也是因为 ROR 的 RESTful 风格在 API 开发时候的首选。其实最成熟的解决方案是 XAuth,因为通过公钥和私钥对生成(混入 Action)的 token 目前相对安全度很高。如果使用 session_id,安全会存在截获 session_id 以后,非法侵入。

欢迎讨论!

  • #6 楼 @allenwei 有 oauth2-provider 的实际项目经历吗?不知道有没有 XAuth 版本?性能如何?

https://dev.twitter.com/docs/oauth/xauth

需要 登录 后方可回复, 如果你还没有账号请 注册新账号