我正在使用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)。任何有关这方面的帮助都将不胜感激!
答案 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
选项)就像你访问网址时一样。
答案 2 :(得分:0)
如果我误解了你的问题,请原谅我,但我认为答案是简单的“不”。你在这里混合了两个比喻。如果您需要安全的API密钥,请使用单一访问令牌;如果你想使用http基本访问身份验证,你需要一个不同的base64字形 - 而http基本身份验证不是特别安全(除非通过https使用,这通常不实用)。
更详细:
根据维基百科,http basic authentication旨在以简单,标准但相当不安全的base64编码字形提供用户名和密码。
要使用基本身份验证,我相信您希望通过简单的
生成字形Base64.encode64("#{user.name}:#{password}")
...我可能会让用户输入密码,因为您无法从authlogic存储在数据库中的crypted_password中获取密码。
但结果是,这是与single_access_token非常不同的野兽,两者不能混合。