Получить доступ в auth0

#javascript #reactjs #next.js #auth0

#javascript #reactjs #аутентификация #next.js #auth0

Вопрос:

Я использую auth0 и NextJS.

Я хочу сделать следующее: когда пользователь добавит свои учетные данные и войдет в систему, он перенаправляется на callback API.

И здесь

     import auth0 from '../../utils/auth0';

    export default async function callback(req, res) {
      try {
        await auth0.handleCallback(req, res, {
          redirectTo: '/'
        });
      } catch (error) {
        console.error(error);
        res.status(error.status || 400).end(error.message);
      }
    }
 

Я хочу перенаправить пользователя в зависимости от токена.
Декодируя токен, я получу данные, если приложение является простым пользователем или администратором.

Если он администратор, он должен быть перенаправлен на страницу администратора, если не на страницу пользователя.

Итак, я сделал что-то вроде этого:

     import auth0 from '../../utils/auth0';

    export default async function callback(req, res) {
       const tokenCache = auth0.tokenCache(req, res);
       const { accessToken } = await tokenCache.getAccessToken();
       console.log(accessToken) 
      try {
        await auth0.handleCallback(req, res, { redirectTo: '/' });
      } catch (error) {
        console.error(error);
        res.status(error.status || 400).end(error.message);
      }
    }

 

Итак, я хочу получить токен внутри этой функции, чтобы иметь возможность перенаправлять пользователей на разные страницы, но если я хочу получить токен здесь, я получаю проблему:

У пользователя нет действительного сеанса.

Если я удаляю код, связанный с токеном, пользователь перенаправляется, но мне нужно получить токен здесь, чтобы иметь возможность проверять пользователей.

Как я мог бы получить токен внутри этой callback функции и достичь того, что я описал выше?

Комментарии:

1. Вы проверили пример для auth0 из репозитория NextJS на GitHub? github.com/vercel/next.js/tree/canary/examples/auth0

Ответ №1:

Используя версию v1.2.0 библиотеки nextjs-auth0, вы можете получить доступ к токену идентификации во время обработчика обратного вызова.

 import { handleAuth, handleLogin, handleCallback } from '@auth0/nextjs-auth0';

const afterCallback = (req, res, session, state) => {
    console.log(session.idToken);
    if (!session.user.isAdmin) {
        throw new UnauthorizedError('User is not admin');
    }
    return session;
}

export default handleAuth({
    async callback(req, res) {
        try {
            await handleCallback(req, res, { afterCallback });
        } catch (error) {
            res.status(error.status || 500).end(error.message);
        }
    }
});
 

переменная сеанса afterCallback

Однако имейте в виду, что обычно вам не следует заглядывать внутрь токена доступа клиентским приложением. Если вам нужно передать информацию о пользователе клиенту, вы должны поместить ее в id_token . Токен доступа предназначен для использования API, и ваше клиентское приложение не должно зависеть от его формата содержимого или семантики, поскольку токены доступа по своей конструкции не имеют определенного формата.

Ответ №2:

 export default async function callback(
  req: NextApiRequest,
  res: NextApiResponse
) {
  try {
    await auth0.handleCallback(req, res, {
      async afterCallback(req, res, session, state) {
        return session;
      },
    });
  } catch (error) {
    res.status(error.status || 500).end(error.message);
  }
}