Module: Practical::Test::Helpers::Passkey::TestHelper

Defined in:
app/lib/practical/test/helpers/passkey/test_helper.rb

Instance Method Summary collapse

Instance Method Details

#admin_relying_party(options: {}) ⇒ Object



66
67
68
69
70
71
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 66

def admin_relying_party(options: {})
  return WebAuthn::RelyingParty.new(**{
    allowed_origins: admin_relying_party_origin,
    name: I18n.translate("administrator.app_title.text")
  }.merge(options))
end

#admin_relying_party_idObject



58
59
60
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 58

def admin_relying_party_id
  URI.parse(admin_relying_party_origin).host
end

#admin_relying_party_originObject



54
55
56
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 54

def admin_relying_party_origin
  AppSettings.admin_relying_party_origin
end

#administrator_user_data(administrator:) ⇒ Object



38
39
40
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 38

def administrator_user_data(administrator:)
  {"name"=>administrator.email, "id"=>administrator.webauthn_id, "displayName"=>administrator.email}
end

#assert_passkey_authentication_challenge(data:, stored_challenge:, credentials_to_allow: []) ⇒ Object



23
24
25
26
27
28
29
30
31
32
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 23

def assert_passkey_authentication_challenge(
  data:,
  stored_challenge:,
  credentials_to_allow: []
)
  assert_equal stored_challenge, data["challenge"]
  assert_equal "required", data["userVerification"]

  assert_equal credential_id_for_challenge(passkeys: credentials_to_allow), data["allowCredentials"]
end

#assert_passkey_registration_challenge(data:, stored_challenge:, relying_party_data:, user_data:, credentials_to_exclude: []) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 6

def assert_passkey_registration_challenge(
  data:,
  stored_challenge:,
  relying_party_data:,
  user_data:,
  credentials_to_exclude: []
)
  authentication_selection = {"residentKey"=>"required", "userVerification"=>"required"}

  assert_equal stored_challenge, data["challenge"]
  assert_equal relying_party_data, data["rp"]
  assert_equal user_data, data["user"]
  assert_equal authentication_selection, data["authenticatorSelection"]

  assert_equal credentials_to_exclude, data["excludeCredentials"]
end

#assertion_from_client(client:, challenge:, user_verified: true) ⇒ Object



92
93
94
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 92

def assertion_from_client(client:, challenge:, user_verified: true)
  client.get(challenge: challenge, user_verified: user_verified)
end

#create_credential_and_return_payload_from_challenge(client:, challenge:, user_verified: true) ⇒ Object



117
118
119
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 117

def create_credential_and_return_payload_from_challenge(client:, challenge:, user_verified: true)
  return client.create(challenge: challenge, user_verified: user_verified)
end

#credential_data_for_passkey(passkey:) ⇒ Object



46
47
48
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 46

def credential_data_for_passkey(passkey:)
  {"type"=>"public-key", "id"=> passkey.external_id}
end

#credential_id_for_challenge(passkeys:) ⇒ Object



34
35
36
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 34

def credential_id_for_challenge(passkeys:)
  Array.wrap(passkeys).map{|x| {"type" => "public-key", "id" => x.external_id} }
end

#encode_challenge(raw_challenge:) ⇒ Object



88
89
90
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 88

def encode_challenge(raw_challenge:)
  Base64.strict_encode64(raw_challenge)
end

#encoded_public_key(credential:, relying_party:) ⇒ Object



125
126
127
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 125

def encoded_public_key(credential:, relying_party:)
  relying_party.encoder.encode(credential.public_key)
end

#fake_authenticatorObject



80
81
82
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 80

def fake_authenticator
  return WebAuthn::FakeAuthenticator.new
end

#fake_client(origin: "https://example.test", authenticator: WebAuthn::FakeAuthenticator.new) ⇒ Object



84
85
86
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 84

def fake_client(origin: "https://example.test", authenticator: WebAuthn::FakeAuthenticator.new)
  return WebAuthn::FakeClient.new(origin, authenticator: authenticator)
end

#get_credential_payload_from_challenge(client:, challenge:, user_verified: true) ⇒ Object



121
122
123
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 121

def get_credential_payload_from_challenge(client:, challenge:, user_verified: true)
  client.get(challenge: challenge, user_verified: user_verified)
end

#hydrate_response_from_raw_credential(client:, relying_party:, raw_credential:) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 96

def hydrate_response_from_raw_credential(client:, relying_party:, raw_credential:)
  attestation_object = if client.encoding
    relying_party.encoder.decode(raw_credential["response"]["attestationObject"])
  else
    raw_credential["response"]["attestationObject"]
  end

client_data_json =
  if client.encoding
    relying_party.encoder.decode(raw_credential["response"]["clientDataJSON"])
  else
    raw_credential["response"]["clientDataJSON"]
  end

return WebAuthn::AuthenticatorAttestationResponse.new(
  attestation_object: attestation_object,
  client_data_json: client_data_json,
  relying_party: relying_party
)
end

#relying_party(options: {}) ⇒ Object



73
74
75
76
77
78
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 73

def relying_party(options: {})
  return WebAuthn::RelyingParty.new(**{
    allowed_origins: relying_party_origin,
    name: I18n.translate("app_title.text")
  }.merge(options))
end

#relying_party_originObject



50
51
52
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 50

def relying_party_origin
  AppSettings.relying_party_origin
end

#user_data(user:) ⇒ Object



42
43
44
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 42

def user_data(user:)
  {"name"=>user.email, "id"=>user.webauthn_id, "displayName"=>user.name}
end

#user_relying_party_idObject



62
63
64
# File 'app/lib/practical/test/helpers/passkey/test_helper.rb', line 62

def user_relying_party_id
  URI.parse(relying_party_origin).host
end