Получить фото пользователя из Microsoft Azure

В шапке сайта у меня выводится информация (почта, имя) о пользователе (информация взята с их ажура майкрософта). Однако я также хотел бы добавить фотографию пользователя. Что бы я ни делал, я получаю ошибку

ПОЛУЧИТЬ https://graph.microsoft.com/v1.0/me/photo/$value 401 (Не авторизовано)

Uncaught (в обещании) AxiosError {сообщение: 'Ошибка запроса с кодом состояния 401', имя: 'AxiosError', код: 'ERR_BAD_REQUEST', конфигурация: {…}, запрос: XMLHttpRequest, …}

Просмотрел уже много ответов и советов по похожей теме, но ошибка не исчезает. Можете ли вы сказать мне, как я могу отобразить фотографию пользователя?

export default function UserPhoto() {
  const [imageUrl, setImageUrl] = useState(null)
  useEffect(() => {
    Axios.get('https://graph.microsoft.com/v1.0/me/photo/$value', {
      headers: { 'Authorization': `Bearer ${localStorage.getItem('access_token')}` },
      responseType: 'blob'
    }).then(o => {
      const url = window.URL || window.webkitURL;
      const blobUrl = url.createObjectURL(o.data);
      setImageUrl(blobUrl)
    })
  }, [])
  return (
    <div className = "App">
      {imageUrl && <img alt='my-user-avatar' src = {imageUrl} />}
    </div>
  );
}

Заголовок.jsx

export default function Header() {
    return (
        <div >
            <UserInformation />
            <UserPhoto/>
        </div>
    );
}

получение токена

import axios from "axios";
import jwt_decode from "jwt-decode";
import { config } from "../config";

const clientId = config.microsoftAuth.clientId;
const tenantId = config.microsoftAuth.tenantId;

const scope = 'https://graph.microsoft.com/User.Read offline_access';
const tokenRequestScope = `${clientId}/.default`;

Ошибка 401 означает, что есть проблема с разрешениями. Как вы получаете токен доступа? В остальном ваш код выглядит нормально.

Gaurav Mantri 07.06.2023 12:47

@GauravMantri Спасибо, что обратили внимание на мой вопрос. Не совсем понял ваш вопрос, так как не силен в теме токенов. Вот пример кода: const baseUrl = ${host}/${tenantId}/oauth2/v2.0; пусть tokensRequestUrl = ${baseUrl}/token?; const response = await axios.post(tokensRequestUrl, body, config);

Paul 07.06.2023 13:12

Я считаю, что проблема только с токеном. Пожалуйста, проверьте токен, используя что-то вроде jwt.io. Пожалуйста, проверьте области в расшифрованном токене.

Gaurav Mantri 07.06.2023 13:16

@GauravMantri Если я правильно вас понял, то проанализированный токен имеет следующий столбец: «scp»: «User.Read»

Paul 07.06.2023 13:23

Объем правильный. Какие разрешения Graph API назначаются приложению в Azure AD?

Gaurav Mantri 07.06.2023 14:03

@GauravMantri Я полагаю, вы говорите об offline_access? const scope = 'graph.microsoft.com/User.Read offline_access'

Paul 07.06.2023 15:15

Ага. Не могли бы вы отредактировать свой вопрос и включить полный код для получения токена? Я хочу видеть данные, отправленные в этом запросе.

Gaurav Mantri 07.06.2023 15:22

Проверить, не истек ли срок действия токена доступа?

Rukmini 08.06.2023 09:04

@Rukmini В коде есть проверка токена доступа с истекшим сроком действия, и если эта проверка не проходит, то токен доступа обновляется автоматически.

Paul 08.06.2023 09:07

Предоставляется ли согласие администратора для разрешений API?

Rukmini 08.06.2023 09:07

@Rukmini, где я могу это проверить (предоставлено ли согласие администратора для разрешений API?)

Paul 08.06.2023 09:08

Перейдите в Приложение Azure AD -> Разрешения API и проверьте это.

Rukmini 08.06.2023 09:10

@Rukmini Это займет некоторое время, я вернусь к вам с ответом позже.

Paul 08.06.2023 09:12

Конечно, дайте мне знать, если это сработает.

Rukmini 08.06.2023 09:13

@Rukmini Да, такое разрешение не было предоставлено. Я попросил исправить. Но я все еще получаю эту ошибку 401, просто немного другую: Не удалось загрузить ресурс: сервер ответил со статусом 401 (Неавторизованный)

Paul 08.06.2023 13:33

Давайте продолжим обсуждение в чате.

Rukmini 08.06.2023 13:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
16
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я создал приложение Azure AD SPA и предоставил разрешения API, как показано ниже:

Теперь я использовал следующую конечную точку для авторизации пользователей:

https://login.microsoftonline.com/TenantID/oauth2/v2.0/authorize?
client_id=ClientID
&response_type=code
&redirect_uri=https://jwt.ms
&response_mode=query
&scope=https://graph.microsoft.com/.default
&state=12345
&code_challenge=CodeChallenge
&code_challenge_method=S256

Код был сгенерирован, как показано ниже:

Теперь я сгенерировал токен доступа, используя поток PKCE через Postman, передав параметры, как показано ниже:

https://login.microsoftonline.com/TenantID/oauth2/v2.0/token

client_id:ClientID
scope:https://graph.microsoft.com/.default 
grant_type:authorization_code
code:code
code_verifier:S256
redirect_uri:https://jwt.ms

Когда я расшифровал токен доступа, scp выглядит как Directory.Read.All, User.Read, profile, openid, email, как показано ниже:

Я могу успешно получить фотографию профиля, как показано ниже:

GET https://graph.microsoft.com/v1.0/me/photo/$value

Ошибка 401Unauthorized обычно возникает, если для выполнения действия нет необходимых разрешений.

Чтобы устранить ошибку, проверьте следующее:

В вашем коде измените следующие изменения:

const scope = 'https://graph.microsoft.com/User.Read offline_access';
const tokenRequestScope = 'https://graph.microsoft.com/.default';
  • Убедитесь, что звук должен быть https://graph.microsoft.com
  • Убедитесь, что вы предоставили согласие администратора на разрешения API:

  • Как вы предоставили Directory.Read.All, User.Read разрешения API проверяют, отражается ли то же самое в параметре scp при декодировании токена.
  • Убедитесь, что срок действия токена доступа не истек, а процесс обновления токена доступа настроен правильно.

Ссылка:

Получить фото профиля - Microsoft Graph v1.0

Другие вопросы по теме

Как вы обновляете состояние значения массива в useState, таком как этот
Как я могу сделать копию значения и сохранить его в массиве?
Как сохранять и извлекать переменные состояния в хранилище сеансов с помощью React?
React-three-fiber внезапно требует ресурс, который приводит к сбою моего приложения. Проблема с безопасностью или что-то еще?
Тип '...' не может быть назначен типу '...' при использовании контекста
Функция updateDoc() вызвана с неверными данными. Вложенные массивы не поддерживаются (найдено в документе)
Необработанный отказ (TypeError): невозможно прочитать свойства неопределенного (чтение «протокола»)
Реагировать на родную навигацию Drawer работает только один раз
Ошибка типа: страница "..." имеет недопустимый экспорт "по умолчанию": тип "..." недействителен в Next.js
Не удается зарегистрировать пользователей в Firebase. ОШИБКА. Нарушение инварианта: `new NativeEventEmitter()` требует ненулевого аргумента., js engine: hermes