Pregunta

I have already created a basic authentication key, now I am just trying to utilize it. I have tried a few different variations, but none seem to show Authorization in the request headers.

$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 })

Unfortunately I am not finding a lot of info in the rdoc that can help me solve this. Does anyone have experience adding auth headers using the Rest Client gem?

¿Fue útil?

Solución

For Basic Auth, you should be able to set the user and password in plaintext when you create the resource:

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

But if you really need to set the header directly per request:

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

should work. If it does not, then you may have set $auth incorrectly. However, I think you just missed adding the request payload, so it was using the hash you supplied for that required param, and not setting any headers at all.

Here's a complete and working example using get (I don't have a test service available with Basic Auth and 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}"

Note: Though this works, I recommend you use the first and simplest method of supplying user and password to the constructor unless you have good reason not to.

Otros consejos

Even though I didn't have a payload to send I was trying to send one without. This ended up being the cause. So I included:

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

And this worked.

If you don't want to use RestClient::Resource, you can include basic auth in a request like this:

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

The trick is not to use the RestClient.get (or .post, .put etc.) methods since all options you pass in there are used as headers.

This worked great for me, in case anyone wants to use username/password

RestClient.post("https://USERNAME:PASSWORD@yoursite.com/something", { some: "payload data" })
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top