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

时间:2010-12-12 21:41:23

标签: ruby-on-rails api authlogic

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

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

/users.xml?user_credentails=my_single_access_token

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

curl -u 605b32dd:X http://sample.highrisehq.com/people/1.xml

Freshbooks相同:

curl -u insert_token_here:X https://sample.freshbooks.com/api/2.1/xml-in -d '[xml body here]'

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

非常感谢任何帮助!

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

3 个答案:

答案 0 :(得分: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

在路径中使用“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

要使其运行,请将其保存为“api.rb”,然后将其作为机架中间件运行,或者像这样创建“config.ru”文件:

require 'api'
run Sinatra::Application

然后从该目录:

rackup

答案 1 :(得分:0)

免责声明:我不是100%,这可能是您描述的方式,而不会破坏Authlogic的核心功能。

您将要遇到的第一个问题是authlogic阻止使用SSO令牌进行身份验证,除非请求是ATOM或RSS来覆盖它,您需要传递配置参数,请参阅此处:http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/Session/Params/Config

关于核心问题:我没有看到任何'简单'的方法来处理这个功能,但是你可以为curl之类的东西做的是将用户令牌作为参数传递(使用-G选项)就像你访问网址时一样。

cURL文档:http://curl.haxx.se/docs/manpage.html

答案 2 :(得分:0)

如果我误解了你的问题,请原谅我,但我认为答案是简单的“不”。你在这里混合了两个比喻。如果您需要安全的API密钥,请使用单一访问令牌;如果你想使用http基本访问身份验证,你需要一个不同的base64字形 - 而http基本身份验证不是特别安全(除非通过https使用,这通常不实用)。

更详细:

根据维基百科,http basic authentication旨在以简单,标准但相当不安全的base64编码字形提供用户名和密码。

要使用基本身份验证,我相信您希望通过简单的

生成字形
Base64.encode64("#{user.name}:#{password}")

...我可能会让用户输入密码,因为您无法从authlogic存储在数据库中的crypted_pa​​ssword中获取密码。

但结果是,这是与single_access_token非常不同的野兽,两者不能混合。