【问题标题】:Storing access token object in rails 4在rails 4中存储访问令牌对象
【发布时间】:2016-10-12 16:44:24
【问题描述】:

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

我正在开发 rails 4 应用程序,我正在使用/使用另一个站点的 API,例如 example.com,它使用 3-legged 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 的对象)。 (用于获取、发布 API 调用)。由于我必须在应用程序中使用,我已将此对象存储到会话中。

session[:access_token] = access_token 

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

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

【问题讨论】:

  • 访问令牌有多少字节?
  • 你为什么不想使用数据库?您必须将这些数据存储在某个地方。

标签: ruby-on-rails oauth


【解决方案1】:

我遇到了同样类型的问题。我已将访问令牌存储在 database 中(我正在使用 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)

检索存储的 accesses_token

decrypt_access_token = Marshal.load(access_token)

然后你可以使用这个解密的访问令牌进行 API 调用。

【讨论】:

  • Marshal 不加密访问令牌。它只是将其转换为字节流。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 2012-07-18
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多