6

我正在使用 Sinatra 构建一个 API(在客户端使用 Angular 并希望其他人能够访问 API),并且它也是一个 OAuth 提供者。我想知道最好的路线是什么(解决现有的宝石或从 Warden 或其他东西中推出自己的解决方案)。

之前在 Rails 中使用过 devise 和 doorkeeper 进行身份验证和 oauth,想知道 Sinatra 的最佳解决方案是什么。

理想情况下,我不希望视图或能够扩展/修改现有解决方案的操作,因为我纯粹作为 API 与之交互。

4

3 回答 3

1

我最近使用 S/O 的以下答案做了同样的事情

什么是 Sinatra/Rack 的非常简单的身份验证方案

它暗示了一个用户模型,但我没有使用它,而是在我的配置文件中设置了一个用户和管理员密码。然后我有一个只输入密码的登录表单。当用户输入该密码时,我根据设置中的密码进行了检查,并根据匹配的任何一个将 session['user'] 设置为 :admin 或 :user (如果没有,则设置为 nil )。然后在我的每条路线上,我相应地调用了 auth: :user 或 auth: :admin 。

于 2015-05-08T21:38:33.977 回答
1

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。

于 2016-02-06T06:35:27.370 回答
-1

请参阅Sinatra API 身份验证

快速总结:

  • Sinatra 没有内置的身份验证。
  • 最好自己构建身份验证(请参阅链接)。
  • 有可用的 gem,但对于像 API 这样简单的东西,您可能不需要它们。
于 2013-11-04T23:04:07.493 回答