Skip to content

Commit 03e4973

Browse files
robinvdvleutenRobin van der Vleuten
authored andcommitted
Make the remember_me_token cookie name configurable
1 parent 4bda5a8 commit 03e4973

File tree

3 files changed

+85
-5
lines changed

3 files changed

+85
-5
lines changed

lib/generators/sorcery/templates/initializer.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
#
2727
# config.cookie_domain =
2828

29+
# Set name of the remember_me cookie
30+
# Default: `:remember_me_token`
31+
#
32+
# config.remember_me_cookie_name =
33+
2934
# Allow the remember_me cookie to be set through AJAX
3035
# Default: `true`
3136
#

lib/sorcery/controller/submodules/remember_me.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ def self.included(base)
1010
base.send(:include, InstanceMethods)
1111
Config.module_eval do
1212
class << self
13+
attr_accessor :remember_me_cookie_name
1314
attr_accessor :remember_me_httponly
15+
1416
def merge_remember_me_defaults!
15-
@defaults.merge!(:@remember_me_httponly => true)
17+
@defaults.merge!(:@remember_me_cookie_name => :remember_me_token,
18+
:@remember_me_httponly => true)
1619
end
1720
end
1821
merge_remember_me_defaults!
@@ -36,13 +39,13 @@ def remember_me!
3639
# Clears the cookie, and depending on the value of remember_me_token_persist_globally, may clear the token value.
3740
def forget_me!
3841
current_user.forget_me!
39-
cookies.delete(:remember_me_token, domain: Config.cookie_domain)
42+
cookies.delete(Config.remember_me_cookie_name.to_sym, domain: Config.cookie_domain)
4043
end
4144

4245
# Clears the cookie, and clears the token value.
4346
def force_forget_me!
4447
current_user.force_forget_me!
45-
cookies.delete(:remember_me_token, domain: Config.cookie_domain)
48+
cookies.delete(Config.remember_me_cookie_name.to_sym, domain: Config.cookie_domain)
4649
end
4750

4851
# Override.
@@ -59,7 +62,7 @@ def auto_login(user, should_remember = false)
5962
# and logs the user in if found.
6063
# Runs as a login source. See 'current_user' method for how it is used.
6164
def login_from_cookie
62-
user = cookies.signed[:remember_me_token] && user_class.sorcery_adapter.find_by_remember_me_token(cookies.signed[:remember_me_token]) if defined? cookies
65+
user = cookies.signed[Config.remember_me_cookie_name.to_sym] && user_class.sorcery_adapter.find_by_remember_me_token(cookies.signed[Config.remember_me_cookie_name.to_sym]) if defined? cookies
6366
if user && user.has_remember_me_token?
6467
set_remember_me_cookie!(user)
6568
session[:user_id] = user.id.to_s
@@ -71,7 +74,7 @@ def login_from_cookie
7174
end
7275

7376
def set_remember_me_cookie!(user)
74-
cookies.signed[:remember_me_token] = {
77+
cookies.signed[Config.remember_me_cookie_name.to_sym] = {
7578
value: user.send(user.sorcery_config.remember_me_token_attribute_name),
7679
expires: user.send(user.sorcery_config.remember_me_token_expires_at_attribute_name),
7780
httponly: Config.remember_me_httponly,

spec/controllers/controller_remember_me_spec.rb

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,20 @@
3131
expect(cookies.signed['remember_me_token']).to eq assigns[:current_user].remember_me_token
3232
end
3333

34+
it 'sets cookie on remember_me! with custom cookie name' do
35+
sorcery_controller_property_set(:remember_me_cookie_name, :custom)
36+
37+
expect(User).to receive(:authenticate).with('[email protected]', 'secret') { |&block| block.call(user, nil) }
38+
expect(user).to receive(:remember_me!)
39+
40+
post :test_login_with_remember, params: { email: '[email protected]', password: 'secret' }
41+
42+
expect(cookies.signed['custom']).to eq assigns[:current_user].remember_me_token
43+
44+
# Reset property back to default so it won't interfere with other tests.
45+
sorcery_controller_property_set(:remember_me_cookie_name, :remember_me_token)
46+
end
47+
3448
it 'clears cookie on forget_me!' do
3549
cookies['remember_me_token'] = { value: 'asd54234dsfsd43534', expires: 3600 }
3650
get :test_logout
@@ -58,6 +72,22 @@
5872
expect(cookies.signed['remember_me_token']).to eq assigns[:user].remember_me_token
5973
end
6074

75+
it 'login(email,password,remember_me) logs user in and remembers with custom cookie name' do
76+
sorcery_controller_property_set(:remember_me_cookie_name, :custom)
77+
78+
expect(User).to receive(:authenticate).with('[email protected]', 'secret', '1') { |&block| block.call(user, nil) }
79+
expect(user).to receive(:remember_me!)
80+
expect(user).to receive(:remember_me_token).and_return('abracadabra').twice
81+
82+
post :test_login_with_remember_in_login, params: { email: '[email protected]', password: 'secret', remember: '1' }
83+
84+
expect(cookies.signed['custom']).not_to be_nil
85+
expect(cookies.signed['custom']).to eq assigns[:user].remember_me_token
86+
87+
# Reset property back to default so it won't interfere with other tests.
88+
sorcery_controller_property_set(:remember_me_cookie_name, :remember_me_token)
89+
end
90+
6191
it 'logout also calls forget_me!' do
6292
session[:user_id] = user.id.to_s
6393
expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id.to_s).and_return(user)
@@ -68,6 +98,21 @@
6898
expect(cookies['remember_me_token']).to be_nil
6999
end
70100

101+
it 'logout also calls forget_me! with custom cookie name' do
102+
sorcery_controller_property_set(:remember_me_cookie_name, 'custom')
103+
104+
session[:user_id] = user.id.to_s
105+
expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id.to_s).and_return(user)
106+
expect(user).to receive(:remember_me!)
107+
expect(user).to receive(:forget_me!)
108+
get :test_logout_with_remember
109+
110+
expect(cookies['custom']).to be_nil
111+
112+
# Reset property back to default so it won't interfere with other tests.
113+
sorcery_controller_property_set(:remember_me_cookie_name, :remember_me_token)
114+
end
115+
71116
it 'logs user in from cookie' do
72117
session[:user_id] = user.id.to_s
73118
expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id.to_s).and_return(user)
@@ -90,6 +135,33 @@
90135
expect(assigns[:current_user]).to eq user
91136
end
92137

138+
it 'logs user in from cookie with custom cookie name' do
139+
sorcery_controller_property_set(:remember_me_cookie_name, :custom)
140+
141+
session[:user_id] = user.id.to_s
142+
expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id.to_s).and_return(user)
143+
expect(user).to receive(:remember_me!)
144+
expect(user).to receive(:remember_me_token).and_return('token')
145+
expect(user).to receive(:has_remember_me_token?) { true }
146+
147+
subject.remember_me!
148+
subject.instance_eval do
149+
remove_instance_variable :@current_user
150+
end
151+
session[:user_id] = nil
152+
153+
expect(User.sorcery_adapter).to receive(:find_by_remember_me_token).with('token').and_return(user)
154+
155+
expect(subject).to receive(:after_remember_me!).with(user)
156+
157+
get :test_login_from_cookie
158+
159+
expect(assigns[:current_user]).to eq user
160+
161+
# Reset property back to default so it won't interfere with other tests.
162+
sorcery_controller_property_set(:remember_me_cookie_name, :remember_me_token)
163+
end
164+
93165
it 'doest not remember_me! when not asked to, even if third parameter is used' do
94166
post :test_login_with_remember_in_login, params: { email: '[email protected]', password: 'secret', remember: '0' }
95167

0 commit comments

Comments
 (0)