Now that the Ruby application has an authorization code, it can exchange it for an access_token required to make a request to a vehicle.


1. Obtain an access token

In the previous section, we retrieved an authorization code. The Ruby application must exchange the code for an access_token to make a request.

The access_token represents your application’s access to a vehicle on behalf of the vehicle owner.

After receiving the access_token, the user can be redirected to the /vehicle route which we will implement in the next step.

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
# ./app.rb

# global variable to store the token
@@token = ''

get "/exchange" do
  code = params[:code]
  # TODO: Request Step 1: Obtain an access token
  # In a production app you'll want to store this in some kind of persistent storage
  @@token = @@client.exchange_code(code)[:access_token]
  redirect '/vehicle'
end

2. Get vehicle attributes

Once the application has the access_token, it can send requests to a vehicle using Smartcar’s API.

Once we have the vehicle_attributes object, we can build and return attributes hash which is displayed on the UI.

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
# ./app.rb

get "/vehicle" do
  code = params[:code]
  # TODO: Request Step 2a: Get vehicle ids
  vehicles =  Smartcar::Vehicle.get_vehicle(token: @@token)
  vehicle_ids = vehicles.vehicles
  # TODO: Request Step 2b: Create a vehicle
  vehicle = Smartcar::Vehicle.new(token: @@token, id: vehicle_ids.first)
  # TODO: Request Step 2c: Make a request to Smartcar API for the vehicle
  # Get the vehicle_attributes object for vehicle
  vehicle_attributes = vehicle.attributes
  # Build a hash of id, make, model and year and return as json
  vehicle_attributes.slice(*%I(id make model year).to_json
end

Try it out

Make sure the server is running -

  • $
bundle exec ruby app.rb

Now you can go to localhost:8000/login to see your Sinatra app running!


Next steps