Skip to content

Commit cb21293

Browse files
committed
fix: auth react tests
1 parent b869ee8 commit cb21293

File tree

2 files changed

+81
-7
lines changed
  • supertokens_python/recipe/session
  • tests/auth-react/fastapi-server

2 files changed

+81
-7
lines changed

supertokens_python/recipe/session/recipe.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
from supertokens_python.framework.response import BaseResponse
2020
from typing_extensions import Literal
2121

22+
from supertokens_python.utils import default_user_context
23+
2224
from .api import handle_refresh_api, handle_signout_api
2325
from .cookie_and_header import get_cors_allowed_headers
2426
from .exceptions import (
@@ -339,12 +341,14 @@ async def verify_session(
339341
],
340342
user_context: Dict[str, Any],
341343
):
344+
_ = user_context
345+
342346
return await self.api_implementation.verify_session(
343347
APIOptions(
344348
request, None, self.recipe_id, self.config, self.recipe_implementation
345349
),
346350
anti_csrf_check,
347351
session_required,
348352
override_global_claim_validators,
349-
user_context,
353+
user_context=default_user_context(request),
350354
)

tests/auth-react/fastapi-server/app.py

Lines changed: 76 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# under the License.
1414
import os
1515
import typing
16-
from typing import Any, Dict, List, Union, Optional
16+
from typing import Any, Dict, List, Optional, Union
1717

1818
import uvicorn # type: ignore
1919
from dotenv import load_dotenv
@@ -36,12 +36,13 @@
3636
from supertokens_python.framework.request import BaseRequest
3737
from supertokens_python.recipe import (
3838
emailpassword,
39+
emailverification,
3940
passwordless,
4041
session,
4142
thirdparty,
4243
thirdpartyemailpassword,
4344
thirdpartypasswordless,
44-
emailverification,
45+
userroles,
4546
)
4647
from supertokens_python.recipe.emailpassword import EmailPasswordRecipe
4748
from supertokens_python.recipe.emailpassword.interfaces import (
@@ -55,16 +56,21 @@
5556
InputFormField,
5657
User,
5758
)
58-
from supertokens_python.recipe.emailverification import EmailVerificationRecipe
59+
from supertokens_python.recipe.emailverification import (
60+
EmailVerificationClaim,
61+
EmailVerificationRecipe,
62+
)
5963
from supertokens_python.recipe.emailverification import (
6064
InputOverrideConfig as EVInputOverrideConfig,
6165
)
66+
from supertokens_python.recipe.emailverification.asyncio import unverify_email
6267
from supertokens_python.recipe.emailverification.interfaces import (
6368
APIInterface as EmailVerificationAPIInterface,
6469
)
6570
from supertokens_python.recipe.emailverification.interfaces import (
6671
APIOptions as EVAPIOptions,
6772
)
73+
from supertokens_python.recipe.emailverification.types import User as EVUser
6874
from supertokens_python.recipe.jwt import JWTRecipe
6975
from supertokens_python.recipe.passwordless import (
7076
ContactEmailOnlyConfig,
@@ -84,6 +90,7 @@
8490
APIInterface as SessionAPIInterface,
8591
)
8692
from supertokens_python.recipe.session.interfaces import APIOptions as SAPIOptions
93+
from supertokens_python.recipe.session.interfaces import SessionClaimValidator
8794
from supertokens_python.recipe.thirdparty import (
8895
Facebook,
8996
Github,
@@ -113,9 +120,17 @@
113120
from supertokens_python.recipe.thirdpartypasswordless.interfaces import (
114121
APIInterface as ThirdpartyPasswordlessAPIInterface,
115122
)
123+
from supertokens_python.recipe.userroles import (
124+
PermissionClaim,
125+
UserRoleClaim,
126+
UserRolesRecipe,
127+
)
128+
from supertokens_python.recipe.userroles.asyncio import (
129+
add_role_to_user,
130+
create_new_role_or_add_permissions,
131+
)
116132
from supertokens_python.types import GeneralErrorResponse
117133
from typing_extensions import Literal
118-
from supertokens_python.recipe.emailverification.types import User as EVUser
119134

120135
load_dotenv()
121136

@@ -275,12 +290,14 @@ def custom_init(
275290
None, Literal["USER_INPUT_CODE", "MAGIC_LINK", "USER_INPUT_CODE_AND_MAGIC_LINK"]
276291
] = None,
277292
):
293+
UserRolesRecipe.reset()
278294
PasswordlessRecipe.reset()
279295
ThirdPartyPasswordlessRecipe.reset()
280296
JWTRecipe.reset()
281297
EmailVerificationRecipe.reset()
282298
SessionRecipe.reset()
283299
ThirdPartyRecipe.reset()
300+
EmailVerificationRecipe.reset()
284301
EmailPasswordRecipe.reset()
285302
ThirdPartyEmailPasswordRecipe.reset()
286303
Supertokens.reset()
@@ -903,10 +920,11 @@ async def authorisation_url_get(
903920
)
904921

