我正在使用 Sinatra 构建一个 API(在客户端使用 Angular 并希望其他人能够访问 API),并且它也是一个 OAuth 提供者。我想知道最好的路线是什么(解决现有的宝石或从 Warden 或其他东西中推出自己的解决方案)。
之前在 Rails 中使用过 devise 和 doorkeeper 进行身份验证和 oauth,想知道 Sinatra 的最佳解决方案是什么。
理想情况下,我不希望视图或能够扩展/修改现有解决方案的操作,因为我纯粹作为 API 与之交互。
我正在使用 Sinatra 构建一个 API(在客户端使用 Angular 并希望其他人能够访问 API),并且它也是一个 OAuth 提供者。我想知道最好的路线是什么(解决现有的宝石或从 Warden 或其他东西中推出自己的解决方案)。
之前在 Rails 中使用过 devise 和 doorkeeper 进行身份验证和 oauth,想知道 Sinatra 的最佳解决方案是什么。
理想情况下,我不希望视图或能够扩展/修改现有解决方案的操作,因为我纯粹作为 API 与之交互。
我最近使用 S/O 的以下答案做了同样的事情
它暗示了一个用户模型,但我没有使用它,而是在我的配置文件中设置了一个用户和管理员密码。然后我有一个只输入密码的登录表单。当用户输入该密码时,我根据设置中的密码进行了检查,并根据匹配的任何一个将 session['user'] 设置为 :admin 或 :user (如果没有,则设置为 nil )。然后在我的每条路线上,我相应地调用了 auth: :user 或 auth: :admin 。
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。
请参阅Sinatra API 身份验证。
快速总结: