diff --git a/lib/rpi_auth/controllers/auto_refreshing_token.rb b/lib/rpi_auth/controllers/auto_refreshing_token.rb index 2a9f558..6e1dc0e 100644 --- a/lib/rpi_auth/controllers/auto_refreshing_token.rb +++ b/lib/rpi_auth/controllers/auto_refreshing_token.rb @@ -18,13 +18,17 @@ module AutoRefreshingToken private def refresh_credentials_if_needed - return unless current_user + return if current_user.blank? || current_user.expires_at.blank? return if Time.now.to_i + REFRESH_WINDOW_IN_SECONDS <= current_user.expires_at + # This raises an OAuth2::Error on failure, which is rescued by the + # handle_oauth2_error method. current_user.refresh_credentials! self.current_user = current_user - rescue OAuth2::Error, ArgumentError + rescue OAuth2::Error + # Catching here allows the controller to continue on from where it left + # off. reset_session end end diff --git a/lib/rpi_auth/controllers/current_user.rb b/lib/rpi_auth/controllers/current_user.rb index 21129c9..61c75e2 100644 --- a/lib/rpi_auth/controllers/current_user.rb +++ b/lib/rpi_auth/controllers/current_user.rb @@ -9,6 +9,12 @@ module CurrentUser helper_method :current_user if respond_to?(:helper_method) end + # Make sure our memoized user is cleared out on reset + def reset_session + @current_user = nil + super + end + def current_user return nil unless session[:current_user] return @current_user if @current_user diff --git a/spec/dummy/app/controllers/home_controller.rb b/spec/dummy/app/controllers/home_controller.rb index 0f319e4..9160ca4 100644 --- a/spec/dummy/app/controllers/home_controller.rb +++ b/spec/dummy/app/controllers/home_controller.rb @@ -3,7 +3,6 @@ def show end def reset_user - current_user reset_session render :show end diff --git a/spec/dummy/app/views/home/show.html.erb b/spec/dummy/app/views/home/show.html.erb index bbffe2d..ea027d8 100644 --- a/spec/dummy/app/views/home/show.html.erb +++ b/spec/dummy/app/views/home/show.html.erb @@ -3,8 +3,11 @@
<% if current_user.present? %>
Logged in as <%= current_user.user_id %>
+
<%= link_to 'Log out', rpi_auth_logout_path, class: 'button' %>
<% else %>
+ Logged out
+
<%= button_to 'Log in', rpi_auth_login_path, method: :post %>
<%= link_to 'Log in GET', rpi_auth_login_path %> (should 404)
diff --git a/spec/dummy/spec/requests/refresh_credentials_spec.rb b/spec/dummy/spec/requests/refresh_credentials_spec.rb
index a2a5300..deb05c2 100644
--- a/spec/dummy/spec/requests/refresh_credentials_spec.rb
+++ b/spec/dummy/spec/requests/refresh_credentials_spec.rb
@@ -9,7 +9,6 @@
subject(:request) { get root_path }
- let(:logged_in_text) { 'Log out' }
let(:stub_oauth_client) { instance_double(RpiAuth::OauthClient) }
before do
@@ -40,14 +39,14 @@
shared_examples 'the user is logged in' do
it do
request
- expect(response.body).to include(logged_in_text)
+ expect(response.body).to include('Logged in as')
end
end
shared_examples 'the user is logged out' do
it do
request
- expect(response.body).not_to include(logged_in_text)
+ expect(response.body).to include('Logged out')
end
end