我应该如何存储Twitter令牌,以便用户不必每次都去twitter_oauth?

时间:2012-07-15 11:57:42

标签: ruby twitter sinatra oauth-2.0 twitter-oauth

我正在开发Twitter应用程序,所以我使用twitter_oauth gem进行授权。这是非常基本的代码。因此,如果用户进入/登录,它会将用户重定向到Twitter登录,一旦他登录并单击授权应用程序,他将被重定向回我的网站。


  begin
    callback = ENV['twitter_callback'] || "http://127.0.0.1:4567/login/success"
    request_token = @twitterClient.request_token(:oauth_callback => callback)
    MemcacheUtil::set("request_token_twitter", request_token, 3000)
    redirect request_token.authorize_url
  rescue Exception => e  
    puts e.message  
    puts e.backtrace.join("\n") 
    raise Exception.new("Something's wrong with twitter!")
  end

这就是我想做的事情。如果用户退出并且他想再次登录。现在,如果他点击登录按钮,他将再次被重定向到Twitter以授权该应用程序。无论如何我有可能克服这一点。我注意到一些网站然后即使我退出并再次点击登录。它做了一些事情,并没有去推特网站登录我。我怎么做?他们是否将我的令牌和秘密保存在饼干中?

例如:http://www.klout.com

1 个答案:

答案 0 :(得分:0)

您需要为自己的应用设置自己的用户模型,然后关联第三方帐户。 OpenSocial规范将Account定义为(domain,userId,username),这可能是一个安全的赌注。您也可以将其存储在memcached中,或者拥有不同的存储空间,然后将密钥存储在设备上或cookie中,具体取决于Web应用程序或本机应用程序。不要将令牌存储在cookie中,存储对用户的引用,然后对第一个请求执行查找,并可能将自己的身份验证令牌存储在memcached中以用于“会话”。

用户的简单MySQL表:

CREATE TABLE IF NOT EXISTS user (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(48), ..., PRIMARY KEY (id));

CREATE TABLE IF NOT EXISTS user_accounts (id INT NOT NULL AUTO_INCREMENT, domain VARCHAR(64), user_id VARCHAR(32), username VARCHAR(32), status TINYINT(1), PRIMARY KEY (id));

OR

用户/帐户的简单JSON对象(例如使用您自己的密钥存储在memcached中)

"user":{"id":yourId, "name":"Some Name", 
    "accounts":[{"domain":"twitter.com", "user_id":"sometoken", "username":"handle"}]
}

希望有帮助。密钥是存储您自己的用户,然后在后续访问期间将您的密钥作为cookie或设备引用,并执行您自己的查找。对于性能,您不希望查找每个请求,因此我建议您使用memcached为该用户存储会话。