How do I do basic authentication with RestClient?
Asked Answered
R

5

37

Does anyone know how to do basic authentication with RestClient?

I need to create a private repository on GitHub through their RESTful API.

Radiography answered 11/9, 2010 at 20:37 Comment(0)
T
18

From the source it looks like you can just specify user and password as part of your request object.

Have you tried something like:

r = Request.new({:user => "username", :password => "password"})

Also if you look down in the Shell section of the ReadMe it has an example of specifying it as part of restshell.

$ restclient https://example.com user pass
>> delete '/private/resource'
Transship answered 11/9, 2010 at 22:6 Comment(1)
Consider including the module in usage to improve this. e.g. RestClient::Request and adding more context to make the example you gave fully functionalEichman
S
45

The easiest way is to embed the details in the URL:

RestClient.get "http://username:[email protected]"
Salmi answered 19/11, 2010 at 8:32 Comment(4)
I was searching how to perform authentication without having to initialize a RestClient::Request. +1 for the usage of RestClient.get method. BUT doesn't username and password require escape? Looks as if it's not as easy as it seemd.Fiducial
What if my username has an '@' character?Advised
...but if you've special characters like # in your password you've get excetion: InvalidURIError: bad URI(is not URI?)Gammon
basic auth should go in the headers unless you absolutely have no other choiceYarn
F
36

Here is an example of working code where I support optional basicauth but don't require the user and password be embedded in the URL:

def get_collection(path)
  response = RestClient::Request.new(
    :method => :get,
    :url => "#{@my_url}/#{path}",
    :user => @my_user,
    :password => @my_pass,
    :headers => { :accept => :json, :content_type => :json }
  ).execute
  results = JSON.parse(response.to_str)
end

Do note if @my_user and @mypass are not instantiated, it works fine without basicauth.

Forcier answered 8/10, 2011 at 18:50 Comment(0)
T
18

From the source it looks like you can just specify user and password as part of your request object.

Have you tried something like:

r = Request.new({:user => "username", :password => "password"})

Also if you look down in the Shell section of the ReadMe it has an example of specifying it as part of restshell.

$ restclient https://example.com user pass
>> delete '/private/resource'
Transship answered 11/9, 2010 at 22:6 Comment(1)
Consider including the module in usage to improve this. e.g. RestClient::Request and adding more context to make the example you gave fully functionalEichman
A
8

This works and follows RFC 7617 for Http Basic Authentication:


RestClient::Request.execute(
  method: :post,
  url: "https://example.com",
  headers: { "Authorization" => "Basic " + Base64::encode64(auth_details) },
  payload: { "foo" => "bar"}
)


def auth_details
  ENV.fetch("HTTP_AUTH_USERNAME") + ":" + ENV.fetch("HTTP_AUTH_PASSWORD")
end

Ademption answered 2/12, 2019 at 21:32 Comment(0)
A
2

Thanks to Kelsey Hannan:

RestClient.get("https://example.com", 
  {
    Authorization: "Basic #{Base64::encode64('guest:guest')}"
  }
)

RestClient.post("https://example.com", 
  {  }.to_json,
  {
    Authorization: "Basic #{Base64::encode64('guest:guest')}"
  }
)
Alto answered 11/12, 2020 at 11:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.