2016-05-16 75 views
2

大家好我目前正面臨一個問題,同時存儲對象OAuth :: AccessToken。首先讓我描述一下情況。在軌道中存儲訪問令牌對象4

我正在使用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 

取指訪問tokene

access_token = request_token.get_access_token(oauth_verifier: verifier) 

我現在用這個的access_token(的OAuth ::的accessToken的對象),在整個應用程序。 (用於獲取,發佈API調用)。由於我必須在應用程序中使用,因此我已將此對象存儲到會話中。

session[:access_token] = access_token 

但有時我收到餅乾溢出錯誤。所以我有以下疑問。

  • 什麼是存儲此對象的好方法? (除了DB)。
  • 我需要實現中間件嗎?
  • 或者是否有任何其他方式來實現相同類型的功能。
+0

訪問令牌長度多少字節? – court3nay

+0

爲什麼你不想使用數據庫?你必須將這些數據存儲在某個地方。 – court3nay

回答

2

我得到了同樣類型的問題。我在數據庫(我正在使用mysql數據庫)中存儲訪問令牌。爲此,我使用了Marshal類的紅寶石。

從DOC

的編組庫轉換紅寶石的集合對象爲 字節流,允許它們被保存在當前活動 腳本之外。隨後可以讀取該數據並重新構造原始對象 。

這裏是我的存儲訪問令牌

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調用。

0

您可以嘗試不同的會話存儲機制,例如memcached或redis(在服務器上)。這可能允許更大的會話。但是,這只是「實現不同類型的數據庫」。

如果您勇敢或愚蠢,您也可以嘗試壓縮數據或直接將其存儲在加密的cookie中,或者分成多個塊並存儲在單獨的cookie中,但所有這些都是黑客,最好的答案是實施一個數據庫後端或升級你的會話存儲。 :)