«Недопустимая аудитория» из запроса обратного вызова поставщика Microsoft Strapi в приложении Angular

#angular #azure #azure-active-directory #strapi

#angular #azure #azure-active-directory #strapi

Вопрос:

Я пытаюсь настроить аутентификацию с использованием Microsoft в приложении Angular. Я могу успешно пройти аутентификацию в приложении. Когда я отправляю токен, который я получаю http://localhost:1337/auth/microsoft/callback?access_token=${token} , я получаю ответ, в котором говорится: «Ошибка проверки токена доступа. Недопустимая аудитория.’ Я проверил токен, который я отправляю в jwt.io и аудитория соответствует идентификатору клиента, настроенному в конфигурации администратора Strapi для поставщика Microsoft. Я пропустил шаг?

Мой запрос выглядит следующим образом и запускается после завершения аутентификации и установки токена.

let token = window.localStorage.getItem('msal.idtoken') this.http.get(http://localhost:1337/auth/microsoft/callback?access_token=${token}`) .subscribe((res) => { console.log(res); });

Редактировать:

Расшифрован токен: введите описание изображения здесь

Регистрация приложения Azure:

введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

Конфигурация Strapi:

введите описание изображения здесь

Редактировать:

Не понял, что токен доступа был отделен от idToken. После того, как я покопался во вкладке «Сеть», я нашел фактическую и опубликовал ниже. Вызов этого api в Strapi возвращает действительный токен. Похоже, что это работает. Но я не знаю, как программно извлечь этот токен во внешнем интерфейсе, поскольку он вызывается как URI перенаправления. Существует ли общая стратегия для захвата его из URL-адреса, прежде чем он исчезнет, для сохранения в хранилище?

Accesstoken:

введите описание изображения здесь

Разрешения:

введите описание изображения здесь

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

1. Покажите разрешение, настроенное вами в приложении Azure AD, и скриншот декодированного токена доступа в jwt.io .

2. Я обновил сообщение скриншотами

3. Предоставленный вами снимок экрана предназначен для токена ID, а не для токена доступа. Пожалуйста, проверьте это. Мне нужен декодированный результат для токена доступа. Кроме того, мне также нужен снимок экрана с разрешениями, которые вы настроили в приложении Azure AD. Вы должны найти его в разрешениях API в вашем приложении для регистрации приложений.

4. Спасибо, я добавил дополнительную информацию. Фактический токен доступа работает, но я не уверен, как его получить, потому что он быстро перенаправляет с этой страницы. Есть идеи?

5. Привет, вы все еще ищете помощь по этой проблеме? Решает ли ответ вашу проблему?

Ответ №1:

В вашем коде я обнаружил, что вы получаете токен id и используете его для доступа к своему api, как вы упомянули, это вызовет сбой токена доступа. Недопустимая аудитория.’ ошибка.Вы должны использовать токен доступа для доступа к вашему api.

Что касается вашего вопроса, хотите ли вы программно получить токен доступа?Если это так, вы можете обратиться к этому.

Код обычно выглядит следующим образом:

 getToken() {
        const accessTokenRequest = {
             scopes: [
                 "your api url",
             ],
            clientId: "xxxxxxxxxxxxxxxx",
            authority: "https://login.microsoftonline.com/(tenant)ID or tenant name",
            redirectUri: "http://localhost:4200",
        };
        this.authService
            .acquireTokenSilent(accessTokenRequest)
            .then((res) => {
                console.log("acquireTokenPopup");
                this.token = res.accessToken;
                this.getUser();
            })
            .catch((e) => {
                console.log("acquireTokenPopup catch");
                console.log(e);
            });
    }
  

И если вы просто хотите сохранить токен доступа:

Чтобы сохранить строку в локальном хранилище, вы используете

 window.localStorage.setItem(key, value);
  

Вы можете получить значение позже с помощью:

 window.localStorage.getItem(key);
  

окно.localStorage.setItem(‘access_token’,token);
окно.localStorage.getItem(‘access_token’);

надеюсь, это вам поможет.