【问题标题】:Authentication for Sinatra REST API appSinatra REST API 应用程序的身份验证
【发布时间】:2013-08-21 08:04:55
【问题描述】:
我正在使用 Sinatra 构建一个 API(在客户端使用 Angular 并希望其他人能够访问 API),并且它也是一个 OAuth 提供者。我想知道采取什么最佳途径(解决现有的宝石或从 Warden 推出自己的解决方案)。
之前在 Rails 中使用过 devise 和 doorkeeper 进行身份验证和 oauth,想知道 Sinatra 的最佳解决方案是什么。
理想情况下,我不希望视图或能够扩展/修改现有解决方案的操作,因为我纯粹作为 API 与之交互。
【问题讨论】:
标签:
ruby
authentication
oauth
sinatra
warden
【解决方案2】:
API 通常会接受您的登录请求并向您发送一个身份验证令牌,您需要在每次调用中将其传回。这与基于 cookie 的会话非常相似,在这种会话中,您的浏览器会自动传回在初始网站访问时获取的 cookie。
根据我在 Sinatra 的文档中看到的内容,您可以像这样创建一个基于会话的身份验证系统:
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
现在您需要在客户端中做的所有事情就是在请求 API 函数时传回响应初始访问而返回的 cookie 令牌。这可以通过任何支持 cookie 存储的 Web 客户端库(例如 libcurl)或通过手动将会话 cookie 插入请求标头来完成。 Rack::Minitest 功能还支持 cookie,因此您可以使用 minitest 测试您的 API。