0

I am integrating Xero API into my ruby on rails application, however when trying to get a Token Set I am getting the below error:

*** XeroRuby::ApiError Exception: Error message: the server returns an error

HTTP status code: 400

Response headers: {"content-type"=>"application/json; charset=UTF-8", "server"=>"nginx", "xero-origin-id"=>"IdentityServer.Web", "xero-causation-id"=>"63c9c7b03d7f435aa5dd801d96e8c152", "xero-message-id"=>"9e6951801da040ac94f61ab3392e3feb", "xero-activity-id"=>"adbfa8002310478c9d223f71e47b5b17", "xero-correlation-id"=>"6069553f3b9843f992e54f59f7bde8c0", "content-length"=>"26", "expires"=>"Wed, 01 Feb 2023 12:40:41 GMT", "cache-control"=>"max-age=0, no-cache, no-store", "pragma"=>"no-cache", "date"=>"Wed, 01 Feb 2023 12:40:41 GMT", "connection"=>"close", "set-cookie"=>"Device=961bc311701f4e20a0a2a7c0b6900dad; expires=Tue, 01 Feb 2028 12:40:41 GMT; path=/; samesite=none; httponly, _abck=CF3C26F9436304BF37101493FFAD83AF~-1~YAAQscNQaDKxnNKFAQAAPFz+DAnlKYqiZGnjCEbMvoyet1jSR8zH92SopvoLwB4qij7m04HY3vz38HatmtYuYAgN43HShtEj4miB94A9kiGQvrTNgMw9fNcpXV5sZ7JVNARjYdFjRYo0hU/n+qpWeEFH5OgBb8gzYVcOP5KqhPLgOd2ctiJrhmWiEmaeNZVbKj/spi60wt24oTv4jeWSplHq+i1LIzvPWLsVSU8RGKddmx+w7QnmtuWgbogouQljdvXS2Hrp9jDQsQXbvC9cWLy7A4AINQy7DLKP53mRgbqhdl7rG4Zyy8Bkv8nuxJvboM1MmdmorDngUVMNKkxpfdrWfJB5dv1Dbs3BOxJS2s9lRN56ugyI~-1~-1~-1; Domain=.xero.com; Path=/; Expires=Thu, 01 Feb 2024 12:40:41 GMT; Max-Age=31536000; Secure, bm_sz=D5B91089FE0B5C15AAF78A78C3DC4631~YAAQscNQaDOxnNKFAQAAPFz+DBKO2MjN+su/jV34lpo0F8Da/HIe1gG6gWfP7mzR6F7LwAPpRmm2lbXSjxw8/92CaTTcdsebzypKwiiowvOYOOI5/2TdwwcrU2bLSe9jN9YgUIS5izdAcysuz8S4pjx5OnNVe1HvhmUOeX8P/njVXeF7sQbFwmoAz3HyAO2AbJK0FGybHT8Spbfujl91GJ8+8YUf8voUQObj8r7o3K3GbWCycMG0lp6yupNoF7qfkPEuIl2vzMNCF0m2ZLH9a+akzpzc14KqjSwuz3k+++NK~3551286~3225656; Domain=.xero.com; Path=/; Expires=Wed, 01 Feb 2023 16:40:41 GMT; Max-Age=14400"}

Response body: {"error":"invalid_client"}

Please see the command below which I used to try an receive the Token Set:

@token_set = @xero_client.get_token_set_from_callback(params[:code])

class HomeController < ApplicationController
  def index
    require 'xero-ruby'
    require 'httparty'
    creds = {
      client_id: '...',
      client_secret: '...',
      redirect_uri: 'http://localhost:3000/login',
      scopes: 'accounting.attachments',
      state: "Optional value to pass through auth flow"
    }
    config = { timeout: 30, debugging: true }
    @xero_client ||= XeroRuby::ApiClient.new(credentials: creds, config: config)
    @authorization_url = @xero_client.authorization_url
  end
end

Login controller:

class LoginController < ApplicationController
  def index
    require 'xero-ruby'
    creds = {
      client_id: '...',
      client_secret: '...',
      redirect_uri: 'http://localhost:3000/login',
      scopes: 'accounting.attachments',
      state: "Optional value to pass through auth flow"
    }
    config = { timeout: 30, debugging: true }
    @xero_client ||= XeroRuby::ApiClient.new(credentials: creds, config: config)
    byebug
    @token_set = @xero_client.get_token_set_from_callback(params[:code])
  end
end
engineersmnky
  • 25,495
  • 2
  • 36
  • 52
  • The error is `invalid_client`. Are you sure you’re setting the client ID and secret correctly? – Zoe Edwards Feb 01 '23 at 12:54
  • Hello, I have attached the controllers to with the settings for the client ID and secret – Jack Dawson Feb 01 '23 at 13:07
  • That scope setting seems to be very minimal. – droopsnoot Feb 01 '23 at 13:12
  • You do not need to `require 'xero-ruby'` all over the place. If this is in your Gemfile file it will automatically be required unless it says `require: false`. If this is set to `require: false` then you should require it at the top of the files that need it e.g. before the class declaration. the same applies for `httparty` – engineersmnky Feb 01 '23 at 20:39

1 Answers1

0

Please can you check your client secret as the error linked to the Xero correlation id is "Client secret validation failed for client"

It may be best to generate a new one from developer.xero.com and then replace this into your code.

We also have a sample app you can use if this makes it easier https://github.com/XeroAPI/Xero-ruby-oauth2-app

sallyhornet
  • 364
  • 2