905922
recipe_list = [
923+
userroles.init(),
906924
session.init(override=session.InputOverrideConfig(apis=override_session_apis)),
907925
emailverification.init(
908926
mode="REQUIRED",
909-
create_and_send_custom_email=ev_create_and_send_custom_email, # TODO: Is this correct?
927+
create_and_send_custom_email=ev_create_and_send_custom_email,
910928
override=EVInputOverrideConfig(apis=override_email_verification_apis),
911929
),
912930
emailpassword.init(
@@ -988,7 +1006,7 @@ def test_get_device(request: Request):
9881006

9891007
@app.get("/test/featureFlags")
9901008
def test_feature_flags(request: Request):
991-
available = ["passwordless", "thirdpartypasswordless", "generalerror"]
1009+
available = ["passwordless", "thirdpartypasswordless", "generalerror", "userroles"]
9921010
return JSONResponse({"available": available})
9931011

9941012

@@ -1015,6 +1033,58 @@ async def get_token():
10151033
return JSONResponse({"latestURLWithToken": latest_url_with_token})
10161034

10171035

1036+
@app.get("/unverifyEmail")
1037+
async def unverify_email_api(session_: SessionContainer = Depends(verify_session())):
1038+
await unverify_email(session_.get_user_id())
1039+
await session_.fetch_and_set_claim(EmailVerificationClaim)
1040+
return JSONResponse({"status": "OK"})
1041+
1042+
1043+
@app.post("/setRole")
1044+
async def set_role_api(
1045+
request: Request, session_: SessionContainer = Depends(verify_session())
1046+
):
1047+
body = await request.json()
1048+
await create_new_role_or_add_permissions(body["role"], body["permissions"])
1049+
await add_role_to_user(session_.get_user_id(), body["role"])
1050+
await session_.fetch_and_set_claim(UserRoleClaim)
1051+
await session_.fetch_and_set_claim(PermissionClaim)
1052+
return JSONResponse({"status": "OK"})
1053+
1054+
1055+
async def override_global_claim_validators(
1056+
gv: List[SessionClaimValidator],
1057+
_session: SessionContainer,
1058+
user_context: Dict[str, Any],
1059+
):
1060+
validators = gv.copy()
1061+
req = user_context["_default"]["request"]
1062+
body = await req.json()
1063+
1064+
if body.get("role"):
1065+
info = body["role"]
1066+
validator = getattr(UserRoleClaim.validators, info["validator"])
1067+
validators.append(validator(*info["args"]))
1068+
1069+
if body.get("permission"):
1070+
info = body["permission"]
1071+
validator = getattr(PermissionClaim.validators, info["validator"])
1072+
validators.append(validator(*info["args"]))
1073+
1074+
return validators
1075+
1076+
1077+
@app.post("/checkRole")
1078+
async def check_role_api(
1079+
_: SessionContainer = Depends(
1080+
verify_session(
1081+
override_global_claim_validators=override_global_claim_validators
1082+
)
1083+
),
1084+
):
1085+
return JSONResponse({"status": "OK"})
1086+
1087+
10181088
@app.exception_handler(405) # type: ignore
10191089
def f_405(_, e): # type: ignore
10201090
return PlainTextResponse("", status_code=404)

0 commit comments

Comments
 (0)