Not able to return authResponse from auth0-js

Tags: , , ,



I’m trying to implement an login mechanize and not able to return a value from the callback function. I’m using this npm package: auth0-js. There’s two files in my setup. The first one is authService.js where I have my login logic:

import auth0 from "auth0-js";

function initializeAuth0Client(domain, redirectUri, clientID) {
  return new auth0.WebAuth({
    domain: "{YOUR_AUTH0_DOMAIN}",
    clientID: "{YOUR_AUTH0_CLIENT_ID}",
  });
}

function handleLogin(client, user) {
  return client.login(
    {
      realm,
      username,
      password,
    },
    (err, authResult) => {
      if (authResult) {
        return authResult;
      }
    }
  );
}

module.exports = {
  handleLogin,
  initializeAuth0Client,
};

The second one: index.js

import { handleLogin, initializeAuth0Client } from "authService";


const auth0Client = initializeAuth0Client(domain, redirectUri, clientID);
const authResponse = handleLogin(auth0Client, user);
console.log(authResponse) // undefined

I tried returning the value from the callback, as well as assigning the result to a local variable inside the function and returning that one, but none of those ways actually return the response. I saw this answer, but it didn’t help much.

Answer

In the following snippet, both lines will always try to run at the same time.

const authResponse = handleLogin(auth0Client, user);
console.log(authResponse) // undefined

console.log(authResponse) is not going to wait for handleLogin to finish and return authResult

authResult is only available inside of the callback

function handleLogin(client, user) {
  return client.login(
    {
      realm,
      username,
      password,
    },
    (err, authResult) => {
      if (authResult) {
        console.log(authResponse) // works!
        return authResult;
      }
    }
  );
}

If you want your code synchronously, or have handleLogin(auth0Client, user); resolve before having the rest of the code run, you can turn handleLogin into a function that returns a Promise that resolves with the authResponse. This will cause console.log(authResponse) to wait for handleLogin(auth0Client, user);.

function handleLogin(client, user) {
  return new Promise((resolve, reject) => {
    client.login(
      {
        realm,
        username,
        password,
      },
      (err, authResult) => {
        if (authResult) {
          resolve(authResult);
        }
      }
    }
  );
}
const auth0Client = initializeAuth0Client(domain, redirectUri, clientID);
const authResponse = await handleLogin(auth0Client, user);
console.log(authResponse) // works!

If you are doing this in Node, you have to make sure that you call this in an async function. Placing it inside a wrapper function should suffice

async function auth() {
  const auth0Client = initializeAuth0Client(domain, redirectUri, clientID);
  const authResponse = handleLogin(auth0Client, user);
  console.log(authResponse) // works!
}

auth()


Source: stackoverflow