trusona 2.3.0 → 2.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 60739d2fd6bfd4db4b0e43b06aa314a857e46660
4
- data.tar.gz: 49b452b94a0dcff871d2c6d8d3e8a18feb48177e
3
+ metadata.gz: 8493dc6973da717a55a1dd6d7bc9e27cbfbbeb79
4
+ data.tar.gz: f5499e8a6a766f4357268506e6a4c414b7c9b04f
5
5
  SHA512:
6
- metadata.gz: 5fa55cbf9abe02741f48f82516371c1406e494189f6365521ab3aa0b4e99274e5e0907983cdfe0efdd908d7f9ca15261c39bb56a8091b35c9791814a8406b7ed
7
- data.tar.gz: 4d0eb3dc425a90ca2eb367bc3bcabc6651749ca2fe01115efa853afb6f63b9681c12618f1d28922f696cf44072db429d03424dc00f1161b5c7b735dc95d8a64d
6
+ metadata.gz: 9762a0980e163dc0bddf95b4a77ca3670eb8a9e4b7b6d9a73223e34c85740e967394bc5754fdf7988381a4d5b3c9ed762128c495502337a6363a1ff5782c4f97
7
+ data.tar.gz: 4bbfca2beab08cb3dcdb4cfbea42cce6c9d33fda916b7baf03750baf9434f61cd3f6bb424b56a928a03ffe2978ff96b9bf4b03375c7d067b091a08cb3d9fa53b
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -171,8 +171,9 @@ Note that the custom fields are not used in the case that the Trusonafication is
171
171
  | Prompt | `prompt` | N | Should the user be prompted to Accept or Reject this Trusonafication? Defaults to `true`. |
172
172
  | Expiration | `expires_at` | N | The ISO-8601 UTC timestamp of the Trusonafication's expiration. Defaults to 90 seconds from creation. |
173
173
  | Custom Fields | `custom_fields` | N | Arbitrary key-value data fields made available to the Trusonafication. Amount of data in the hash is limited to 1MB |
