Chúng tôi sẽ phát triển một ứng dụng API nhỏ ở Sinatra. Các tùy chọn xác thực có sẵn để bảo mật các cuộc gọi API là gì?Sinatra - API - Xác thực
Trả lời
Sinatra không có hỗ trợ xác thực được tích hợp sẵn. Có một số đá quý có sẵn, nhưng hầu hết được thiết kế để xác thực người dùng (ví dụ: đối với trang web). Đối với một API, họ có vẻ như quá mức cần thiết. Thật dễ dàng để tự làm. Chỉ cần kiểm tra các thông số yêu cầu trong mỗi tuyến đường của bạn để xem liệu chúng có chứa khóa API hợp lệ hay không và nếu không, hãy trả lại lỗi 401.
helpers do
def valid_key? (key)
false
end
end
get "/" do
error 401 unless valid_key?(params[:key])
"Hello, world."
end
# $ irb -r open-uri
# >> open("http://yourapp.com/api/?key=123")
# OpenURI::HTTPError: 401 Unauthorized
Không có gì sau khi cuộc gọi đến error
sẽ xảy ra nếu phương pháp valid_key?
của bạn trả về false - error
gọi halt
trong nội bộ, mà dừng lại các yêu cầu từ tiếp tục.
Tất nhiên, không phải lý tưởng để lặp lại séc ở đầu mỗi tuyến đường. Thay vào đó, bạn có thể tạo tiện ích nhỏ có thêm điều kiện để các tuyến đường của bạn:
class App < Sinatra::Base
register do
def check (name)
condition do
error 401 unless send(name) == true
end
end
end
helpers do
def valid_key?
params[:key].to_i % 2 > 0
end
end
get "/", :check => :valid_key? do
[1, 2, 3].to_json
end
end
Nếu bạn chỉ muốn xác thực trên tất cả các tuyến đường của bạn, sử dụng một handler before
:
before do
error 401 unless params[:key] =~ /^xyz/
end
get "/" do
{"e" => mc**2}.to_json
end
http://www.secondforge.com/blog/2014/11/05/simple-api-authentication-in-sinatra/ có một chút chi tiết hơn câu trả lời sử dụng mã thông báo người dùng.
Đây là một bước phức tạp hơn khóa API nhưng cần thiết nếu API của bạn cần xác thực để đăng nhập người dùng thực hiện những việc như chỉnh sửa tên/email/mật khẩu hoặc truy cập thông tin cho mỗi người dùng. (tức là các hành động API "riêng tư"). Bạn cũng có thể hủy bỏ/hết hạn thẻ dùng để cho mọi người thoát ra vv
class App < Sinatra::Base
before do
begin
if request.body.read(1)
request.body.rewind
@request_payload = JSON.parse request.body.read, { symbolize_names: true }
end
rescue JSON::ParserError => e
request.body.rewind
puts "The body #{request.body.read} was not JSON"
end
end
post '/login' do
params = @request_payload[:user]
user = User.find(email: params[:email])
if user.password == params[:password] #compare the hash to the string; magic
#log the user in
else
#tell the user they aren't logged in
end
end
end
(Đó là giá trị cần lưu ý rằng nó phổ biến hơn để đọc thông tin từ một tiêu đề HTTP thay vì cơ thể JSON, nhưng tác giả đề cập rằng .)
- 1. Xác thực cho ứng dụng API Sinatra REST
- 2. Xác thực API REST
- 3. Xác thực API Tastypie
- 4. API Sinatra và Grape cùng nhau?
- 5. Xác thực API Web ASP.NET
- 6. Xác thực API Google Drive
- 7. Xác thực API Youtube - Iphone
- 8. Xác thực bằng REST API
- 9. Xác thực API REST MongoDB
- 10. Làm cách nào để thực hiện xác thực Sinatra LDAP thực sự đơn giản?
- 11. Sinatra :: Base.condition thực sự làm gì?
- 12. Thư viện nào sẽ cung cấp xác thực OAuth 2.0 dễ dàng nhất cho Sinatra
- 13. Xác thực API của Spring Rest
- 14. Cách xác thực EWS Java API
- 15. Xác thực API PHP và các phiên
- 16. Node.js xác thực api REST và OAuth2
- 17. Mã xác thực Windows API rõ ràng
- 18. Xác thực API Google cho máy chủ
- 19. Chương trình xác thực không xác định trên LinkedIn API
- 20. Thực hành tốt nhất về xác thực API Web
- 21. Làm cách nào để loại trừ đường dẫn yêu cầu xác thực cơ bản trong Sinatra
- 22. Cách xác thực với Google Talk bằng mã xác thực của AccountManager bằng API Smack?
- 23. API ứng dụng khách của Jersey - xác thực
- 24. Sử dụng Xác thực Mẫu với Web API
- 25. Asp.net MVC 4 + WEB API - Mã xác thực tùy chỉnh
- 26. Tìm kiếm Bing API Xác thực Azure Marketplace trong Java
- 27. Xác thực OAuth cho Google API với Qt
- 28. xác thực sử dụng Facebook thông qua Rails API
- 29. nhầm lẫn xác thực api an toàn với oauth2
- 30. API ServiceStack và Xác thực ASP MVC theo hai cách
Todd Yandell, cảm ơn rất nhiều câu trả lời chi tiết và thời gian bạn dành cho nó. Tôi thực sự đánh giá cao. Nó thực sự hữu ích. Imran – Saim
Tạo tiện ích mở rộng nhỏ có vẻ quá mức, bộ lọc trước là đủ, vì tùy chọn sau có tùy chọn áp dụng cho các tuyến đường nào. Bạn cũng có thể nói rằng từ bên trong phần thân của bộ lọc theo request.path_info. – Robert