Как мне исправить «Токен доступа от неправильной аудитории или ресурса».при попытке доступа к API REST Azure с помощью токена MSAL - PullRequest
1 голос
/ 26 июня 2019

Я создаю веб-приложение для узла, которое необходимо интегрировать с некоторыми службами Azure с помощью API-интерфейса REST Azure.Я использую библиотеку MSAL для входа в систему и получения токена доступа для отправки запросов в API Azure REST.Я могу успешно войти в систему и получить токен доступа.Однако когда я пытаюсь сделать запрос к API REST Azure, я получаю сообщение об ошибке 401, в котором говорится error="invalid_token", error_description="The access token is from wrong audience or resource."

Само веб-приложение построено с Node LTS и React v16.8.6.Он был развернут в Azure и зарегистрирован в активном каталоге.Я использую MSAL v1.0.1 для входа в систему пользователя и получения токена, когда пользователь попадает на страницу входа.

login.js

import React, { Component } from 'react';
import * as Msal from 'msal';

let msalConfig = {
  auth: {
    clientId: process.env.REACT_APP_CLIENT_ID,
    authority: `https://login.microsoftonline.com/process.env.REACT_APP_TENANT_ID'`,
    navigateToLoginRequestUrl: false,
    redirect_uri: 'http://localhost:3000/newEntry',
    resource: 'https://management.azure.com/'
  },
  cache: {
    cacheLocation: "localStorage",
    storeAuthStateInCookie: true
  }
};

var msalInstance = new Msal.UserAgentApplication(msalConfig);

var tokenRequest = {
  scopes: ['https://management.azure.com/']
}

class Login extends Component {
  constructor(props) {
    super(props);
    this.state = {
      response: null,
    };
  }

  componentWillMount() {
    // prevent login loop by checking for logged in user and then acquire a token if logged in
    if (!msalInstance.getAccount() && !msalInstance.isCallback(window.location.hash)) {
      this.login();
    } else {
      msalInstance.acquireTokenSilent(tokenRequest)
        .then(res => localStorage.setItem('access_token', res.accessToken))
        .catch(err => console.error(err))
    }
  }

  login = () => {  
    msalInstance.handleRedirectCallback((error, response) => {
      if (error) console.error(error);
      console.log(response);
    })
    msalInstance.loginRedirect(tokenRequest);
  }

  render() {
    return (
      <div>
        <h2>Login</h2>
      </div>
    )
  }
}

export default Login;

Я успешно возвращаю токен доступа ипоместив его в локальное хранилище.

На отдельной странице я получаю токен доступа MSAL из локального хранилища и использую его для отправки запроса на получение всех ресурсов, связанных с моей подпиской Azure.

  componentWillMount() {
    let token = localStorage.getItem('access_token');
    let url = 'https://management.azure.com/subscriptions/process.env.REACT_APP_SUBSCRIPTION_ID/resource?api-version=2018-02-14'

    fetch(url, {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${token}`
      }
    })
    .then(response => console.log(response))
    .catch(err => console.error(err));
  }

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

Я попытался изменить значение ресурса на 'resource': 'https://management.core.windows.net/' за Azure: токен доступа был получен от неправильной аудитории или ресурса , но это ничего не изменило.

Я также пытался использовать различные области, включая https://management.azure.com/user_impersonation и https://management.azure.com//user_impersonation следуя этому примеру Токен доступа не включает доступ для API с MSAL

Ответы [ 3 ]

0 голосов
/ 27 июня 2019

Вы используете msal, поэтому параметр resource не требуется в вашем msalConfig. Вы можете удалить его.

Измените области действия на scopes: ['https://management.azure.com/.default'].

0 голосов
/ 27 июня 2019

Итак, я переключился на библиотеку ADAL, чтобы посмотреть, получу ли я ту же ошибку, и я это сделал. Однако я понял, что URL-адрес запроса ресурса был неверным. api-version не была принятой версией. Как только я переключил его на 2018-02-01, запрос вернул 200.

0 голосов
/ 26 июня 2019

Метод get используется по умолчанию, и проблема может быть в 'Authorization': `Bearer ${token}`.Иногда люди используют разные правила, например 'Authorization': token или 'Token': `Bearer ${token}`.Я вижу некоторые API, использующие 'S-token': token.Попробуй это.Я думаю, это потому, что токен туда попал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...