fadada-ruby-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: db9e024b25996f63dbe1339092d8576addf19abb55097dd64ae2b48b2373e576
4
+ data.tar.gz: 8f08dbe3966c43f09192c2fcb58c45dc465483f8c7f48c26fc7c95cf51c68108
5
+ SHA512:
6
+ metadata.gz: 514a86bf1ddc25445d70a3023177d03a144756c7b44f2e5768dc779aaf40c72ab2b0858c9657b04068542c0024176f6461405222bb819fbb062c835ef4d6d0af
7
+ data.tar.gz: 3274a9758f6d2b0f3f355985ab62ca19490480c7517910c4149c5051833cd3b846d1fbd225f2818f353ddd7028f285fd769ae1cc66af58f1eb43c065ece55735
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # fadada-ruby-sdk
2
+ Ruby SDK for FaDaDa's agreement and signature services
data/lib/client.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'net/http'
2
+
3
+ module FadadaRubySdk
4
+ # Client class to handle request and responses to and from Tonglian gateway
5
+ class Client
6
+ def initialize(api_end_point, app_id, app_secret)
7
+ @api_end_point = api_end_point
8
+ @signer = Signer.new(app_id, app_secret)
9
+ end
10
+
11
+ # the url is relative to the api_end_point
12
+ def request(url, access_token, params)
13
+ headers, params = @signer.sign(access_token, params)
14
+
15
+ url = URI.join(@app_end_point, url)
16
+ url = URI(url)
17
+ http = Net::HTTP.new(url.host, url.port)
18
+ http.use_ssl = true if @api_end_point.downcase.starts_with?('https') # Enable SSL for HTTPS
19
+
20
+ request = Net::HTTP::Post.new(url.request_uri)
21
+ request['Content-Type'] = 'application/x-www-form-urlencoded'
22
+ headers.each do |key, value|
23
+ request[key] = value
24
+ end
25
+
26
+ request.body = URI.encode_www_form(params)
27
+ response = http.request(request)
28
+
29
+ JSON.parse(response.body)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ require_relative 'client'
2
+ require_relative 'signer'
3
+
data/lib/signer.rb ADDED
@@ -0,0 +1,62 @@
1
+ require 'json'
2
+ require 'securerandom'
3
+ require 'digest'
4
+ require 'openssl'
5
+
6
+ module FadadaRubySdk
7
+ # To sign client request message and verify tonglian's response message
8
+ class Signer
9
+ HEADER_STUB = {
10
+ 'X-FASC-Api-SubVersion' => 5.1,
11
+ 'X-FASC-Sign-Type' => 'HMAC-SHA256'
12
+ }.freeze
13
+
14
+ def initialize(app_id, app_secret)
15
+ @app_id = app_id
16
+ @app_secret = app_secret
17
+ end
18
+
19
+ def sign(access_token = nil, data={})
20
+ headers, params = generate_headers_params(access_token, data)
21
+ sign_string = make_sign_string(headers.merge(params))
22
+
23
+ timestamp = headers['X-FASC-Timestamp']
24
+ signature = generate_signature(sign_string, timestamp, @app_secret)
25
+ headers['X-FASC-Sign'] = signature
26
+ return headers, params
27
+ end
28
+
29
+ private
30
+
31
+ def generate_headers_params(access_token, data)
32
+ headers = HEADER_STUB.dup
33
+ params = {}
34
+
35
+ headers['X-FASC-Request-Id'] = @app_id
36
+ headers['X-FASC-Timestamp'] = (Time.now.to_f * 1000).to_i.to_s
37
+ headers['X-FASC-Nonce'] = SecureRandom.uuid.gsub('-', '')
38
+ if access_token.nil? || access_token.empty?
39
+ headers['X-FASC-Grant-Type'] = 'client_credential'
40
+ else
41
+ headers['X-FASC-AccessToken'] = access_token
42
+ end
43
+
44
+ params['bizContent'] = (data.is_a? String)? data : data.to_json
45
+ return headers, params
46
+ end
47
+
48
+ def make_sign_string(params)
49
+ sorted_params = []
50
+ params.keys.sort.map do |k|
51
+ sorted_params.push("#{k}=#{params[k]}")
52
+ end
53
+ sorted_params.join('&')
54
+ end
55
+
56
+ def generate_signature(sorted_params_str, timestamp, secret)
57
+ sorted_str_digest = Digest::SHA256.hexdigest(sortd_params_str)
58
+ hmac = OpenSSL::HMAC.digest('sha256', secret, timestamp)
59
+ OpenSSL::HMAC.hexdigest('sha256', hmac, sorted_str_digest)
60
+ end
61
+ end
62
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fadada-ruby-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yi Zhang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-05-17 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: fadada-ruby-sdk is a light and easy to use gem. It could help developers
14
+ quickly make use of FaDaDa's agreement and signature services.
15
+ email: yzhang.wa@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - README.md
21
+ - lib/client.rb
22
+ - lib/fadada-ruby-sdk.rb
23
+ - lib/signer.rb
24
+ homepage: http://github.com/yzhanginwa/fadada-ruby-sdk
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 2.7.0
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubygems_version: 3.3.26
44
+ signing_key:
45
+ specification_version: 4
46
+ summary: A ruby SDK for developers to use FaDaDa agreement and signature services
47
+ test_files: []