2013-08-19 45 views
6

我正在用Sinatra構建API(爲客戶端使用Angular並希望其他人可以訪問API),並讓它成爲OAuth提供者。我想知道最好的路線是什麼(去掉現有的寶石或者把自己的解決方案從校長那裏拿走)。對Sinatra REST API的驗證應用

在使用Rails之前,曾使用devise和doorkeeper進行認證和oauth,想知道Sinatra的最佳解決方案是什麼。

理想情況下,我不希望這些視圖或能夠擴展/修改現有解決方案的操作,因爲我純粹將其作爲API進行交互。

+2

您可能想結賬葡萄https://github.com/intridea/grape – zotherstupidguy

回答

0

參見Sinatra API Authentication

快速摘要:

  • 西納特拉沒有內置的身份驗證。
  • 最好自己構建auth(請參閱鏈接)。
  • 有可用的寶石,但你可能不會需要它們的東西就像一個API一樣簡單。
1

我只是用了以下的答案必須從S/O

What is a very simple authentication scheme for Sinatra/Rack

這意味着用戶模式最近做了同樣的事情,但不是用,我只是設置一個用戶和管理員密碼在我的配置文件中。然後我有一個登錄表單,只需要一個密碼。當用戶輸入密碼時,我將其與設置中的密碼進行覈對,並將會話['user']設置爲:admin或:user,根據匹配的任何一個(或者如果沒有則爲零)。然後在我的每條路線上,我相應地調用了auth::user或auth::admin。

1

API通常會接受您的登錄請求並向您發送一個身份驗證令牌,您需要在每次調用中返回該令牌。這與基於Cookie的會話非常相似,在這些會話中,瀏覽器會自動傳回在首次訪問網站時獲取的Cookie。

從我在西納特拉的文檔所看到的,你可以做一個基於會話的認證系統是這樣的:

enable :session 
disable :show_exceptions 

use Rack::Session::Pool, 
    key: 'session_id' 

post '/login' do 
    user = User.login_success(params) 
    halt 401 if user.nil? 
    session[:user] = user 
    200 
end 

get '/fun' do 
    user = session[:user] 
    halt 401 if user.nil? 
    halt 403 if !user.has_permission_for '/fun' 
    "fun was had" 
end 

現在你需要在你的客戶做的是傳回返回的cookie的令牌以響應請求API函數時的初始訪問。這可以通過任何支持Cookie存儲的Web客戶端庫(例如libcurl)或通過手動將會話cookie插入到請求頭中來完成。 Rack::Minitest功能還支持cookie,因此您可以使用minitest測試您的API。