Consistent expiration for all login-related cookies

This commit is contained in:
Nimisha Asthagiri
2018-10-10 21:35:55 -04:00
parent f9488a8502
commit 2b8a9d5148
3 changed files with 17 additions and 21 deletions

View File

@@ -3159,7 +3159,7 @@ JWT_AUTH = {
# Number of seconds before JWTs expire
'JWT_EXPIRATION': 30,
'JWT_COOKIE_EXPIRATION': 60 * 60,
'JWT_IN_COOKIE_EXPIRATION': 60 * 60,
'JWT_LOGIN_CLIENT_ID': 'login-service-client-id',
'JWT_LOGIN_SERVICE_USERNAME': 'login_service_user',

View File

@@ -90,7 +90,8 @@ def standard_cookie_settings(request):
expires = None
else:
max_age = request.session.get_expiry_age()
expires = _cookie_expiration_based_on_max_age(max_age)
_expires_time = time.time() + max_age
expires = cookie_date(_expires_time)
cookie_settings = {
'max_age': max_age,
@@ -246,10 +247,13 @@ def _create_and_set_jwt_cookies(response, request, user=None, refresh_token=None
if not JWT_COOKIES_FLAG.is_enabled():
return
# TODO (ARCH-246) Need to fix configuration of token expiration settings.
# JWT cookies expire at the same time as other login-related cookies
# so that cookie-based login determination remains consistent.
cookie_settings = standard_cookie_settings(request)
_set_jwt_expiration(cookie_settings)
expires_in = cookie_settings['max_age']
# For security reasons, the JWT that is embedded inside the cookie expires
# much sooner than the cookie itself, per the following setting.
expires_in = settings.JWT_AUTH['JWT_IN_COOKIE_EXPIRATION']
oauth_application = _get_login_oauth_client()
if refresh_token:
@@ -306,21 +310,6 @@ def _set_jwt_cookies(response, cookie_settings, jwt_header_and_payload, jwt_sign
)
def _set_jwt_expiration(cookie_settings):
"""
Updates cookie_settings with the configured expiration values for JWT
Cookies.
"""
max_age = settings.JWT_AUTH['JWT_COOKIE_EXPIRATION']
cookie_settings['max_age'] = max_age
cookie_settings['expires'] = _cookie_expiration_based_on_max_age(max_age)
def _cookie_expiration_based_on_max_age(max_age):
expires_time = time.time() + max_age
return cookie_date(expires_time)
def _get_login_oauth_client():
"""
Returns the configured OAuth Client/Application used for Login.

View File

@@ -60,7 +60,7 @@ class CookieTests(TestCase):
Verifies that a JWT can be properly recreated from the 2 separate
JWT-related cookies using the JwtAuthCookieMiddleware middleware.
"""
self.request.COOKIES = response.cookies
self._copy_cookies_to_request(response, self.request)
JwtAuthCookieMiddleware().process_request(self.request)
self.assertEqual(
cookies_api.jwt_cookies.jwt_cookie_name() in self.request.COOKIES,
@@ -68,8 +68,13 @@ class CookieTests(TestCase):
)
def _assert_cookies_present(self, response, expected_cookies):
""" Verify all expected_cookies are present in the response. """
self.assertSetEqual(set(response.cookies.keys()), set(expected_cookies))
def _assert_consistent_expires(self, response):
""" Verify all cookies in the response have the same expiration. """
self.assertEqual(1, len(set([response.cookies[c]['expires'] for c in response.cookies])))
def test_get_user_info_cookie_data(self):
actual = cookies_api._get_user_info_cookie_data(self.request, self.user) # pylint: disable=protected-access
@@ -90,6 +95,7 @@ class CookieTests(TestCase):
def test_set_logged_in_deprecated_cookies(self):
response = cookies_api.set_logged_in_cookies(self.request, HttpResponse(), self.user)
self._assert_cookies_present(response, cookies_api.DEPRECATED_LOGGED_IN_COOKIE_NAMES)
self._assert_consistent_expires(response)
self._assert_recreate_jwt_from_cookies(response, can_recreate=False)
def test_set_logged_in_jwt_cookies(self):
@@ -97,6 +103,7 @@ class CookieTests(TestCase):
with cookies_api.JWT_COOKIES_FLAG.override(True):
response = cookies_api.set_logged_in_cookies(self.request, HttpResponse(), self.user)
self._assert_cookies_present(response, cookies_api.ALL_LOGGED_IN_COOKIE_NAMES)
self._assert_consistent_expires(response)
self._assert_recreate_jwt_from_cookies(response, can_recreate=True)
def test_delete_and_is_logged_in_cookie_set(self):