【问题标题】:Authorization_RequestDenied , message : Insufficient privileges to complete the operationAuthorization_RequestDenied , message : 权限不足,无法完成操作
【发布时间】:2021-10-04 12:32:08
【问题描述】:

我正在尝试使用 microsoft graph api 从 microsoft azure 获取登录用户的数据, 我正在获取访问令牌并成功登录,

但我收到错误消息:“权限不足,无法完成操作。”

我的代码

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();
 }
}

错误:I/flutter (29743): {"error":{"code":"Authorization_RequestDenied","message":"权限不足,无法完成操作。","innerError":{"date":" 2021-10-04T10:28:54","re​​quest-id":"3b12c615-47f1-4d07-ab4e-b6f4907a5b11","client-request-id":"3b12c615-47f1-4d07-ab4e-b6f4907a5b11"}} }

【问题讨论】:

  • 您是否尝试通过手动添加身份验证标头来使用 Postman 运行此 get 请求?有用吗?
  • 是的,我试过了,但它在 Postman 错误中不起作用,显示为:“访问令牌验证失败。无效的受众。”
  • 尝试添加范围User.Read,然后重试。
  • 感谢 Danstan 成功了。

标签: flutter azure-active-directory microsoft-graph-api


【解决方案1】:

根据您的代码“https://graph.microsoft.com/v1.0/me”,您正在使用/me

调用/me 端点时需要登录用户,因此需要委派权限。使用/me端点时不支持应用权限,所以添加Delegated permission调用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) 选择委派权限。并搜索所有权限并点击添加权限

更多详情请参考document

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    相关资源
    最近更新 更多