Skip to content
Esc
navigateopen⌘Jpreview
Dashboard
On this page

Add custom claims in tokens

Add custom claims to OAuth2 access and ID tokens using overrides

Overview

If you want to add custom properties in the token payloads you can do this by using overrides.


Add claims in the OAuth2 Access Token

Override the buildAccessTokenPayload function to include the custom claims.

Override the build_access_token_payload function to include the custom claims.

import OAuth2Provider from "supertokens-node/recipe/oauth2provider";

OAuth2Provider.init({
  override: {
    functions: (originalImplementation) => ({
      ...originalImplementation,
      buildAccessTokenPayload: async (input) => {
        const addedInfo: Record<string, any> = {};
        if (input.scopes.includes("profile")) {
          addedInfo.profile = "custom-value";
        }
        return {
          ...(await originalImplementation.buildAccessTokenPayload(input)),
          ...addedInfo,
        };
      },
    }),
  },
});
from supertokens_python import init, InputAppInfo, SupertokensConfig
from supertokens_python.recipe import oauth2provider
from supertokens_python.recipe.oauth2provider.oauth2_client import OAuth2Client
from supertokens_python.recipe.oauth2provider.interfaces import RecipeInterface
from supertokens_python.types import User
from typing import Dict, List, Any, Optional

def override_oauth2provider_functions(original_implementation: RecipeInterface):
  original_build_access_token_payload = original_implementation.build_access_token_payload

  async def build_access_token_payload(
        user: Optional[User],
        client: OAuth2Client,
        session_handle: Optional[str],
        scopes: List[str],
        user_context: Dict[str, Any],
    ) -> Dict[str, Any]:
    added_info = {}
    if "profile" in scopes:
        added_info['profile'] = "custom-value"

    original_payload = await original_build_access_token_payload(
      user, client, session_handle, scopes, user_context
    )
    return {**original_payload, **added_info}

  original_implementation.build_access_token_payload = build_access_token_payload
  return original_implementation


init(
    framework="...",
    app_info=InputAppInfo(
        app_name="...",
        api_domain="...",
        website_domain="...",
    ),
    supertokens_config=SupertokensConfig(
        connection_uri="...",
        api_key="..."
    ),
    recipe_list=[
        oauth2provider.init(
          override=oauth2provider.InputOverrideConfig(functions=override_oauth2provider_functions)
        )
    ],
)

Add claims in the ID Token

Override the buildIdTokenPayload function to include the custom claims.

Override the build_id_token_payload function to include the custom claims.

import OAuth2Provider from "supertokens-node/recipe/oauth2provider";

OAuth2Provider.init({
  override: {
    functions: (originalImplementation) => ({
      ...originalImplementation,
      buildIdTokenPayload: async (input) => {
        const addedInfo: Record<string, any> = {};
        if (input.scopes.includes("profile")) {
          addedInfo.profile = "custom-value";
        }
        return {
          ...(await originalImplementation.buildIdTokenPayload(input)),
          ...addedInfo,
        };
      },
    }),
  },
});
from supertokens_python import init, InputAppInfo, SupertokensConfig
from supertokens_python.recipe import oauth2provider
from supertokens_python.recipe.oauth2provider.oauth2_client import OAuth2Client
from supertokens_python.recipe.oauth2provider.interfaces import RecipeInterface
from supertokens_python.types import User
from typing import Dict, List, Any, Optional

def override_oauth2provider_functions(original_implementation: RecipeInterface):
  original_build_id_token_payload = original_implementation.build_id_token_payload

  async def build_id_token_payload(
        user: Optional[User],
        client: OAuth2Client,
        session_handle: Optional[str],
        scopes: List[str],
        user_context: Dict[str, Any],
    ) -> Dict[str, Any]:
    added_info = {}
    if "profile" in scopes:
        added_info['profile'] = "custom-value"

    original_payload = await original_build_id_token_payload(
      user, client, session_handle, scopes, user_context
    )
    return {**original_payload, **added_info}

  original_implementation.build_id_token_payload = build_id_token_payload
  return original_implementation


init(
    framework="...",
    app_info=InputAppInfo(
        app_name="...",
        api_domain="...",
        website_domain="...",
    ),
    supertokens_config=SupertokensConfig(
        connection_uri="...",
        api_key="..."
    ),
    recipe_list=[
        oauth2provider.init(
          override=oauth2provider.InputOverrideConfig(functions=override_oauth2provider_functions)
        )
    ],
)

API reference

API schema and response details