阻止Authlogic为非HTML请求建立会话/ cookie

Ste*_*ven 2 api ruby-on-rails authlogic

我正在使用Authlogic和Rails 3.除了常规的基于浏览器的用户体验(通过表单和诸如此类登录)之外,我还想实现一个API.

Authlogic似乎支持默认情况下不会保留的单一访问令牌.我通过添加GET参数来提供它们,如下所示:

/users.xml?user_credentails=my_single_access_token
Run Code Online (Sandbox Code Playgroud)

问题:有没有办法让Authlogic通过HTTP Basic Auth接受API密钥?Highrise做了这样的事情,允许:

curl -u 605b32dd:X http://sample.highrisehq.com/people/1.xml
Run Code Online (Sandbox Code Playgroud)

Freshbooks相同:

curl -u insert_token_here:X https://sample.freshbooks.com/api/2.1/xml-in -d '[xml body here]'
Run Code Online (Sandbox Code Playgroud)

我将如何模仿这个功能?我甚至无法弄清楚输入数据(来自表单的postdata,HTTP基本,API令牌)的位置.我把它归结为UserSessions.find没有参数的调用,但是在那之后我忘记了它.

任何帮助将非常感激!

相关问题:如果使用HTTP basic,我还想禁用会话持久性(使其不存储cookie).任何有关这方面的帮助也将不胜感激!

ste*_*tef 5

如果您正在实现API,您可以考虑构建一个单独的Rack应用程序,然后将其安装在'/api/1.0/...'并共享您的模型.

这样,您就不会将自己的API与公共路径直接相关联,这可能很难为API用户构建​​.

一个好的方法是创建一个简单的Sinatra应用程序,它只公开你想要的方法,然后创建一个单独的身份验证策略:

require 'sinatra'    
require 'active_support' # all the Rails stuff
require 'lib/user' # your User class
require 'sinatra/respond_to' # gem install sinatra-respond_to

Sinatra::Application.register Sinatra::RespondTo

use Rack::Auth::Basic, "API", do |username, password|
  User.find_by_login(username).valid_password?(password)
end

get '/api/1.0/posts' do
  @posts = Post.recent # assuming you have a Post model...

  respond_to do |wants|
    wants.xml { @posts.to_xml }
    wants.to_json { @posts.to_json }
  end
end

get '/api/1.0/users/:id' do
  @user = User.find_by_login(params[:id])

  # Careful here - don't release personal details!
  respond_to do |wants|
    wants.xml { @user.to_xml }
    wants.to_json { @user.to_json }
  end
end
Run Code Online (Sandbox Code Playgroud)

在路径中使用"1.0"(或类似)对API进行版本控制意味着,如果您更改模型,则可以在不破坏用户现有代码的情况下创建新版API.

使用此方法,您应该能够允许用户使用以下格式使用HTTP Basic进行身份验证:

curl -u steven:password http://example.com/api/1.0/users/steven.xml
curl -u steven:password http://example.com/api/1.0/users/steven.json
curl -u steven:password http://example.com/api/1.0/posts.xml
Run Code Online (Sandbox Code Playgroud)

要使其运行,请将其另存为"api.rb",并将其作为机架中间件运行,或者创建一个"config.ru"文件,如下所示:

require 'api'
run Sinatra::Application
Run Code Online (Sandbox Code Playgroud)

然后从该目录:

rackup
Run Code Online (Sandbox Code Playgroud)