174
+ | Callback URL | `callback_url` | N | An HTTPS URL to call when the trusonafication has been completed (accepted, rejected, or expired).<br>The request will be a POST and the body will be the same JSON format as sending a GET request to /api/v2/trusonafications/{id}.<br><br> **NOTE:** The URL should include a randomized segment so it cannot be guessed and abused by third-parties (i.e https://your.domain.com/completed_authentications/f8abe61d-4e51-493f-97b1-464c157624f2). |
174
175
 
175
- [^1]: You must provide at least one field that would allow Trusona to determine which user to authenticate. The identifier fields are `device_identifier`, `user_identifier`, and `trucode_id`.
176
+ [^1]: You must provide at least one field that would allow Trusona to determine which user to authenticate. The identifier fields are `device_identifier`, `user_identifier`, `email`, and `trucode_id`.
176
177
 
177
178
  #### Retrieving an existing Trusonafication
178
179
 
@@ -255,7 +256,7 @@ end
255
256
 
256
257
  ### TruCodes
257
258
 
258
- After a user has scanned a TruCode, it's possible to acquire that user's information by getting the
259
+ After a user has scanned a TruCode, it's possible to acquire that user's information by getting the
259
260
  scanned TruCode from the server. The code sample below shows how to do that:
260
261
 
261
262
  ```ruby
@@ -0,0 +1,15 @@
1
+ require 'httparty'
2
+
3
+ class Buster
4
+ def initialize
5
+ @url = 'https://buster.staging.trusona.net'
6
+ end
7
+
8
+ def callback_url(id)
9
+ "#{@url}/callbacks/#{id}"
10
+ end
11
+
12
+ def callback_result(id)
13
+ HTTParty.get(callback_url(id))
14
+ end
15
+ end
@@ -7,9 +7,12 @@ SimpleCov.start do
7
7
  end
8
8
 
9
9
  require 'bundler/setup'
10
+ require 'active_support/core_ext/numeric/time'
11
+ require 'rspec/wait'
10
12
  require 'trusona'
11
13
  require 'securerandom'
12
14
  require 'webmock/rspec'
15
+ require_relative 'buster'
13
16
 
14
17
  WebMock.allow_net_connect!
15
18
 
@@ -12,6 +12,8 @@ RSpec.describe 'Trusonafications' do
12
12
  }
13
13
 
14
14
  @timeout = 5
15
+
16
+ @buster = Buster.new
15
17
  end
16
18
  describe 'creating a trusonafication for a known trusona user' do
17
19
  before do
@@ -40,10 +42,8 @@ RSpec.describe 'Trusonafications' do
40
42
  end
41
43
  end
42
44
  end
43
- describe 'creating a trusonafication for an unknown trusona user' do
45
+ describe 'creating a trusonafication without a level' do
44
46
  it 'as expected, does not work' do
45
- @parameters[:email] = "#{Time.now.to_i}@example.com"
46
-
47
47
  expect {
48
48
  Trusona::Trusonafication.create(
49
49
  params: @parameters, timeout: @timeout
@@ -51,5 +51,20 @@ RSpec.describe 'Trusonafications' do
51
51
  }.to raise_error(Trusona::InvalidResourceError)
52
52
  end
53
53
  end
54
+ describe 'creating a trusonafication with a callback url' do
55
+ it 'should POST to the URL when the trusonafication is completed' do
56
+ callback_id = SecureRandom.uuid
57
+
58
+ @parameters[:callback_url] = @buster.callback_url(callback_id)
59
+ @parameters[:expires_at] = 1.second.from_now
60
+
61
+ Trusona::EssentialTrusonafication.create(params: @parameters, timeout: @timeout)
62
+
63
+ wait_for do
64
+ callback_result = @buster.callback_result(callback_id)
65
+ callback_result.code
66
+ end.to eq(200)
67
+ end
68
+ end
54
69
  end
55
70
  # rubocop:enable Metrics/BlockLength
@@ -11,7 +11,7 @@ module Trusona
11
11
  attr_accessor :device_identifier, :user_identifier, :trucode_id,
12
12
  :resource, :action, :level, :id, :email,
13
13
  :accepted_level, :trusona_id, :expires_at,
14
- :user_presence, :prompt, :custom_fields
14
+ :user_presence, :prompt, :custom_fields, :callback_url
15
15
 
16
16
  # rubocop:disable Metrics/AbcSize
17
17
  # rubocop:disable Metrics/MethodLength
@@ -32,6 +32,7 @@ module Trusona
32
32
  self.prompt = defaulting_to(true, @params[:prompt])
33
33
  self.user_presence = defaulting_to(true, @params[:user_presence])
34
34
  self.custom_fields = @params[:custom_fields]
35
+ self.callback_url = @params[:callback_url]
35
36
 
36
37
  @status = @params[:status]
37
38
  end
@@ -44,20 +45,23 @@ module Trusona
44
45
 
45
46
  # rubocop:disable Metrics/MethodLength
46
47
  def to_json
47
- JSON(device_identifier: device_identifier,
48
- user_identifier: user_identifier,
49
- trucode_id: trucode_id,
50
- trusona_id: trusona_id,
51
- email: email,
52
- resource: resource,
53
- action: action,
54
- desired_level: level,
55
- id: id,
56
- status: @status,
57
- prompt: prompt,
58
- user_presence: user_presence,
59
- custom_fields: custom_fields,
60
- expires_at: expires_at&.iso8601)
48
+ JSON(
49
+ device_identifier: device_identifier,
50
+ user_identifier: user_identifier,
51
+ trucode_id: trucode_id,
52
+ trusona_id: trusona_id,
53
+ email: email,
54
+ resource: resource,
55
+ action: action,
56
+ desired_level: level,
57
+ id: id,
58
+ status: @status,
59
+ prompt: prompt,
60
+ user_presence: user_presence,
61
+ custom_fields: custom_fields,
62
+ expires_at: expires_at&.iso8601,
63
+ callback_url: callback_url
64
+ )
61
65
  end
62
66
  # rubocop:enable Metrics/MethodLength
63
67
 
@@ -55,12 +55,20 @@ module Trusona
55
55
  # Accept or Reject this Trusonafication?
56
56
  # @option params [String] :expires_at ('90 seconds') The ISO-8601 UTC
57
57
  # timestamp of the Trusonafication's expiration.
58
- # @param timeout [Int] (30) The max amount of time, in seconds, to wait
59
- # for a response from the Trusona API when polling for a Trusonafication
60
- # result
61
58
  # @option params [Hash] :custom_fields Optional data to be associated with
62
59
  # this Trusonafication and can be used to constomize any UX elements. Total
63
60
  # size of data is limited to 1MB.
61
+ # @option params [String] :callback_url An HTTPS URL to call when the
62
+ # trusonafication has been completed (accepted, rejected, or expired). The
63
+ # request will be a POST and the body will be the same JSON format as
64
+ # sending a GET request to /api/v2/trusonafications/{id}.
65
+ #
66
+ # NOTE: The URL should include a randomized segment so it cannot be guessed
67
+ # and abused by third-parties (i.e
68
+ # https://your.domain.com/completed_authentications/f8abe61d-4e51-493f-97b1-464c157624f2).
69
+ # @param timeout [Int] (30) The max amount of time, in seconds, to wait
70
+ # for a response from the Trusona API when polling for a Trusonafication
71
+ # result
64
72
  # @yield [Trusona::Resources::Trusonafication] Yields the completed
65
73
  # Trusonafication to the block
66
74
  # @raise [Trusona::InvalidResourceError] if the resource is not +valid?+
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Trusona
4
- VERSION = '2.3.0'
4
+ VERSION = '2.4.0'
5
5
  end
data/trusona.gemspec CHANGED
@@ -28,8 +28,8 @@ Gem::Specification.new do |spec|
28
28
 
29
29
  spec.metadata['yard.run'] = 'yri' # use "yard" to build full HTML docs.
30
30
 
31
+ spec.add_development_dependency 'activesupport', '~> 5.2'
31
32
  spec.add_development_dependency 'bump', '~> 0.5'
32
- spec.add_development_dependency 'bundler'
33
33
  spec.add_development_dependency 'dotenv', '~> 2.2'
34
34
  spec.add_development_dependency 'guard', '~> 2.14'
35
35
  spec.add_development_dependency 'guard-rspec', '~> 4.7'
@@ -37,8 +37,9 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency 'guard-yard', '~> 2.2'
38
38
  spec.add_development_dependency 'rake', '~> 10.0'
39
39
  spec.add_development_dependency 'rspec', '~> 3.0'
40
+ spec.add_development_dependency 'rspec-wait', '~> 0.0'
40
41
  spec.add_development_dependency 'rubocop', '~> 0.49'
41
42
  spec.add_development_dependency 'simplecov', '~> 0.14'
42
43
  spec.add_development_dependency 'yard', '~> 0.9'
43
- spec.add_development_dependency 'webmock'
44
+ spec.add_development_dependency 'webmock', '~> 3.5'
44
45
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trusona
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Trusona
@@ -60,33 +60,33 @@ dependencies:
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0.15'
62
62
  - !ruby/object:Gem::Dependency
63
- name: bump
63
+ name: activesupport
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.5'
68
+ version: '5.2'
69
69
  type: :development
70
70
  prerelease: false
71
71
  version_requirements: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.5'
75
+ version: '5.2'
76
76
  - !ruby/object:Gem::Dependency
77
- name: bundler
77
+ name: bump
78
78
  requirement: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '0.5'
83
83
  type: :development
84
84
  prerelease: false
85
85
  version_requirements: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '0.5'
90
90
  - !ruby/object:Gem::Dependency
91
91
  name: dotenv
92
92
  requirement: !ruby/object:Gem::Requirement
@@ -185,6 +185,20 @@ dependencies:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
187
  version: '3.0'
188
+ - !ruby/object:Gem::Dependency
189
+ name: rspec-wait
190
+ requirement: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '0.0'
195
+ type: :development
196
+ prerelease: false
197
+ version_requirements: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.0'
188
202
  - !ruby/object:Gem::Dependency
189
203
  name: rubocop
190
204
  requirement: !ruby/object:Gem::Requirement
@@ -231,16 +245,16 @@ dependencies:
231
245
  name: webmock
232
246
  requirement: !ruby/object:Gem::Requirement
233
247
  requirements:
234
- - - ">="
248
+ - - "~>"
235
249
  - !ruby/object:Gem::Version
236
- version: '0'
250
+ version: '3.5'
237
251
  type: :development
238
252
  prerelease: false
239
253
  version_requirements: !ruby/object:Gem::Requirement
240
254
  requirements:
241
- - - ">="
255
+ - - "~>"
242
256
  - !ruby/object:Gem::Version
243
- version: '0'
257
+ version: '3.5'
244
258
  description: Easily interact with the Trusona REST API
245
259
  email:
246
260
  - engineering@trusona.com
@@ -263,6 +277,7 @@ files:
263
277
  - bin/setup
264
278
  - certs/trusona.pem
265
279
  - checksum/trusona-0.16.0.gem.sha512
280
+ - integrations/buster.rb
266
281
  - integrations/device_user_binding_integration_spec.rb
267
282
  - integrations/identity_documents_spec.rb
268
283
  - integrations/paired_tru_code_spec.rb
metadata.gz.sig CHANGED
Binary file