Неправильная аудитория для JWT с использованием ADAL.js

1

Я использую adal-angular library (но не с Angular) в своем SPA, чтобы попытаться получить токен доступа, который я могу использовать для вызова API-интерфейсов SharePoint (https://<my-tenant>.sharepoint.com/_api/).

Я зарегистрировал приложение в Azure AD и включил неявный поток в манифесте, и теперь я запускаю свой SPA локально, поэтому есть локальный URI локального хоста. При запуске выполняется следующий код:

const context = new AuthenticationContext({
    clientId: '<my-client-id>',
    redirectUri: 'http://localhost:3000/signin',
    popUp: true,
    loginResource: 'https://<my-tenant>.sharepoint.com',
    callback: () => window.location.reload()
});

const user = context.getCachedUser();
if (!user) {
    context.login();
} else {
    context.acquireToken('https://<my-tenant>.sharepoint.com', (error, token) => {
        console.log(error, token);
    });
}

Я уже зарегистрирован на сайте SharePoint, поэтому в этой конфигурации все происходит автоматически, и я вижу токен доступа JWT, зарегистрированный на консоли. Однако, когда я проверяю токен, я вижу, что аудитория - это <my-client-id>. Когда вы делаете вызов https://<my-tenant>.sharepoint.com/_api/v1.0/me используя токен доступа, я получаю ответ 401 со следующим сообщением об ошибке:

{"error_description": "Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown."}

Я уверен, что все это сводится к тому, что я не правильно понимаю поток OAuth2, но... как я могу получить токен, который SharePoint может фактически использовать с SharePoint? Думаю ли я об этом неправильно? Это своего рода поражение цели, если токен, полученный моим приложением, может использоваться только для аутентификации против моего собственного приложения.

  • 0
    Какие вызовы вы будете делать в API SharePoint? Рассматривали ли вы вместо этого использование Microsoft Graph (который имеет доступ к вашим ресурсам Sharepoint), и у него гораздо больше документации и примеров кода, показывающих, как вы можете его вызвать.
  • 0
    Хм, нет, я не учел это. Это, вероятно, будет делать то, что мне нужно. Но как насчет целевой аудитории, разве у меня не будет такой же проблемы с этим?
Показать ещё 3 комментария
Теги:
oauth-2.0
azure-active-directory
adal
adal.js

1 ответ

0

Получение токена доступа к SharePoint хорошо описано здесь:

Проверка подлинности OneDrive для бизнеса и вход в систему

Вы должны сначала рассмотреть маркер для конечной точки обнаружения:

Используя токен доступа, полученный для ресурса https://api.office.com/discovery/ вы можете сделать запрос API открытия, чтобы узнать, какие службы доступны

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

{
  "@odata.context": "https:\/\/api.office.com\/discovery\/v1.0\/me\/$metadata#allServices",
  "value": [
    {
      "@odata.type": "#Microsoft.DiscoveryServices.ServiceInfo",
      "capability": "MyFiles",
      "serviceApiVersion": "v2.0",
      "serviceEndpointUri": "https:\/\/contoso-my.sharepoint.com\/_api\/v2.0",
      "serviceResourceId": "https:\/\/contoso-my.sharepoint.com\/"
    }
  ]
}

Там вы должны получить свой действительный идентификатор ресурса... но проблема здесь может заключаться в том, что вы не включили форвард-ловушку (/) в конце URL-адреса ресурса в своем примере кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню