Skip to content

Commit f37ef3c

Browse files
Merge pull request #8 from ruby-passkeys/7-make-authenticator-selection-customizable
Add `RegistrationHelpers.authenticator_selection_options`
2 parents 634b747 + 44425fe commit f37ef3c

File tree

3 files changed

+72
-8
lines changed

3 files changed

+72
-8
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## [0.3.0]- 2023-07-24
2+
3+
- Add `RegistrationHelpers.authenticator_selection_options`
4+
- https://github.com/ruby-passkeys/warden-webauthn/pull/8
5+
16
## [0.2.1]- 2023-06-24
27

38
- Refactor `relying_party_key` into `Warden::WebAuthn::RackHelpers`

lib/warden/webauthn/registration_helpers.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def generate_registration_options(relying_party:, user_details:, exclude: [], op
88
relying_party.options_for_registration(**{
99
user: user_details,
1010
exclude: exclude,
11-
authenticator_selection: { user_verification: "required" }
11+
authenticator_selection: authenticator_selection_options
1212
}.merge(options))
1313
end
1414

@@ -47,6 +47,10 @@ def raw_credential_key
4747
def registration_challenge_key
4848
"current_webauthn_registration_challenge"
4949
end
50+
51+
def authenticator_selection_options
52+
{ resident_key: "required", user_verification: "required" }
53+
end
5054
end
5155
end
5256
end

test/warden/test_registration_helpers.rb

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def test_generate_registration_options
4949
assert_equal 120_000, options_for_registration.timeout
5050
assert_equal relying_party, options_for_registration.relying_party
5151

52-
assert_equal ({user_verification: "required"}), options_for_registration.authenticator_selection
52+
assert_equal ({ resident_key: "required", user_verification: "required" }), options_for_registration.authenticator_selection
5353

5454
assert_kind_of WebAuthn::PublicKeyCredential::UserEntity, options_for_registration.user
5555

@@ -83,7 +83,7 @@ def test_generate_registration_options_with_overrides
8383
assert_equal extensions, options_for_registration.extensions
8484
assert_equal expected_exclude_credentials, options_for_registration.exclude_credentials
8585

86-
assert_equal ({user_verification: "required"}), options_for_registration.authenticator_selection
86+
assert_equal ({ resident_key: "required", user_verification: "required" }), options_for_registration.authenticator_selection
8787

8888
assert_kind_of WebAuthn::PublicKeyCredential::UserEntity, options_for_registration.user
8989

@@ -110,7 +110,7 @@ def test_generate_registration_options_with_customized_relying_party_id
110110
assert_equal 120_000, options_for_registration.timeout
111111
assert_equal relying_party, options_for_registration.relying_party
112112

113-
assert_equal ({user_verification: "required"}), options_for_registration.authenticator_selection
113+
assert_equal ({ resident_key: "required", user_verification: "required" }), options_for_registration.authenticator_selection
114114

115115
assert_kind_of WebAuthn::PublicKeyCredential::UserEntity, options_for_registration.user
116116

@@ -297,6 +297,10 @@ def test_registration_challenge
297297

298298
assert_equal challenge, @test_class.registration_challenge
299299
end
300+
301+
def test_authenticator_selection_options
302+
assert_equal ({ resident_key: "required", user_verification: "required" }), @test_class.authenticator_selection_options
303+
end
300304
end
301305

302306
class Warden::TestRegistrationHelpersCustomChallengeKey < Minitest::Test
@@ -353,7 +357,7 @@ def test_generate_registration_options
353357
assert_equal 120_000, options_for_registration.timeout
354358
assert_equal relying_party, options_for_registration.relying_party
355359

356-
assert_equal ({user_verification: "required"}), options_for_registration.authenticator_selection
360+
assert_equal ({ resident_key: "required", user_verification: "required" }), options_for_registration.authenticator_selection
357361

358362
assert_kind_of WebAuthn::PublicKeyCredential::UserEntity, options_for_registration.user
359363

@@ -387,7 +391,7 @@ def test_generate_registration_options_with_overrides
387391
assert_equal extensions, options_for_registration.extensions
388392
assert_equal expected_exclude_credentials, options_for_registration.exclude_credentials
389393

390-
assert_equal ({user_verification: "required"}), options_for_registration.authenticator_selection
394+
assert_equal ({ resident_key: "required", user_verification: "required" }), options_for_registration.authenticator_selection
391395

392396
assert_kind_of WebAuthn::PublicKeyCredential::UserEntity, options_for_registration.user
393397

@@ -414,7 +418,7 @@ def test_generate_registration_options_with_customized_relying_party_id
414418
assert_equal 120_000, options_for_registration.timeout
415419
assert_equal relying_party, options_for_registration.relying_party
416420

417-
assert_equal ({user_verification: "required"}), options_for_registration.authenticator_selection
421+
assert_equal ({ resident_key: "required", user_verification: "required" }), options_for_registration.authenticator_selection
418422

419423
assert_kind_of WebAuthn::PublicKeyCredential::UserEntity, options_for_registration.user
420424

@@ -600,4 +604,55 @@ def test_registration_challenge
600604

601605
assert_equal challenge, @test_class.registration_challenge
602606
end
603-
end
607+
end
608+
609+
class Warden::TestRegistrationHelpersCustomAuthenticatorSelection < Minitest::Test
610+
include WebAuthnTestHelpers
611+
612+
class TestClass
613+
include Warden::WebAuthn::RegistrationHelpers
614+
615+
attr_accessor :session, :params
616+
617+
def initialize
618+
self.session = {}
619+
self.params = {}
620+
end
621+
622+
def authenticator_selection_options
623+
{ resident_key: "preferred", user_verification: "preferred" }
624+
end
625+
end
626+
627+
def setup
628+
@test_class = TestClass.new
629+
end
630+
631+
def test_authenticator_selection_options
632+
assert_equal ({ resident_key: "preferred", user_verification: "preferred" }), @test_class.authenticator_selection_options
633+
end
634+
635+
def test_generate_registration_options
636+
relying_party = example_relying_party
637+
user_details = {name: "Test User", id: WebAuthn.generate_user_id}
638+
options_for_registration = @test_class.generate_registration_options(relying_party: relying_party, user_details: user_details)
639+
640+
assert_kind_of WebAuthn::PublicKeyCredential::CreationOptions, options_for_registration
641+
assert_empty options_for_registration.exclude
642+
assert_empty options_for_registration.exclude_credentials
643+
assert_equal ({}), options_for_registration.extensions
644+
assert_nil options_for_registration.rp.id
645+
646+
assert_equal 120_000, options_for_registration.timeout
647+
assert_equal relying_party, options_for_registration.relying_party
648+
649+
assert_equal ({ resident_key: "preferred", user_verification: "preferred" }), options_for_registration.authenticator_selection
650+
651+
assert_kind_of WebAuthn::PublicKeyCredential::UserEntity, options_for_registration.user
652+
653+
assert_equal "Test User", options_for_registration.user.name
654+
assert_equal "Test User", options_for_registration.user.display_name
655+
refute_nil options_for_registration.user.id
656+
refute_nil options_for_registration.challenge
657+
end
658+
end

0 commit comments

Comments
 (0)