使用Rest Client Ruby Gem的身份验证标头

时间:2014-01-02 19:56:51

标签: ruby rest rest-client

我已经创建了一个基本的身份验证密钥,现在我只想尝试使用它。我尝试了一些不同的变体,但似乎没有一个在请求标题中显示授权。

$auth = 'Basic cmFtZXNoQHVzYW1hLmNvbTpyYW1lc2h1JEBtcA=='


@response = resource.post('Authorization' => $auth)
nor
@response = resource.post(:authorization => $auth)
nor
@response = resource.post(:Authorization => $auth)
nor
@response = resource.post(:content_type => :json, :accept => :json, :headers => { 'Authorization:' => $auth })

不幸的是,我没有在rdoc中找到很多可以帮我解决这个问题的信息。有没有人有使用Rest Client gem添加auth标头的经验?

4 个答案:

答案 0 :(得分:15)

对于Basic Auth,您应该能够在创建资源时以纯文本格式设置用户和密码:

resource = RestClient::Resource.new( 'http://example.com', 'user', 'password' )

但是如果你真的需要根据请求直接设置标题:

@response = resource.post( request_payload, :Authorization => $auth )

应该有效。如果没有,那么您可能错误地设置了$auth。但是,我认为您只是错过了添加请求有效负载,因此它使用了您为该必需参数提供的哈希,并且根本没有设置任何标头。

以下是使用get的完整且有效的示例(我没有Basic Auth和POST提供的测试服务)

require 'rest-client'
require 'base64'
$auth = 'Basic ' + Base64.encode64( 'user:passwd' ).chomp
$url = 'http://httpbin.org/basic-auth/user/passwd'

@resource = RestClient::Resource.new( $url )
@response = @resource.get( :Authorization => $auth )
# => "{\n  \"authenticated\": true,\n  \"user\": \"user\"\n}"

注意:虽然这有效,但我建议你使用第一种也是最简单的方法为构造函数提供用户和密码,除非你有充分的理由不这样做。

答案 1 :(得分:3)

如果您不想使用RestClient::Resource,可以在以下请求中加入基本身份验证:

RestClient::Request.execute method: :get, url: url, user: 'username', password: 'secret'

诀窍不是使用RestClient.get(或.post.put等)方法,因为您在其中传递的所有选项都用作标题。

我刚刚在这里写了一篇快速的文章:https://www.krautcomputing.com/blog/2015/06/21/how-to-use-basic-authentication-with-the-ruby-rest-client-gem/

答案 2 :(得分:1)

即使我没有发送有效负载,但我还是试图发送一个。这最终成了原因。所以我包括:

json_str = ''
@response = resource.post(json_str, :content_type => :json, :accept => :json, :Authorization => $auth)

这很有效。

答案 3 :(得分:0)

这对我很有用,以防有人想使用用户名/密码

RestClient.post("https://USERNAME:PASSWORD@yoursite.com/something", { some: "payload data" })