Authorization_RequestDenied , сообщение : Недостаточно прав для завершения операции

#flutter #azure-active-directory #microsoft-graph-api

Вопрос:

Я пытаюсь получить данные пользователя, вошедшего в систему, из microsoft azure с помощью API microsoft graph, я получаю маркер доступа, а также успешно вошел в систему,

но я получаю сообщение об ошибке : «Недостаточно привилегий для завершения операции».

Мой Код

 import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:aad_oauth/aad_oauth.dart';
import 'package:aad_oauth/model/config.dart';
import 'package:exim_bank_leave_app/Utils/AppTheme.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'Screens/Listing.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

   @override
     Widget build(BuildContext context) {
     return MaterialApp(
     debugShowCheckedModeBanner: false,
     theme: MyTheme.darkTheme(context),
     home: MyHomePage(),
      );
   }
  }

class MyHomePage extends StatefulWidget {
  static var user;
  static final Config config = Config(
  tenant: 'f6------------------38',
  clientId: 'cba-----------------f5',
  scope: 'openid profile offline_access',
  redirectUri: 'https://login.microsoftonline.com/common/oauth2/nativeclient',
  ); 

  static final AadOAuth oauth = AadOAuth(config);
 @override
  _MyHomePageState createState() => _MyHomePageState();
   }

class _MyHomePageState extends State<MyHomePage> {
 SharedPreferences prefs;
 static final String accessToken = accessToken;
 var token;

  @override
  void initState() {
  super.initState();
  loadData();
  }

   @override
   Widget build(BuildContext context) {
  // adjust window size for browser login
  var screenSize = MediaQuery.of(context).size;
  var rectSize =
    Rect.fromLTWH(0.0, 25.0, screenSize.width, screenSize.height - 25);
  MyHomePage.oauth.setWebViewScreenSize(rectSize);

    return Scaffold(
    body: Container(),
    );
  }

 loadData() async {
 var auth = MyHomePage.oauth;
await auth.login();
var accessToken = await auth.getAccessToken();

Navigator.pushReplacement(
    context, MaterialPageRoute(builder: (context) => Listing()));

prefs = await SharedPreferences.getInstance();
while (prefs == null || accessToken == null) continue;
final String idToken = await auth.getIdToken();

setState(() {
  prefs.setString('token', idToken);
 });

 print('Token $accessToken');
 final graphResponse = await http.get('https://graph.microsoft.com/v1.0/me',
    headers: {HttpHeaders.authorizationHeader: "Bearer $accessToken"});
 print(graphResponse.body.toString());
 print(graphResponse.statusCode);
}

 static void logout() async {
 await MyHomePage.oauth.logout();
 }
}
 

Ошибка : Ввод-вывод (29743): {«ошибка»:{«код»:»Авторизация_requestdenied»,»сообщение»:»Недостаточно прав для завершения operation.»,»innerError»:{«date»:»2021-10-04T10:28:54″,»request-id»:»3b12c615-47f1-4d07-ab4e-b6f4907a5b11″,»client-request-id»:»3b12c615-47f1-4d07-ab4e-b6f4907a5b11″}}}

Комментарии:

1. Вы пробовали выполнить этот get запрос с почтальоном, добавив заголовок auth вручную? Это работает?

2. Да, я пытался, но это не сработало в ошибке почтальона, показывающей следующее :» Ошибка проверки маркера доступа. Инвалидная аудитория».

3. Попробуйте добавить область User.Read действия и повторите попытку.

4. Спасибо, Данстан, это сработало.

Ответ №1:

На основе вашего кода « https://graph.microsoft.com/v1.0/me вы используете /me

При вызове /me конечной точки требуется пользователь, вошедший в систему, и, следовательно, делегированное разрешение. Разрешения приложений не поддерживаются при использовании /me конечной точки .Поэтому добавьте делегированное разрешение на вызов ApI

Делегированные разрешения являются

 User.Read, 
User.ReadWrite, 
User.ReadBasic.All, 
User.Read.All,
User.ReadWrite.All, 
Directory.Read.All, 
Directory.ReadWrite.All,
Directory.AccessAsUser.All
 

Чтобы добавить разрешение

1) На странице разрешений API приложения выберите Добавить разрешение.

введите описание изображения здесь

2) выберите Microsoft Graph.

введите описание изображения здесь

3) Выберите Делегированное разрешение. И найдите все разрешения и нажмите на Добавить разрешение.

введите описание изображения здесь

Для получения более подробной информации обратитесь к этому документу