Skip to content

Customizing Token Response

Ata Günay edited this page Aug 12, 2024 · 8 revisions

In some cases you may need to extend OAuth2 token response with some additional data. In order to do that for the Doorkeeper gem you need to override body method of the Doorkeeper::OAuth::TokenResponse class. Define it in a separate module, lib/custom_token_response.rb for example:

module CustomTokenResponse
  def body
    additional_data = {
      # use any global storage like RequestStore / Rails Current / etc
      'username' => env[:clearance].current_user.username,
      'userid' => @token.resource_owner_id # you have an access to the @token object
      # any other data
    }

    # call original `#body` method and merge its result with the additional data hash
    super.merge(additional_data)
  end
end

Don't forget to add lib/ directory to the autoload paths if you are using Rails >= 4.

# Please, add to the `ignore` list any other `lib` subdirectories that do
# not contain `.rb` files, or that should not be reloaded or eager loaded.
# Common ones are `templates`, `generators`, or `middleware`, for example.
config.autoload_lib(ignore: %w(templates tasks))

Then include that module in a Doorkeeper TokenResponse class by adding the following line to the end of the config/initializers/doorkeeper.rb file:

Doorkeeper.configure do
  # ...
end

require 'custom_token_response'
Rails.application.config.to_prepare do
  Doorkeeper::OAuth::TokenResponse.send :prepend, CustomTokenResponse
end

And that is all you need! You can try to check it from the rails console now:

2.3.1 :001 > Doorkeeper::OAuth::TokenResponse.new(Doorkeeper::AccessToken.last).body
  Doorkeeper::AccessToken Load (1.1ms)  SELECT  "oauth_access_tokens".* FROM "oauth_access_tokens"  ORDER BY "oauth_access_tokens"."id" DESC LIMIT 1

 => {
      "access_token"=>"23b0d7899b9bd8e0ac04b4e28d2cea236765ed6fed4e059143ace6098b07baf7",
      "token_type"=>"bearer",
      "created_at"=>1478174449,
      "username"=>"John Doe"
    }
Clone this wiki locally