Why does my Auth0 API call give a 403 error when trying to delete a user?

Viewed 275

I'm trying to integrate Auth0.com, and I've written a function that should unlink an identity and then delete it.

The unlinking works, but I keep getting a 403 error when trying to delete the unlinked identity.

The Auth0 API docs (https://auth0.com/docs/api/management/v2#!/Users/delete_users_by_id) say a 403 error is due to either rate limits, insufficient scopes, or user not matching the bearer token.

I think I added the correct scopes to the auth0 client, I'm very sure I'm not hitting rate limits, so it must be the mismatching bearer token.

But I don't understand how that could be?

Can you take a look at what I have and tell me what's gone wrong?

P.S. In case it matters, I'm using auth0-spa.js not the standard auth0.js. More info here.

This is the code I'm working with:

function(properties, context) {

    // Load any data
    const domain = context.keys.auth0_domain;
    const client_id = context.keys.auth0_client_id;
    const connection = properties.connection;
    const auth0_user_id = properties.auth0_user_id;

    //Do the operation

    const auth0 = new Auth0Client({
        domain: domain,
        client_id: client_id,
        audience: `https://${domain}/api/v2/`,
        scope: "openid email profile read:current_user update:current_user_identities delete:users delete:current_user",
    });

    const auth0_user_obj = {
        id: auth0_user_id
    };

    const getUserProfile = async (userId) => {
        const token = await auth0.getTokenSilently();
        const response = await fetch(
            `https://${domain}/api/v2/users/${userId}`, {
                headers: {
                    Authorization: `Bearer ${token}`,
                },
            }
        );
        return await response.json();
    };

    const getSecondaryIdentity = async () => {
        const auth0user = await getUserProfile(auth0_user_id);
        const secondary_identity = auth0user.identities.find(i => i.connection === connection);
        return secondary_identity;
    }

    const unlinkDeleteAccount = async () => {
        const secondaryIdentityObj = await getSecondaryIdentity();
        const {
            provider,
            user_id
        } = secondaryIdentityObj;
        const accessToken = await auth0.getTokenSilently();
        const {
            sub
        } = await auth0.getUser();
        await fetch(
            `https://${domain}/api/v2/users/${sub}/identities/${provider}/${user_id}`, {
                method: "DELETE",
                headers: {
                    Authorization: `Bearer ${accessToken}`,
                },
            }
        );
        const secondUserId = provider + '|' + user_id;
        await fetch(
            `https://${domain}/api/v2/users/${secondUserId}`, {
                method: "DELETE",
                headers: {
                    Authorization: `Bearer ${accessToken}`,
                },
            }
        );
    };

    unlinkDeleteAccount();

}
0 Answers
Related