Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 防止Authlogic为非HTML请求建立会话/cookie_Ruby On Rails_Api_Authlogic - Fatal编程技术网

Ruby on rails 防止Authlogic为非HTML请求建立会话/cookie

Ruby on rails 防止Authlogic为非HTML请求建立会话/cookie,ruby-on-rails,api,authlogic,Ruby On Rails,Api,Authlogic,我使用的是Authlogic和Rails 3。除了常规的基于浏览器的用户体验(通过表单和其他方式登录)之外,我还想实现一个API Authlogic似乎支持默认情况下不持久的单访问令牌。我通过添加GET参数来提供它们,如下所示: /users.xml?user_credentails=my_single_access_token 问题:有没有办法让Authlogic通过HTTP Basic Auth接受API密钥?这样做,考虑到: curl -u 605b32dd:X http://sampl

我使用的是Authlogic和Rails 3。除了常规的基于浏览器的用户体验(通过表单和其他方式登录)之外,我还想实现一个API

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

/users.xml?user_credentails=my_single_access_token
问题:有没有办法让Authlogic通过HTTP Basic Auth接受API密钥?这样做,考虑到:

curl -u 605b32dd:X http://sample.highrisehq.com/people/1.xml
同样适用于:

我将如何去模仿这个功能?我甚至不知道输入数据(来自表单的postdata、httpbasic、API令牌)是从哪里获取的。我把它归结为一个调用
UserSessions.find
,不带任何参数,但在那里之后我就找不到了

任何帮助都将不胜感激


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

免责声明:我不是一个100%的人,在不破坏Authlogic核心功能的情况下,以您描述的方式,这是可能的

您将遇到的第一个问题是authlogic禁止使用SSO令牌进行身份验证,除非请求是ATOM或RSS。要覆盖此问题,您需要传递一个配置参数。请参见此处:

关于核心问题:我看不到任何“简单”的方法来处理此功能,但是对于curl这样的东西,您可以做的是将用户令牌作为参数传递(使用
-G
选项),就像访问url时一样


CURL文档:

< P>如果你正在执行一个API,你可以考虑建立一个单独的机架应用程序,然后安装在“/API/1/…”,并共享你的模型。p> 这样,您就不会将自己束缚在与公共路由直接相关的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

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

更详细地说:

根据wikipedia,它旨在以简单、标准但相当不安全的base64编码符号提供用户名和密码

要使用basic auth,那么我相信您希望通过一个简单的

Base64.encode64("#{user.name}:#{password}")
…我可能会让用户键入他们的密码,因为您无法从authlogic存储在数据库中的加密密码中派生密码


但结果是,这与单访问令牌截然不同,两者不能混用。

在站点范围内允许单访问令牌/API密钥似乎很容易,就像让控制器的
允许单访问?
方法返回true一样。感谢stef,在Rails环境中编写了出色的API设置,虽然这对我手头的问题没什么帮助:当HTTP Basic auth字符串中提供了单一访问令牌/API时,如何验证用户。哦,我明白了-您想使用令牌而不是密码。。。更新以反映这一点。谢谢您,stef,您提供了详细的答案,并就另一种设置API的方法发表了意见。为此,我投你一票。但我的问题(明确地说,如何强制Authlogic执行这个特定的功能)仍然没有解决。我将自己继续调查。在我看来,使单个访问令牌被接受为HTTP基本用户名(使用伪密码)的安全性不亚于默认的Authlogic实践,即接受单个访问令牌作为查询字符串。仅供参考,SSL正用于所有经过身份验证的请求,但这一细节超出了我的问题范围。为了澄清我的问题,我不希望将用户名/密码验证与API密钥“结合”;我只是想告诉Authlogic在通过HTTP Basic提供API密钥时接受它,而不是作为查询字符串属性。我的意思是,如果使用实际的用户名和密码,我认为它将立即生效。关于安全的公平点。我也不会使用原始的单访问令牌。我对单访问密钥感到不安;AuthLogic不允许更好的安全性,这听起来不太对。所以我做了更多的研究。这篇文章在这方面让我放心,看起来它可以为你提供解决问题所需的信息。
Base64.encode64("#{user.name}:#{password}")