Приложение не получает токен доступа из кеша с использованием MSAL (реагировать на ошибки) - PullRequest
0 голосов
/ 17 января 2020

authProvider.getAccessToken () вызывает конечную точку аутентификации для каждого вызова API, а не извлекает ее из кэша.

Я не знаю, связана ли проблема с AcquireTokenSilent в Msal или getAccessToken в response-aad -msal.

Использование msal 1.2.1 и response-aad-msal 2.3.2

Network

Помощник вызова API:

import { config } from '../config';
import { authProvider } from './../authProvider';

export const callApi = async (method: 'GET' | 'POST' | 'PUT' | 'DELETE', path: string, data?: any) => {
  const token = await authProvider.getAccessToken();

  const res = await fetch(`${config.API_ENDPOINT}/api/${path}`, {
    method,
    headers: {
      Authorization: 'Bearer ' + token.accessToken,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(data),
  });

  return res.json();
};

Конфиг:

import { MsalAuthProvider, LoginType } from 'react-aad-msal';

// Msal Configurations
const config = {
  auth: {
    authority: 'https://login.microsoftonline.com/<my tenant id>',
    clientId: '<my client id>',
  },
  cache: {
    cacheLocation: 'localStorage',
    storeAuthStateInCookie: false,
  },
};

// Authentication Parameters
const authenticationParameters = {
  scopes: ['offline_access'],
};

// Options
const options = {
  loginType: LoginType.Redirect,
  tokenRefreshUri: window.location.origin + '/auth.html',
};

export const authProvider = new MsalAuthProvider(config, authenticationParameters, options);

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Я исправил проблему, удалив «offline_access» из областей, поскольку кажется, что он добавлен неявно, и добавление его вручную приводит к тому, что MSAL не находит кэшированный токен, поскольку области используются в качестве ключа.

У меня было чтобы добавить мои пользовательские области, в моем случае 'User.Read'

const authenticationParameters = {
  scopes: ['User.Read'],
};
0 голосов
/ 27 января 2020

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

const token = await authProvider.getAccessToken({
  scopes: ['offline_access']
});
...