Authorization Extention Migration from Rules to Actions

In case helpful for others, here is how I re-wrote my Auth0 Authorization Extension Rule => Action. I didn’t need some of the generic merging + IDP handling, I just needed my authorization groups, roles, and permissions attached to my user in the JWT (I also didn’t want to update user metadata because that would require updating my front-end apps).

This requires the following:

  • Set AUTHORIZATION_EXTENSION_API_KEY in secrets
  • Add axios to dependencies
exports.onExecutePostLogin = async (event, api) => {
  const userID = event.user.user_id;
  const email = event.user.email;
  const connectionName = event.connection.name;
  const clientID = event.client.client_id;
  const authorizationExtensionApiKey = event.secrets.AUTHORIZATION_EXTENSION_API_KEY;

  console.log(`Getting authorization data for ${email} (${userID})...`)
  const authorizationData = await getAuthorizationData(userID, connectionName, clientID, authorizationExtensionApiKey);
  if (authorizationData === null) {
    return;
  }
  console.log(`...obtained authorization data: ${JSON.stringify(authorizationData)}`);

  // Setting groups, roles, and permissions from auth0 authorization extension in user token
  api.idToken.setCustomClaim("groups", authorizationData.groups);
  api.idToken.setCustomClaim("roles", authorizationData.roles);
  api.idToken.setCustomClaim("permissions", authorizationData.permissions);
  console.log("Set groups, roles, and permissions in id token");
};

async function getAuthorizationData(userID, connectionName, clientID, authorizationExtensionApiKey) {
  try {
    const url = `${EXTENSION_URL}/api/users/${userID}/policy/${clientID}`;
    const postData = { connectionName }
    const headers = {
      "x-api-key": authorizationExtensionApiKey,
    }
    const response = await axios.post(url, postData, { headers });
    return response.data;
  } catch (error) {
    console.error(`Error getting authorization data for ${userID}`, error);
    return null;
  }
}
1 Like