|
7 | 7 | from django.urls import reverse
|
8 | 8 | from django.utils import timezone
|
9 | 9 |
|
10 |
| -from authentik.core.models import Application |
| 10 | +from authentik.core.models import Application, AuthenticatedSession, Session |
11 | 11 | from authentik.core.tests.utils import create_test_admin_user, create_test_cert, create_test_flow
|
12 | 12 | from authentik.lib.generators import generate_id
|
13 | 13 | from authentik.providers.oauth2.models import (
|
14 | 14 | AccessToken,
|
15 | 15 | ClientTypes,
|
| 16 | + DeviceToken, |
16 | 17 | IDToken,
|
17 | 18 | OAuth2Provider,
|
18 | 19 | RedirectURI,
|
19 | 20 | RedirectURIMatchingMode,
|
20 | 21 | RefreshToken,
|
21 | 22 | )
|
22 | 23 | from authentik.providers.oauth2.tests.utils import OAuthTestCase
|
| 24 | +from authentik.root.middleware import ClientIPMiddleware |
23 | 25 |
|
24 | 26 |
|
25 | 27 | class TesOAuth2Revoke(OAuthTestCase):
|
@@ -135,3 +137,86 @@ def test_revoke_public(self):
|
135 | 137 | },
|
136 | 138 | )
|
137 | 139 | self.assertEqual(res.status_code, 200)
|
| 140 | + |
| 141 | + def test_revoke_logout(self): |
| 142 | + """Test revoke on logout""" |
| 143 | + self.client.force_login(self.user) |
| 144 | + AccessToken.objects.create( |
| 145 | + provider=self.provider, |
| 146 | + user=self.user, |
| 147 | + session=self.client.session["authenticatedsession"], |
| 148 | + token=generate_id(), |
| 149 | + auth_time=timezone.now(), |
| 150 | + _scope="openid user profile", |
| 151 | + _id_token=json.dumps( |
| 152 | + asdict( |
| 153 | + IDToken("foo", "bar"), |
| 154 | + ) |
| 155 | + ), |
| 156 | + ) |
| 157 | + self.client.logout() |
| 158 | + self.assertEqual(AccessToken.objects.all().count(), 0) |
| 159 | + |
| 160 | + def test_revoke_session_delete(self): |
| 161 | + """Test revoke on logout""" |
| 162 | + session = AuthenticatedSession.objects.create( |
| 163 | + session=Session.objects.create( |
| 164 | + session_key=generate_id(), |
| 165 | + last_ip=ClientIPMiddleware.default_ip, |
| 166 | + ), |
| 167 | + user=self.user, |
| 168 | + ) |
| 169 | + AccessToken.objects.create( |
| 170 | + provider=self.provider, |
| 171 | + user=self.user, |
| 172 | + session=session, |
| 173 | + token=generate_id(), |
| 174 | + auth_time=timezone.now(), |
| 175 | + _scope="openid user profile", |
| 176 | + _id_token=json.dumps( |
| 177 | + asdict( |
| 178 | + IDToken("foo", "bar"), |
| 179 | + ) |
| 180 | + ), |
| 181 | + ) |
| 182 | + session.delete() |
| 183 | + self.assertEqual(AccessToken.objects.all().count(), 0) |
| 184 | + |
| 185 | + def test_revoke_user_deactivated(self): |
| 186 | + """Test revoke on logout""" |
| 187 | + AccessToken.objects.create( |
| 188 | + provider=self.provider, |
| 189 | + user=self.user, |
| 190 | + token=generate_id(), |
| 191 | + auth_time=timezone.now(), |
| 192 | + _scope="openid user profile", |
| 193 | + _id_token=json.dumps( |
| 194 | + asdict( |
| 195 | + IDToken("foo", "bar"), |
| 196 | + ) |
| 197 | + ), |
| 198 | + ) |
| 199 | + RefreshToken.objects.create( |
| 200 | + provider=self.provider, |
| 201 | + user=self.user, |
| 202 | + token=generate_id(), |
| 203 | + auth_time=timezone.now(), |
| 204 | + _scope="openid user profile", |
| 205 | + _id_token=json.dumps( |
| 206 | + asdict( |
| 207 | + IDToken("foo", "bar"), |
| 208 | + ) |
| 209 | + ), |
| 210 | + ) |
| 211 | + DeviceToken.objects.create( |
| 212 | + provider=self.provider, |
| 213 | + user=self.user, |
| 214 | + _scope="openid user profile", |
| 215 | + ) |
| 216 | + |
| 217 | + self.user.is_active = False |
| 218 | + self.user.save() |
| 219 | + |
| 220 | + self.assertEqual(AccessToken.objects.all().count(), 0) |
| 221 | + self.assertEqual(RefreshToken.objects.all().count(), 0) |
| 222 | + self.assertEqual(DeviceToken.objects.all().count(), 0) |
0 commit comments