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
相关产品推荐
相关产品推荐

