You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter调用MS Graph遇InvalidAuthenticationToken错误:受众无效

解决Microsoft Graph调用InvalidAuthenticationToken(受众无效)问题

核心原因

你调用Graph时使用的Token是针对自定义API(api://-)生成的,而Graph要求Token的受众(aud字段)必须是https://graph.microsoft.com,两者不匹配导致验证失败。同时当前的Token存储逻辑会覆盖不同API的Token,进一步加剧了这个问题。

具体修复步骤

1. 区分不同API的Token存储

现在你用同一个currentUserToken存储两个不同实例的Token,会导致互相覆盖。需要给Graph和自定义API的Token分配独立的存储Key:

class User {
  // 替换原有存储Key,新增两个独立Key区分不同API的Token
  static const _graphTokenKey = 'graph_access_token';
  static const _a8ApiTokenKey = 'a8_api_access_token';
  static const _storage = FlutterSecureStorage();
  static User? _user;

  // ... 其他原有代码保持不变

  // 修改getUser方法,读取Graph专属Token
  static Future<User?> getUser() async {
    String? graphAccessToken = await _storage.read(key: _graphTokenKey);
    if (graphAccessToken != null) {
      Map<String, String> headers = {
        // 必须添加Bearer前缀,AAD返回的Token本身不包含该前缀
        "Authorization": "Bearer $graphAccessToken",
        "Content-Type": "application/json",
      };
      final http.Response response = await http.get(
          Uri.parse("https://graph.microsoft.com/v1.0/me"),
          headers: headers);

      // ... 后续错误处理和数据解析逻辑不变
    } else {
      return _user;
    }
  }

  // 新增存储Graph Token的方法
  static Future<void> updateGraphAccessToken(String newAccessToken) async {
    await _storage.write(key: _graphTokenKey, value: newAccessToken);
  }

  // 存储自定义API Token的方法(改名区分)
  static Future<void> updateA8ApiToken(String newAccessToken) async {
    await _storage.write(key: _a8ApiTokenKey, value: newAccessToken);
  }
}

2. 确保登录时存储对应Token

登录不同实例时,将Token存入对应的Key,避免混用:

// 登录并存储Graph专用Token
final graphLoginResult = await oauthHardwarehouse.login();
if (graphLoginResult.status == LoginStatus.loggedIn) {
  await User.updateGraphAccessToken(graphLoginResult.accessToken!);
}

// 登录并存储自定义API专用Token
final a8LoginResult = await oauthA8.login();
if (a8LoginResult.status == LoginStatus.loggedIn) {
  await User.updateA8ApiToken(a8LoginResult.accessToken!);
}

3. 验证Token正确性(可选)

用JWT解码工具解析Token,查看aud字段:

  • 若为https://graph.microsoft.com,说明是正确的Graph Token
  • 若为api://-,说明误用了自定义API的Token,需检查存储和读取逻辑

内容的提问来源于stack exchange,提问作者Razito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:53:45