webauthn 3.3.0 → 3.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
  SHA256:
3
- metadata.gz: 758cb181dfb381a05748cee3143da113a66e40433b329ff5711e0ef973c799ec
4
- data.tar.gz: 06df9d255ea57db6b9874c1406ab5f5606108a18abe4c992b799b7b5db8191be
3
+ metadata.gz: 325d58807c73a2887233d3b68091bea56edcb9be7fb21f57067d1f974006d876
4
+ data.tar.gz: 24a7b26717f6ab10286f14410db64909a21a4e43cea30b1b168f32caa80412c6
5
5
  SHA512:
6
- metadata.gz: d502b7a87d0472fab4c7e254438b5d6029702f3bf88ecd71244dae92c6789fd70d618b0422278498a5d4012aee3f9728cc378821c4d280f41140c9d695851530
7
- data.tar.gz: 5f9851c90114474b0aa19129af023ea781255aa7baf8fc9ceb3873d6cd9a0fc12fbec3f10b57aa1c2c7486a34a48762fae4bfd06ab8f85fea95dfa40d936298d
6
+ metadata.gz: f12ef1fad4fcf414b7081f9b89a4db5536d301b2c015449a3d2d631ea09a2a087cb6c02f3699f61528f9e9b61d3bf039c37bf0b0885991a7d7e26ac3dadd452a
7
+ data.tar.gz: f6464aaa94ddeec4ddefecb6b94b5fa310ada53d67bd1bf9b146c942dbd29e637790c6ae081d3d4cc81aed12be4a9073f056e2770ab2b846278d07923d67f6bf
@@ -15,12 +15,12 @@ on:
15
15
 
16
16
  jobs:
17
17
  test:
18
- runs-on: ubuntu-20.04
18
+ runs-on: ubuntu-24.04
19
19
  strategy:
20
20
  fail-fast: false
21
21
  matrix:
22
22
  ruby:
23
- - '3.4.0-preview2'
23
+ - '3.4'
24
24
  - '3.3'
25
25
  - '3.2'
26
26
  - '3.1'
