Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

getting 401 while authenticating. #307

Open
archana-codezen opened this issue Oct 24, 2024 · 2 comments
Open

getting 401 while authenticating. #307

archana-codezen opened this issue Oct 24, 2024 · 2 comments

Comments

@archana-codezen
Copy link

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

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

end

def generate_nonce
# Generate a random number between 0 and 99999999999 (11 digits)
rand(10**11).to_s.rjust(11, '0')
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("&")

http_method = "GET"
base_string = "#{http_method}&#{URI.encode(url)}&#{URI.encode(param_string)}"

base_string

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'

@archana-codezen
Copy link
Author

i am using the same creds in postman and its working there.

@pboling
Copy link
Member

pboling commented Nov 8, 2024

There is a lot of information missing. What version of the gem are you using?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants