Skip to content

Commit fe11674

Browse files
Merge pull request #133 from cedarcode/sr--remember-me-for-passkey-login
Fix remember me checkbox not honored when logging in with passkeys
2 parents 8fe5640 + e7fbf0d commit fe11674

3 files changed

Lines changed: 69 additions & 5 deletions

File tree

lib/devise/strategies/passkey_authenticatable.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def authenticate! # rubocop:disable Metrics/AbcSize
1919

2020
verify_passkeys(passkey_from_params, stored_passkey)
2121

22+
remember_me(resource)
2223
success!(resource)
2324
rescue WebAuthn::Error
2425
fail!(:passkey_verification_failed)
@@ -43,6 +44,18 @@ def verify_passkeys(passkey_from_params, stored_passkey)
4344
stored_passkey.update!(sign_count: passkey_from_params.sign_count)
4445
end
4546

47+
def remember_me(resource)
48+
resource.remember_me = remember_me? if resource.respond_to?(:remember_me=)
49+
end
50+
51+
def remember_me?
52+
params_auth_hash.is_a?(Hash) && Devise::TRUE_VALUES.include?(params_auth_hash[:remember_me])
53+
end
54+
55+
def params_auth_hash
56+
params[scope]
57+
end
58+
4659
def resource_class
4760
mapping.to
4861
end
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<h2>Log in</h2>
2+
3+
<%= form_for(resource, as: resource_name, url: session_path(resource_name), html: { id: "password-login" }) do |f| %>
4+
<div class="field">
5+
<%= f.label :email %><br />
6+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
7+
</div>
8+
9+
<div class="field">
10+
<%= f.label :password %><br />
11+
<%= f.password_field :password, autocomplete: "current-password" %>
12+
</div>
13+
14+
<% if devise_mapping.rememberable? %>
15+
<div class="field">
16+
<%= f.check_box :remember_me %>
17+
<%= f.label :remember_me %>
18+
</div>
19+
<% end %>
20+
21+
<div class="actions">
22+
<%= f.submit "Log in" %>
23+
</div>
24+
<% end %>
25+
26+
<%= login_with_passkey_form_for(resource_name, id: "passkey-login") do |form| %>
27+
<div class="field">
28+
<%= check_box_tag "account[remember_me]", id: "passkey_remember_me" %>
29+
<%= label_tag "passkey_remember_me", "Remember me" %>
30+
</div>
31+
32+
<%= form.submit "Log in with passkeys" %>
33+
<% end %>
34+
35+
<%= render "devise/shared/links" %>

spec/system/sign_in_with_webauthn_spec.rb

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,26 @@
2020
add_passkey_to_authenticator(authenticator, user)
2121
end
2222

23-
it "allows to create a passkey and then sign in with it" do
23+
it "allows to sign in with it and does not set the remember cookie when remember me is not checked" do
2424
visit new_account_session_path
2525
click_button "Log in with passkeys"
2626

2727
expect(page).to have_current_path(root_path)
2828
expect(page).to have_content("Signed in successfully.")
29+
expect(remember_cookie).to be_nil
30+
end
31+
32+
it "allows to sign in with it and sets the remember cookie when remember me is checked" do
33+
visit new_account_session_path
34+
35+
within "#passkey-login" do
36+
check "Remember me"
37+
click_button "Log in with passkeys"
38+
end
39+
40+
expect(page).to have_current_path(root_path)
41+
expect(page).to have_content("Signed in successfully.")
42+
expect(remember_cookie).to be_present
2943
end
3044

3145
it "can use them as second factor authentication" do
@@ -100,11 +114,13 @@
100114
it "sets remember cookie when remember me is checked" do
101115
visit new_account_session_path
102116

103-
fill_in "Email", with: user.email
104-
fill_in "Password", with: "$3cretp@ssword123"
105-
check "Remember me"
117+
within "#password-login" do
118+
fill_in "Email", with: user.email
119+
fill_in "Password", with: "$3cretp@ssword123"
120+
check "Remember me"
106121

107-
click_button "Log in"
122+
click_button "Log in"
123+
end
108124

109125
expect(page).to have_current_path(new_account_two_factor_authentication_path)
110126
expect(page).to have_content("Two-factor authentication is required to sign in.")

0 commit comments

Comments
 (0)