2010-07-13 37 views
2

我正在研究Viddler的API封裝器,它最終會公開,我試圖找出處理認證/ API密鑰的最佳方法,特別是在Rails應用程序中的使用情況。如何處理Ruby API封裝的身份驗證?

寫的包裝是隻具有代碼創建一個新的客戶端的每個時間,開發人員可以在一個恆定的存儲API密鑰以備將來使用最簡單的方法:

@client = Viddler::Client.new(VIDDLER_API_KEY) 

的問題這就是,必須不斷創建客戶端對象並傳入API密鑰纔是有點笨拙的。當您將用戶身份驗證放入組合中時,這會變得更加複雜。

我在想一些解決方案,我將所有的API密鑰設置在環境文件中,然後認證將在before_filter中完成。然後

Viddler::Client.api_key = 'abc123' 
Viddler::Client.authenticate! 'username', 'password' 

Viddler::Client將這些信息存儲在一個類變量,你可以調用Viddler::Client.new不帶任何參數,並驗證的調用。我擔心的一件事是,這意味着開發人員必須確保在每次請求之前或之後清除身份驗證,因爲類變量將在請求之間持續存在。

有什麼想法?

回答

1

在全球範圍內存儲API密鑰肯定會非常有用,並且當然是這種信息的途徑。另一方面,我認爲用戶身份驗證不應全局存儲,尤其是對於高級API,因爲告訴用戶「確保添加after_filter :reset_viddler_auth」可能會導致一些意外的安全風險。

# in a config/initializer/*.rb file or something 
Viddler::Client.api_key = "abc123" 

# in the controller/action/model/wherever 
@client = Viddler::Client.new # anonymous 
@client.authenticate!("username", "password") # authenticate anon client 

@client_auth = Viddler::Client.new("username", "password") # authenticated client 

猜就像你曾兩全其美:)甚至提供了一種方法來創建像另一個API密鑰一個新的客戶,

@client_other = Viddler::Client.new("username", "password", :api_key => "xyz890") 

所以...只是我的2美分。

PS:不知道如何跟上時代的它,但已經有一個紅寶石viddler包裝,僅供參考,http://viddler.rubyforge.org/rdoc/

+0

感謝您的答覆!在原始問題中我應該提到的一件事是我也將建立一個基於模型的包裝器,所以你可以做這樣的事情:'Viddler :: Video.find_by_username('kyleslat')'。這會調用'viddler.videos.getByUser'調用,該調用可以*可以被認證或不被認證。要麼我需要某種全局會話('Viddler :: Client.session'或其他,你有提到的問題),或者我以某種方式傳遞客戶端/會話,比如'Viddler :: Video.find_by_username(' kyleslat',@client)'。 – 2010-07-13 15:17:34

+0

關於另一個包裝 - 我實際上是Viddler的一名員工,現有的包裝相當不合時宜,所以我們決定自己製作一個官方包裝。 – 2010-07-13 15:18:56

+0

mhh,所以你不想讓它像AR API那肯定是好的......當然你可以添加一個全局會話對象(就像AR中的連接一樣),但說實話 - 沒有經驗的用戶可能會使用你的API錯誤(即不清除會話信息或類似信息)。可以這麼說,'Viddler :: Video.find_by_username('kyleslat',@session)',或'Viddler :: Session.authorized'('user','pass')do .... end',還要看看其他Ruby API如何解決這個問題。 PS:期待玩弄你的API :) – lwe 2010-07-14 06:50:26