class Restforce::Middleware::Authentication
the oauth access token (if a refresh token is present).
will attempt to either reauthenticate (username and password) or refresh
When a request fails (a status of 401 is returned), the middleware
Faraday middleware that allows for on the fly authentication of requests.
def authenticate!
def authenticate! response = connection.post '/services/oauth2/token' do |req| req.body = encode_www_form(params) end if response.status >= 500 raise Restforce::ServerError, error_message(response) elsif response.status != 200 raise Restforce::AuthenticationError, error_message(response) end @options[:instance_url] = response.body['instance_url'] @options[:oauth_token] = response.body['access_token'] @options[:authentication_callback]&.call(response.body) response.body end
def call(env)
Rescue from 401's, authenticate then raise the error again so the client
def call(env) @app.call(env) rescue Restforce::UnauthorizedError authenticate! raise end
def connection
def connection @connection ||= Faraday.new(faraday_options) do |builder| builder.use Faraday::Request::UrlEncoded builder.use Restforce::Middleware::Mashify, nil, @options builder.response :json if Restforce.log? builder.use Restforce::Middleware::Logger, Restforce.configuration.logger, @options end builder.adapter @options[:adapter] end end
def encode_www_form(params)
Featured detect form encoding.
def encode_www_form(params) if URI.respond_to?(:encode_www_form) URI.encode_www_form(params) else params.map do |k, v| k = CGI.escape(k.to_s) v = CGI.escape(v.to_s) "#{k}=#{v}" end.join('&') end end
def error_message(response)
def error_message(response) return response.status.to_s unless response.body "#{response.body['error']}: #{response.body['error_description']} " \ "(#{response.status})" end
def faraday_options
def faraday_options { url: "https://#{@options[:host]}", proxy: @options[:proxy_uri], ssl: @options[:ssl] } end
def params
def params raise NotImplementedError end