#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) Выберите Делегированное разрешение. И найдите все разрешения и нажмите на Добавить разрешение.
Для получения более подробной информации обратитесь к этому документу