@@ -210,6 +210,72 @@ def test_no_match(self):
210
210
self .auth .authenticate (request )
211
211
212
212
213
+ @control_silo_test
214
+ class TestOrgScopedAppTokenAuthentication (TestCase ):
215
+ def setUp (self ):
216
+ super ().setUp ()
217
+
218
+ self .auth = UserAuthTokenAuthentication ()
219
+ self .org = self .create_organization (owner = self .user )
220
+ self .another_org = self .create_organization (owner = self .user )
221
+ self .api_token = ApiToken .objects .create (
222
+ token_type = AuthTokenType .USER ,
223
+ user = self .user ,
224
+ scoping_organization_id = self .org .id ,
225
+ )
226
+ self .token = self .api_token .plaintext_token
227
+
228
+ def test_authenticate_correct_org (self ):
229
+ request = HttpRequest ()
230
+ request .META ["HTTP_AUTHORIZATION" ] = f"Bearer { self .token } "
231
+ request .path_info = f"/api/0/organizations/{ self .org .slug } /projects/"
232
+
233
+ result = self .auth .authenticate (request )
234
+ assert result is not None
235
+
236
+ user , auth = result
237
+ assert user .is_anonymous is False
238
+ assert user .id == self .user .id
239
+ assert AuthenticatedToken .from_token (auth ) == AuthenticatedToken .from_token (self .api_token )
240
+
241
+ def test_authenticate_incorrect_org (self ):
242
+ request = HttpRequest ()
243
+ request .META ["HTTP_AUTHORIZATION" ] = f"Bearer { self .token } "
244
+ request .path_info = f"/api/0/organizations/{ self .another_org } /projects/"
245
+
246
+ with pytest .raises (AuthenticationFailed ):
247
+ self .auth .authenticate (request )
248
+
249
+ def test_authenticate_user_level_endpoints (self ):
250
+ request = HttpRequest ()
251
+ request .META ["HTTP_AUTHORIZATION" ] = f"Bearer { self .token } "
252
+ request .path_info = "/api/0/projects/"
253
+
254
+ with pytest .raises (AuthenticationFailed ):
255
+ self .auth .authenticate (request )
256
+
257
+ def test_authenticate_allowlist_endpoint (self ):
258
+ request = HttpRequest ()
259
+ request .META ["HTTP_AUTHORIZATION" ] = f"Bearer { self .token } "
260
+ request .path_info = "/api/0/organizations/"
261
+
262
+ result = self .auth .authenticate (request )
263
+ assert result is not None
264
+
265
+ user , auth = result
266
+ assert user .is_anonymous is False
267
+ assert user .id == self .user .id
268
+ assert AuthenticatedToken .from_token (auth ) == AuthenticatedToken .from_token (self .api_token )
269
+
270
+ def test_no_match (self ):
271
+ request = HttpRequest ()
272
+ request .META ["HTTP_AUTHORIZATION" ] = "Bearer abc"
273
+ request .path_info = f"/api/0/organizations/{ self .another_org } /projects/"
274
+
275
+ with pytest .raises (AuthenticationFailed ):
276
+ self .auth .authenticate (request )
277
+
278
+
213
279
@django_db_all
214
280
@pytest .mark .parametrize ("internal" , [True , False ])
215
281
def test_registered_relay (internal ):
0 commit comments