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
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
# ./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]
  "OK"
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
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
# ./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