Я создаю веб-приложение для узла, которое необходимо интегрировать с некоторыми службами 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