data/CHANGELOG.md CHANGED
@@ -1,10 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## [v3.4.0] - 2025-02-17
4
+
5
+ - Added support for Webauthn.config and RelayingParty to accept multiple allowed_origins. [#431](https://github.com/cedarcode/webauthn-ruby/pull/431)[@obroshnij]
6
+
3
7
  ## [v3.3.0] - 2025-02-06
4
8
 
5
9
  ### Added
6
10
 
7
- - Updated `tpm-key_attestation` dependency from `~> 1.12.0` to `~> 1.14.0`. [#449](https://github.com/cedarcode/webauthn-ruby/pull/449) [@brauliomartinezlm], [@nicolastemciuc]
11
+ - Updated `tpm-key_attestation` dependency from `~> 0.12.0` to `~> 0.14.0`. [#449](https://github.com/cedarcode/webauthn-ruby/pull/449) [@brauliomartinezlm], [@nicolastemciuc]
8
12
 
9
13
  ## [v3.2.2] - 2024-11-14
10
14
 
@@ -413,6 +417,11 @@ Note: Both additions should help making it compatible with Chrome for Android 70
413
417
  - `WebAuthn::AuthenticatorAttestationResponse.valid?` can be used to validate fido-u2f attestations returned by the browser
414
418
  - Works with ruby 2.5
415
419
 
420
+ [v3.4.0]: https://github.com/cedarcode/webauthn-ruby/compare/v3.3.0...v3.4.0/
421
+ [v3.3.0]: https://github.com/cedarcode/webauthn-ruby/compare/v3.2.2...v3.3.0/
422
+ [v3.2.2]: https://github.com/cedarcode/webauthn-ruby/compare/v3.2.1...v3.2.2/
423
+ [v3.2.1]: https://github.com/cedarcode/webauthn-ruby/compare/v3.2.0...v3.2.1/
424
+ [v3.2.0]: https://github.com/cedarcode/webauthn-ruby/compare/v3.1.0...v3.2.0/
416
425
  [v3.1.0]: https://github.com/cedarcode/webauthn-ruby/compare/v3.0.0...v3.1.0/
417
426
  [v3.0.0]: https://github.com/cedarcode/webauthn-ruby/compare/2-stable...v3.0.0/
418
427
  [v3.0.0.alpha2]: https://github.com/cedarcode/webauthn-ruby/compare/2-stable...v3.0.0.alpha2/
data/README.md CHANGED
@@ -104,7 +104,8 @@ For a Rails application this would go in `config/initializers/webauthn.rb`.
104
104
  WebAuthn.configure do |config|
105
105
  # This value needs to match `window.location.origin` evaluated by
106
106
  # the User Agent during registration and authentication ceremonies.
107
- config.origin = "https://auth.example.com"
107
+ # Multiple origins can be used when needed. Using more than one will imply you MUST configure rp_id explicitely. If you need your credentials to be bound to a single origin but you have more than one tenant, please see [our Advanced Configuration section](https://github.com/cedarcode/webauthn-ruby/blob/master/docs/advanced_configuration.md) instead of adding multiple origins.
108
+ config.allowed_origins = ["https://auth.example.com"]
108
109
 
109
110
  # Relying Party name for display purposes
110
111
  config.rp_name = "Example Inc."
@@ -25,7 +25,8 @@ module WebAuthn
25
25
  end
26
26
 
27
27
  def verify(expected_challenge, expected_origin = nil, user_presence: nil, user_verification: nil, rp_id: nil)
28
- expected_origin ||= relying_party.origin || raise("Unspecified expected origin")
28
+ expected_origin ||= relying_party.allowed_origins || raise("Unspecified expected origin")
29
+
29
30
  rp_id ||= relying_party.id
30
31
 
31
32
  verify_item(:type)
@@ -33,7 +34,11 @@ module WebAuthn
33
34
  verify_item(:challenge, expected_challenge)
34
35
  verify_item(:origin, expected_origin)
35
36
  verify_item(:authenticator_data)
36
- verify_item(:rp_id, rp_id || rp_id_from_origin(expected_origin))
37
+
38
+ verify_item(
39
+ :rp_id,
40
+ rp_id || rp_id_from_origin(expected_origin)
41
+ )
37
42
 
38
43
  # Fallback to RP configuration unless user_presence is passed in explicitely
39
44
  if user_presence.nil? && !relying_party.silent_authentication || user_presence
@@ -84,10 +89,14 @@ module WebAuthn
84
89
  end
85
90
 
86
91
  def valid_origin?(expected_origin)
87
- expected_origin && (client_data.origin == expected_origin)
92
+ return false unless expected_origin
93
+
94
+ expected_origin.include?(client_data.origin)
88
95
  end
89
96
 
90
97
  def valid_rp_id?(rp_id)
98
+ return false unless rp_id
99
+
91
100
  OpenSSL::Digest::SHA256.digest(rp_id) == authenticator_data.rp_id_hash
92
101
  end
93
102
 
@@ -106,7 +115,7 @@ module WebAuthn
106
115
  end
107
116
 
108
117
  def rp_id_from_origin(expected_origin)
109
- URI.parse(expected_origin).host
118
+ URI.parse(expected_origin.first).host if expected_origin.size == 1
110
119
  end
111
120
 
112
121
  def type
@@ -49,12 +49,10 @@ module WebAuthn
49
49
 
50
50
  def data
51
51
  @data ||=
52
- begin
53
- if client_data_json
54
- JSON.parse(client_data_json)
55
- else
56
- raise ClientDataMissingError, "Client Data JSON is missing"
57
- end
52
+ if client_data_json
53
+ JSON.parse(client_data_json)
54
+ else
55
+ raise ClientDataMissingError, "Client Data JSON is missing"
58
56
  end
59
57
  end
60
58
  end
@@ -22,6 +22,8 @@ module WebAuthn
22
22
  :encoding=,
23
23
  :origin,
24
24
  :origin=,
25
+ :allowed_origins,
26
+ :allowed_origins=,
25
27
  :verify_attestation_statement,
26
28
  :verify_attestation_statement=,
27
29
  :credential_options_timeout,
@@ -9,15 +9,16 @@ module WebAuthn
9
9
  class RootCertificateFinderNotSupportedError < Error; end
10
10
 
11
11
  class RelyingParty
12
+ DEFAULT_ALGORITHMS = ["ES256", "PS256", "RS256"].compact.freeze
13
+
12
14
  def self.if_pss_supported(algorithm)
13
15
  OpenSSL::PKey::RSA.instance_methods.include?(:verify_pss) ? algorithm : nil
14
16
  end
15
17
 
16
- DEFAULT_ALGORITHMS = ["ES256", "PS256", "RS256"].compact.freeze
17
-
18
18
  def initialize(
19
19
  algorithms: DEFAULT_ALGORITHMS.dup,
20
20
  encoding: WebAuthn::Encoder::STANDARD_ENCODING,
21
+ allowed_origins: nil,
21
22
  origin: nil,
22
23
  id: nil,
23
24
  name: nil,
@@ -30,7 +31,7 @@ module WebAuthn
30
31
  )
31
32
  @algorithms = algorithms
32
33
  @encoding = encoding
33
- @origin = origin
34
+ @allowed_origins = allowed_origins
34
35
  @id = id
35
36
  @name = name
36
37
  @verify_attestation_statement = verify_attestation_statement
@@ -38,12 +39,13 @@ module WebAuthn
38
39
  @silent_authentication = silent_authentication
39
40
  @acceptable_attestation_types = acceptable_attestation_types
40
41
  @legacy_u2f_appid = legacy_u2f_appid
42
+ self.origin = origin
41
43
  self.attestation_root_certificates_finders = attestation_root_certificates_finders
42
44
  end
43
45
 
44
46
  attr_accessor :algorithms,
45
47
  :encoding,
46
- :origin,
48
+ :allowed_origins,
47
49
  :id,
48
50
  :name,
49
51
  :verify_attestation_statement,
@@ -52,7 +54,7 @@ module WebAuthn
52
54
  :acceptable_attestation_types,
53
55
  :legacy_u2f_appid
54
56
 
55
- attr_reader :attestation_root_certificates_finders
57
+ attr_reader :attestation_root_certificates_finders, :origin
56
58
 
57
59
  # This is the user-data encoder.
58
60
  # Used to decode user input and to encode data provided to the user.
@@ -118,5 +120,18 @@ module WebAuthn
118
120
  block_given? ? [webauthn_credential, stored_credential] : webauthn_credential
119
121
  end
120
122
  end
123
+
124
+ # DEPRECATED: This method will be removed in future.
125
+ def origin=(new_origin)
126
+ return if new_origin.nil?
127
+
128
+ warn(
129
+ "DEPRECATION WARNING: `WebAuthn.origin` is deprecated and will be removed in future. "\
130
+ "Please use `WebAuthn.allowed_origins` instead "\
131
+ "that also allows configuring multiple origins per Relying Party"
132
+ )
133
+
134
+ @allowed_origins ||= Array(new_origin) # rubocop:disable Naming/MemoizedInstanceVariableName
135
+ end
121
136
  end
122
137
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WebAuthn
4
- VERSION = "3.3.0"
4
+ VERSION = "3.4.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webauthn
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gonzalo Rodriguez
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2025-02-06 00:00:00.000000000 Z
12
+ date: 2025-02-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: android_key_attestation