HTTP Basic authentication is a simple authentication scheme in which user authentication is done by a username and password eliminating the needs of cookies, sessions and login pages. It is base64 encoded.
Rails provides a method for this type of authentication: authenticate_with_http_basic
This method can be used as follows:
authenticate_with_http_basic do |username, password| —— end
Inside the block you can access the username and password.
But how to send a request with basic auth in rails ?
This is really tricky and I didn’t find any documentation for this. Here I am describing how to send a request with basic auth.
1. Use Faraday library (Faraday is an HTTP client lib)
https://github.com/lostisland/faraday
Create a connection:
connection = Faraday.new(:url => HOST) do |faraday|
faraday.request :url_encoded # form-encode POST params
faraday.response :logger # log requests to STDOUT
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
faraday.basic_auth(USERNAME, PASSWORD)
end
parameters = params[‘user’].permit!.to_h
response = connection.get do |req|
req.url(params[:url])
req.headers['Content-Type'] = 'application/json'
req.params.merge!(parameters)
end
response = connection.post do |req|
req.url(params[:url])
req.headers['Content-Type'] = 'application/json'
req.body = parameters
end
render json: response.body
Here,
HOST = 'http://lvh.me:3002' USERNAME = 'EdcddzrbmET55016' PASSWORD = 'UXBJnS309S49st3rHqmH5934' params['url'] = '/users/profile'
We can use Faraday’s (‘faraday.basic_auth’) basic auth method to reach out our solution.
If you are getting any error like follows in post request
NoMethodError (undefined method `bytesize' for {}:ActiveSupport::HashWithIndifferentAccess):
Don’t forget to convert the ruby hash ‘parameters’ to json by calling ‘to_json’ upon it.
req.body = parameters.to_json
In Other way you can use something like this to generate the basic auth header
request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(USERNAME, PASSWORD)
How to use Ruby Rest Client:
require 'rest_client'
headers = {
:authorization => 'Basic FytxhZGKpbjpvcGVuIHNlc2FtHUHU'
}
response = RestClient.get 'https://yourdomain.com/api/users.json?activityId=02ddf868-6484-440f-8c39-c7d4fb4e7b33', headers
puts response