auth0 / node-auth0

Node.js client library for the Auth0 platform.
MIT License
628 stars 307 forks source link

Type of the field `provider` is mismatching in the `bodyParameters` for `link` method in user management apis #963

Open ghost opened 10 months ago

ghost commented 10 months ago

Checklist

Description

The field provider is defined as string in the interfaces UserIdentities and GetUsers200ResponseOneOfInnerIdentitiesInner. But for the method link in users section of the management api client, the optional field provider in the bodyParameters of type PostIdentitiesRequest is defined as PostIdentitiesRequestProviderEnum. Due to this, one can't simply extract identitites from a user profile and loop it to link as suggested in the documentation, Since it throws a type mismatch error for provider.

Reproduction

The scenario is finding every account with same email id and linking it together.

Additional context

No response

node-auth0 version

4.0.1

Node.js version

18

adamjmcgrath commented 10 months ago

Hi @misuvii - thanks for raising this

Due to this, one can't simply extract identitites from a user profile and loop it to link as suggested in the documentation, Since it throws a type mismatch error for provider.

Could you share the code that raises the error? (and a link to the documentation)

ghost commented 10 months ago

@adamjmcgrath This is the code that raises the error


  const mergeMetadataAndLinkUsersTask = async (
    secondary: GetUsers200ResponseOneOfInner,
    identity: GetUsers200ResponseOneOfInnerIdentitiesInner,
  ) => {
    // Include user & app metadata
    const mergedUserMetadata = merge({}, secondary.user_metadata, primary.user_metadata);
    const mergedAppMetadata = merge({}, secondary.app_metadata, primary.app_metadata);

    const updateUserTask = async () => {
      await client.users.update(
        { id: primary.user_id! },
        {
          user_metadata: mergedUserMetadata,
          app_metadata: mergedAppMetadata,
        },
      );
    };

    const linkUsersTask = async () => {
      await client.users.link(
        { id: primary.user_id! },
        {
          user_id: secondary.user_id!,
          provider: identity.provider, // Here identity.provider is a string, but the method expects it to be of type PostIdentitiesRequestProviderEnum
        },
      );
    };

    await Promise.all([updateUserTask(), linkUsersTask()]);
  };```
adamjmcgrath commented 10 months ago

Thanks for clarifying @misuvii - I've raised this with the team that owns those endpoints, will see if we can get this changed.

In the meantime, you can safely cast the identity.provider property as PostIdentitiesRequestProviderEnum

const linkUsersTask = async () => {
  await client.users.link(
    { id: primary.user_id! },
    {
      user_id: secondary.user_id!,
      provider: identity.provider as PostIdentitiesRequestProviderEnum,
    }
  );
};
cbeardsmore commented 8 months ago

Also hit this issue today, will use typecasting to bypass for now