2010-12-12 64 views
2

我使用的是Authlogic和Rails 3.除了基於瀏覽器的常規用戶體驗(通過窗體和whatnot登錄)之外,我希望實現一個API。阻止Authlogic爲非HTML請求建立會話/ cookie

Authlogic似乎支持默認情況下不會保留的單個訪問令牌。

/users.xml?user_credentails=my_single_access_token 

問:我通過增加一個GET參數作爲在提供給他們有什麼辦法,我可以有Authlogic接受通過HTTP基本認證的API密鑰? Highrise做一些事情就是這樣的,允許:

curl -u 605b32dd:X http://sample.highrisehq.com/people/1.xml 

同樣與Freshbooks

curl -u insert_token_here:X https://sample.freshbooks.com/api/2.1/xml-in -d '[xml body here]' 

我怎麼會去模仿這個功能?我甚至無法弄清楚輸入數據(來自表單的postdata,HTTP基本,API令牌)在哪裏。我把它歸結爲一個沒有參數的調用UserSessions.find,但在那之後我忘記了它。

任何幫助將不勝感激!

相關問題:如果使用HTTP basic,我還想禁用會話持久性(使它不存儲cookie)。任何幫助也將不勝感激!

回答

0

免責聲明:我不是100%這是可能的方式您的描述沒有黑客Authlogic的核心功能。

您將擁有的第一個問題是,authlogic可防止使用SSO的令牌進行驗證,除非請求是ATOM或RSS來覆蓋這一點,你需要通過一個配置paramater在這裏看到:http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/Session/Params/Config

到核心問題:我沒有看到任何'簡單'的方法來處理這個功能,但是你可以做的像捲曲這樣的事情就是將用戶令牌作爲參數傳遞(使用-G選項),就像訪問網址時一樣。

捲曲文檔:http://curl.haxx.se/docs/manpage.html

+0

允許站點範圍內的單個訪問令牌/ API密鑰似乎與控制器的single_access_allowed?方法返回true一樣容易。 – 2010-12-12 23:07:12

5

如果您正在實施一個API,你可以考慮建立一個單獨的機架應用程序,然後將其安裝在「/api/1.0/...」和共享您的模型。

這樣你就不會把你的API與你的公共路線直接聯繫起來,這對API用戶來說可能很難構建。

一個好的方法是創建一個簡單的辛納屈的應用程序,公開只是你想要的方式,並隨後創建一個獨立的身份驗證策略:

require 'sinatra'  
require 'active_support' # all the Rails stuff 
require 'lib/user' # your User class 
require 'sinatra/respond_to' # gem install sinatra-respond_to 

Sinatra::Application.register Sinatra::RespondTo 

use Rack::Auth::Basic, "API", do |username, password| 
    User.find_by_login(username).valid_password?(password) 
end 

get '/api/1.0/posts' do 
    @posts = Post.recent # assuming you have a Post model... 

    respond_to do |wants| 
    wants.xml { @posts.to_xml } 
    wants.to_json { @posts.to_json } 
    end 
end 

get '/api/1.0/users/:id' do 
    @user = User.find_by_login(params[:id]) 

    # Careful here - don't release personal details! 
    respond_to do |wants| 
    wants.xml { @user.to_xml } 
    wants.to_json { @user.to_json } 
    end 
end 

與「1.0」版本管理您的API(或類似)意味着如果您更改模型,則可以創建API的新版本而不會破壞用戶的現有代碼。

使用這個你應該能夠讓用戶在形式HTTP基本身份驗證:

curl -u steven:password http://example.com/api/1.0/users/steven.xml 
curl -u steven:password http://example.com/api/1.0/users/steven.json 
curl -u steven:password http://example.com/api/1.0/posts.xml 

爲了得到這個運行,將其保存爲「api.rb」,要麼運行它作爲一個機架中間件,或創建像這樣一個 'config.ru' 文件:

require 'api' 
run Sinatra::Application 

,然後從該目錄:

rackup 
+0

感謝stef對你在Rails環境下API設置的精彩評論,儘管它對於我的問題並沒有多大的幫助:如何在HTTP基本認證字符串中提供單一訪問令牌/ API時驗證用戶。 – 2011-01-05 14:33:16

+0

噢,我看到了 - 您想使用令牌而不是密碼...正在更新以反映這一點。 – stef 2011-01-05 14:59:34

+0

謝謝stef,您可以通過其他方式設置API的詳細答案和評論。爲此我upvote你。但是我的問題(明確地說,如何強制Authlogic執行這個特定的功能)仍然沒有得到解決。我將繼續自行調查。 – 2011-01-07 04:18:17

0

如果我誤解了你的問題,請原諒我,但我想答案是一個簡單的「不」。你在這裏混合兩個隱喻。如果您需要安全的API密鑰,請使用單一訪問令牌;如果你想使用http基本訪問認證,你需要一個不同的base64字形 - 而且http basic auth不是特別安全(除非通過https使用,這通常不實用)。

更詳細地:

每維基百科,http basic authentication旨在提供以簡單,標準用戶名和密碼,但相當不安全的base64編碼字形。

要使用基本身份驗證,那麼我相信你想通過一個簡單的

Base64.encode64("#{user.name}:#{password}") 

生成字形......和我可能會通過讓用戶輸入自己的密碼,因爲你不能做到這一點t從authlogic存儲在數據庫中的crypted_pa​​ssword派生密碼。

但結果是這是一個與single_access_token非常不同的野獸,而且兩者不能混合。

+1

在我看來,將單個訪問令牌接受爲HTTP Basic用戶名(帶有虛擬密碼)的安全性不亞於將單個訪問令牌接受爲查詢字符串的默認Authlogic做法。僅供參考,SSL用於所有已認證的請求,但這些細節超出了我的正確問題的範圍。爲了澄清我的問題,我不打算將用戶名/密碼認證與API密鑰「結合」;我只想告訴Authlogic在通過HTTP Basic提供API鍵時接受API鍵,而不是作爲查詢字符串屬性。 – 2011-01-06 06:47:52

+0

我的意思是說,如果您使用實際的用戶名和密碼,我認爲它可以開箱即用。關於安全的公平點。我不會使用原始單個訪問令牌。 – dondo 2011-01-06 06:55:34

+0

我對single_access_key感到困惑; AuthLogic不會允許更好的安全性,但它並沒有聞到這一點。所以我做了更多的研究。這篇文章--http://stackoverflow.com/questions/1691330/validate-api-with-authlogic - 在這方面讓我放心,看起來它可能爲您提供解決問題所需的信息。 – dondo 2011-01-06 17:44:42