【问题标题】: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


【解决方案1】:

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

What is a very simple authentication scheme for Sinatra/Rack

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

【讨论】:

    【解决方案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。

    【讨论】:

      【解决方案3】:

      Sinatra API Authentication

      快速总结:

      • Sinatra 没有内置的身份验证。
      • 最好自己构建身份验证(请参阅链接)。
      • 有可用的 gem,但您可能不需要它们来处理像 API 这样简单的事情。

      【讨论】:

        猜你喜欢
        • 2011-03-29
        • 2012-04-12
        • 1970-01-01
        • 2014-01-26
        • 2014-04-23
        • 2014-02-25
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        相关资源
        最近更新 更多