Customizing Error Handling
#
SuperTokens session recipie can throw the following errors:#
Unauthorised error- Thrown when a protected backend API is accessed without a session.
- The default bahaviour of this is to clear session cookies (if any) and send a 401 to the frontend.
- NodeJS
- GoLang
- Python
import SuperTokens from "supertokens-node";import Session from "supertokens-node/recipe/session";
SuperTokens.init({ supertokens: { connectionURI: "...", }, appInfo: { apiDomain: "...", appName: "...", websiteDomain: "..." }, recipeList: [ Session.init({ errorHandlers: { onUnauthorised: async (message, request, response) => { // TODO: Write your own logic and then send a 401 response to the frontend }, } }) ]});
import ( "net/http"
"github.com/supertokens/supertokens-golang/recipe/session" "github.com/supertokens/supertokens-golang/recipe/session/sessmodels" "github.com/supertokens/supertokens-golang/supertokens")
func main() { supertokens.Init(supertokens.TypeInput{ RecipeList: []supertokens.Recipe{ session.Init(&sessmodels.TypeInput{ ErrorHandlers: &sessmodels.ErrorHandlers{ OnUnauthorised: func(message string, req *http.Request, res http.ResponseWriter) error { // TODO: Write your own logic and then send a 401 response to the frontend return nil }, }, }), }, })}
from supertokens_python import init, InputAppInfofrom supertokens_python.recipe import sessionfrom supertokens_python.framework import BaseRequest, BaseResponse
async def unauthorised_callback(req: BaseRequest, err: str, response: BaseResponse): # TODO: Write your own logic and then send a 401 response to the frontend return response
init( app_info=InputAppInfo(api_domain="...", app_name="...", website_domain="..."), framework='...', recipe_list=[ session.init( error_handlers=session.InputErrorHandlers( on_unauthorised=unauthorised_callback ) ) ])
#
Invalid claim error- Thrown when a protected backend API is accessed with a session that doesn't pass the claim validators
- The default bahaviour of this is to send a 403 to the frontend with the errors includes in the body.
- NodeJS
- GoLang
- Python
import SuperTokens from "supertokens-node";import Session from "supertokens-node/recipe/session";
SuperTokens.init({ supertokens: { connectionURI: "...", }, appInfo: { apiDomain: "...", appName: "...", websiteDomain: "..." }, recipeList: [ Session.init({ errorHandlers: { onInvalidClaim: async (message, request, response) => { // TODO: Write your own logic and then send a 403 response to the frontend }, } }) ]});
import ( "net/http"
"github.com/supertokens/supertokens-golang/recipe/session" "github.com/supertokens/supertokens-golang/recipe/session/claims" "github.com/supertokens/supertokens-golang/recipe/session/sessmodels" "github.com/supertokens/supertokens-golang/supertokens")
func main() { supertokens.Init(supertokens.TypeInput{ RecipeList: []supertokens.Recipe{ session.Init(&sessmodels.TypeInput{ ErrorHandlers: &sessmodels.ErrorHandlers{ OnInvalidClaim: func(validationErrors []claims.ClaimValidationError, req *http.Request, res http.ResponseWriter) error { // TODO: Write your own logic and then send a 403 response to the frontend return nil }, }, }), }, })}
from supertokens_python import init, InputAppInfofrom supertokens_python.recipe import sessionfrom supertokens_python.recipe.session.exceptions import ClaimValidationErrorfrom supertokens_python.framework import BaseRequest, BaseResponsefrom typing import List
async def invalid_claim_callback(req: BaseRequest, invalid_claims: List[ClaimValidationError], response: BaseResponse): # TODO: Write your own logic and then send a 403 response to the frontend return response
init( app_info=InputAppInfo( api_domain="...", app_name="...", website_domain="..."), framework='...', recipe_list=[ session.init( error_handlers=session.InputErrorHandlers( on_invalid_claim=invalid_claim_callback ) ) ])
#
Token theft detected- Thrown when a session hijacking attempt has been detected.
- We detect this using rotating refresh tokens.
- The default behaviour of this is to revoke the session and send a
401
to the frontend.
- NodeJS
- GoLang
- Python
import SuperTokens from "supertokens-node";import Session from "supertokens-node/recipe/session";
SuperTokens.init({ supertokens: { connectionURI: "...", }, appInfo: { apiDomain: "...", appName: "...", websiteDomain: "..." }, recipeList: [ Session.init({ errorHandlers: { onTokenTheftDetected: async (sessionHandle, userId, req, res) => { // TODO: Write your own logic and then send a 401 response to the frontend }, } }) ]});
import ( "net/http"
"github.com/supertokens/supertokens-golang/recipe/session" "github.com/supertokens/supertokens-golang/recipe/session/sessmodels" "github.com/supertokens/supertokens-golang/supertokens")
func main() { supertokens.Init(supertokens.TypeInput{ RecipeList: []supertokens.Recipe{ session.Init(&sessmodels.TypeInput{ ErrorHandlers: &sessmodels.ErrorHandlers{ OnTokenTheftDetected: func(sessionHandle, userID string, req *http.Request, res http.ResponseWriter) error { // TODO: Write your own logic and then send a 401 response to the frontend return nil }, }, }), }, })}
from supertokens_python import init, InputAppInfofrom supertokens_python.recipe import sessionfrom supertokens_python.framework import BaseRequest, BaseResponse
async def token_theft_detected_callback(req: BaseRequest, session_handle: str, user_id: str, response: BaseResponse): # TODO: Write your own logic and then send a 401 response to the frontend return response
init( app_info=InputAppInfo(api_domain="...", app_name="...", website_domain="..."), framework='...', recipe_list=[ session.init( error_handlers=session.InputErrorHandlers( on_token_theft_detected=token_theft_detected_callback ) ) ])