在rails 4中存储访问令牌对象

时间:2016-05-16 17:56:32

标签: ruby-on-rails oauth

大家好,目前我在存储 OAuth :: AccessToken 的对象时遇到了问题。首先让我来描述一下情况。

我正在使用rails 4应用程序而我正在使用/使用其他网站的API说 example.com ,它使用3条腿的oauth授权(与twitter相同)。为了实现这个功能,我使用了这个link并实现了相同的功能。

现在我可以打开 example.com 之间的通信渠道,我的应用程序也可以使用他们的API。

这是我的示例实现

创建消费者

consumer = OAuth::Consumer.new API_KEY,
                               API_SECRET,
                               {
                                 site: SITE_URL,
                                 header: { ACCEPT_HEADERS },
                                 http_method: :get,
                                 request_token_url: request_token_uri,
                                 access_token_url: access_token_uri,
                                 authorize_url: authorizerequest_token_uri
                               }

获取请求令牌

request_token = consumer.get_request_token({}, CALLBACK_URL)

转到授权网址并获取访问令牌验证程序'

request_token.authorize_url
verifier = gets.chomp

获取访问权限

access_token = request_token.get_access_token(oauth_verifier: verifier)

现在我在整个应用程序中使用此access_token(OAuth :: AccessToken的对象)。 (用于制作get,post API调用)。由于我必须在应用程序中使用,我已将此对象存储到会话中。

session[:access_token] = access_token 

但有时我会收到 Cookie溢出错误 。所以我有以下疑问。

  • 存储此对象的好方法是什么? (除了DB)。
  • 我是否应该实施中间件?
  • 或者是否有其他方法可以实现相同类型的功能。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。我在数据库中存储了访问令牌,(我使用的是mysql数据库)。为此,我使用了Marshal类ruby。

来自文档

  

编组库将Ruby对象的集合转换为   字节流,允许它们存储在当前活动的外部   脚本。随后可以读取该数据和原始对象   重构。

以下是我的示例代码,用于存储访问令牌

access_token = request_token.get_access_token(oauth_verifier: verifier)
encrypt_access_token = Marshal.dump(access_token)
AccessTokenUser.create(user_id: 1, access_token: encrypt_access_token)

检索存储的acceess_token

decrypt_access_token = Marshal.load(access_token)

然后,您可以使用此解密的访问令牌进行API调用。

答案 1 :(得分:0)

您可以尝试不同的会话存储机制,例如memcached或redis(在服务器上)。这可以允许更大的会话。但是,这只是"实现不同类型的数据库"。

如果你是勇敢或愚蠢的,你也可以尝试压缩数据或将其直接存储在加密的cookie中,或者分成多个块并存储在单独的cookie中,但所有这些都是黑客攻击,最好的答案是实现一个db后端或升级会话存储。 :)