Open archana-codezen opened 1 month ago
I am using the following code : require 'oauth' require 'net/http' require 'uri' require 'json' require 'securerandom' require 'openssl'
class SchemeDataImporter attr_reader :script_id, :deploy_id, :realm, :consumer, :token
def initialize(script_id, deploy_id, realm, consumer_key, consumer_secret, token, token_secret) @script_id = script_id @deploy_id = deploy_id @realm = realm @token_secret = token_secret @callback_url = "https://#{realm}.xyz.netsuite.com/app/site/hosting/xyz.nz?script=#{script_id}&deploy=#{deploy_id}" @consumer = OAuth::Consumer.new(consumer_key, consumer_secret, { site: "https://#{realm}.xyz.netsuite.com", signature_method: 'HMAC-SHA256', oauth_version: '1.0' })
@token = OAuth::AccessToken.new(@consumer)
end
def import_data url = "/app/site/hosting/xyz.nz?script=#{script_id}&deploy=#{deploy_id}"
# Generate OAuth header auth_header = generate_auth_header(url) response = @token.request(:get, "/app/site/hosting/xyz.nz?script=#{OAuth::Helper.escape(script_id)}&deploy=#{OAuth::Helper.escape(deploy_id)}") # response = @token.get(url, { # 'Authorization' => auth_header, # 'Content-Type' => 'application/json', # 'Accept' => 'application/json' # }) puts "-------------------------------------" puts "-------------------------------------" puts auth_header puts realm puts script_id puts deploy_id puts "-------------------------------------" puts "-------------------------------------" puts "Response Code: #{response.code}" puts "Response Message: #{response.message}" puts "Response Body: #{response.body}" if response.code.to_i == 200 # Handle successful response puts "Import process complete" else raise "Failed to fetch data: #{response.code} #{response.message} - #{response.body}" end
private
def generate_auth_header(url) oauth_params = { oauth_consumer_key: @consumer.key, oauth_token: @token.token, oauth_signature_method: @consumer.options[:signature_method], oauth_timestamp: (Time.now.to_i + 120).to_s, oauth_nonce: generate_nonce, oauth_version: '1.0', realm: @realm }
base_string = generate_base_string(url, oauth_params) puts "Base String: #{base_string}" # Log base string for debugging oauth_signature = generate_signature(base_string) puts "OAuth Signature: #{oauth_signature}" # Log the generated signature oauth_params[:oauth_signature] = oauth_signature auth_header = "OAuth " + oauth_params.map { |key, value| "#{key}=\"#{URI.encode(value.to_s)}\"" }.join(", ") puts "Authorization Header: #{auth_header}" # Log the final auth header auth_header
def generate_nonce
rand(10**11).to_s.rjust(11, '0')
def generate_base_string(url, oauth_params) sorted_params = oauth_params.sort.to_h param_string = sorted_params.map { |k, v| "#{k}=#{URI.encode(v.to_s)}" }.join("&")
http_method = "GET" base_string = "#{http_method}&#{URI.encode(url)}&#{URI.encode(param_string)}" base_string
def generate_base_string(url, oauth_params) sorted_params = oauth_params.sort.map { |k, v| "#{k}=#{URI.encode(v.to_s)}" }.join("&") http_method = "GET" base_string = "#{http_method}&#{URI.encode(url)}&#{URI.encode(sorted_params)}" base_string end
def generate_signature(base_string) key = "#{@consumer.secret}&#{@token.secret}" hmac = OpenSSL::HMAC.digest('sha256', key, base_string) Base64.strict_encode64(hmac) end
importer = SchemeDataImporter.new( "8xx", "x", "7xxxxxxx", "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "2xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "5xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" )
begin importer.import_data rescue => e puts e.message end
i am using the same creds in postman and its working there.
There is a lot of information missing. What version of the gem are you using?
I am using the following code : require 'oauth' require 'net/http' require 'uri' require 'json' require 'securerandom' require 'openssl'
class SchemeDataImporter attr_reader :script_id, :deploy_id, :realm, :consumer, :token
def initialize(script_id, deploy_id, realm, consumer_key, consumer_secret, token, token_secret) @script_id = script_id @deploy_id = deploy_id @realm = realm @token_secret = token_secret @callback_url = "https://#{realm}.xyz.netsuite.com/app/site/hosting/xyz.nz?script=#{script_id}&deploy=#{deploy_id}" @consumer = OAuth::Consumer.new(consumer_key, consumer_secret, { site: "https://#{realm}.xyz.netsuite.com", signature_method: 'HMAC-SHA256', oauth_version: '1.0' })
end
def import_data url = "/app/site/hosting/xyz.nz?script=#{script_id}&deploy=#{deploy_id}"
end
private
def generate_auth_header(url) oauth_params = { oauth_consumer_key: @consumer.key, oauth_token: @token.token, oauth_signature_method: @consumer.options[:signature_method], oauth_timestamp: (Time.now.to_i + 120).to_s, oauth_nonce: generate_nonce, oauth_version: '1.0', realm: @realm }
end
def generate_nonce
Generate a random number between 0 and 99999999999 (11 digits)
end
def generate_base_string(url, oauth_params) sorted_params = oauth_params.sort.to_h param_string = sorted_params.map { |k, v| "#{k}=#{URI.encode(v.to_s)}" }.join("&")
end
def generate_base_string(url, oauth_params) sorted_params = oauth_params.sort.map { |k, v| "#{k}=#{URI.encode(v.to_s)}" }.join("&") http_method = "GET" base_string = "#{http_method}&#{URI.encode(url)}&#{URI.encode(sorted_params)}" base_string end
def generate_signature(base_string) key = "#{@consumer.secret}&#{@token.secret}" hmac = OpenSSL::HMAC.digest('sha256', key, base_string) Base64.strict_encode64(hmac) end
Example usage
importer = SchemeDataImporter.new( "8xx", "x", "7xxxxxxx", "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "2xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "5xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" )
begin importer.import_data rescue => e puts e.message end
i am using ruby '2.4.6' & rails '5.2.3'