2013-08-19 53 views
6

Tôi đang xây dựng một API với Sinatra (sử dụng Góc cho phía máy khách và muốn người khác có quyền truy cập vào API) và có nó cũng là một nhà cung cấp OAuth. Tôi tự hỏi những gì các tuyến đường tốt nhất để có (làm việc ra đá quý hiện có hoặc giải pháp riêng của cuộn tắt Warden hoặc một cái gì đó).Xác thực cho ứng dụng API Sinatra REST

Đã sử dụng thiết lập và quản lý cửa để xác thực và oauth trước với Rails, tự hỏi giải pháp tốt nhất cho Sinatra là gì.

Lý tưởng nhất là tôi không muốn lượt xem hoặc có thể mở rộng/sửa đổi các hành động của giải pháp hiện có, vì tôi đang tương tác hoàn toàn với API đó.

+2

bạn có thể muốn thanh toán nho https://github.com/intridea/grape – zotherstupidguy

Trả lời

0

Xem Sinatra API Authentication.

nhanh tóm tắt:

  • Sinatra không có built-in auth.
  • Tốt nhất bạn nên tự xây dựng auth (xem liên kết).
  • Có sẵn các loại đá quý, nhưng có thể bạn sẽ không cần chúng cho một thứ đơn giản như một API.
1

Tôi chỉ vừa mới làm điều tương tự bằng cách sử dụng câu trả lời sau đây từ S/O

What is a very simple authentication scheme for Sinatra/Rack

Điều đó ngụ ý một mô hình người dùng, nhưng thay vì sử dụng đó, tôi chỉ cần đặt một người dùng và mật khẩu quản trị trong tập tin cấu hình của tôi. Sau đó, tôi đã có một hình thức đăng nhập mà chỉ cần lấy một mật khẩu. Khi người dùng nhập mật khẩu đó, tôi đã kiểm tra nó dựa vào cài đặt và đặt phiên ['user'] thành: admin hoặc: người dùng theo bất kỳ điều gì phù hợp (hoặc không có gì). Sau đó trên mỗi tuyến đường của tôi, tôi được gọi là auth:: user hoặc auth:: admin phù hợp.

1

API thường chấp nhận yêu cầu đăng nhập của bạn và gửi cho bạn mã thông báo xác thực mà bạn cần phải trả lại trong mỗi cuộc gọi. Điều này rất giống với các phiên dựa trên cookie, nơi trình duyệt của bạn tự động trả lại cookie được mua trong lần truy cập trang web ban đầu.

Từ những gì tôi đã nhìn thấy trong tài liệu Sinatra, bạn có thể làm cho một hệ thống xác thực dựa trên phiên như thế này:

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 

Bây giờ tất cả bạn cần làm trong ứng dụng của bạn là phải vượt qua trở lại token Cookie trở để phản hồi lượt truy cập ban đầu khi yêu cầu chức năng API. Điều này có thể được thực hiện với bất kỳ thư viện máy khách web nào hỗ trợ các cửa hàng cookie (chẳng hạn như libcurl) hoặc bằng cách chèn cookie phiên vào tiêu đề yêu cầu theo cách thủ công. Chức năng Rack::Minitest cũng hỗ trợ cookie, vì vậy, bạn có thể kiểm tra API của mình bằng minitest.

Các vấn đề liên quan