Android MSAL 8.1.0 如何排查登录卡住和 redirect URI 不匹配?
结论
先确保同一个构建变体的 applicationId、签名证书、MSAL 配置、Manifest 和 Azure 应用注册使用一致的值。错误信息指出,MSAL 根据当前应用的包名和签名生成的 redirect URI,与配置文件中的 URI 不一致。签名哈希已用 x 脱敏,错误信息中的 URI 也不是示例配置中的原样值,因此现有材料无法确认具体是哪项配置有误。
"broker_redirect_uri_registered": false 时,登录页输入邮箱后一直加载,这是另一个需要排查的现象。把该字段改为 true 无法修复 URI 不匹配。应分别确认 broker 配置和 redirect URI,再检查登录流程。
题目中可见的差异
报错中的包名是 com.hcsc.planethcsc.uat,所贴 Manifest 中的 android:host 则是 com.app.uat。如果这不是脱敏示例,两者就不一致。请先确认应用构建产物的 applicationId,再据此检查 MSAL 配置、Manifest 和 Azure 应用注册。
报错还列出了 MSAL 期望值和实际收到值,两者的签名哈希看起来也不同。哈希已脱敏,无法仅凭占位内容判断差异是由签名证书、编码方式还是构建变体配置不同造成的。
排查步骤
-
确认实际构建变体的包名。检查安装包对应的
applicationId,不要只看源代码目录中的包名。重点确认生产、非生产、模拟器和从 Company Portal 安装的包是否使用同一套配置。 -
核对签名证书。确认该构建变体最终使用的签名证书,并用它生成或核实 redirect URI 中的签名哈希。调试包、发布包和通过不同渠道安装的包可能使用不同签名;应以出现故障的实际安装包为准。
-
逐项比较 redirect URI。将 MSAL 配置中的
redirect_uri、Azure 应用注册中的 Android redirect URI、Manifest 中BrowserTabActivity的 intent filter,以及错误信息中的实际值放在一起对照。包名和签名哈希都应与当前构建变体相符。题目中的配置示例与报错包名不同,签名哈希也已遮盖。请用未脱敏的本地配置和完整错误信息在项目内核对,不要把占位符写回配置。
-
检查 Manifest 和配置文件是否属于同一应用变体。示例中的 intent filter 为:
<activity android:name="com.microsoft.identity.client.BrowserTabActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="com.app.uat" android:path="/xxxxx=" android:scheme="msauth" /> </intent-filter> </activity>这里的 host、path 和 scheme 应与当前变体使用的 redirect URI 对应。题目中的
com.app.uat和xxxxx是示例或脱敏值,无法用来验证实际配置。 -
分别检查两种 broker 设置下的流程。若
"broker_redirect_uri_registered": true,先解决错误明确报告的 URI 不匹配,再验证重定向能否返回应用。若设为false后输入邮箱持续加载,请记录登录时的完整 MSAL 异常或日志,并确认实际安装的包、认证配置和登录方式。现有信息不足以判断卡住的具体原因。
版本信息需要确认
问题标题提到 MSAL 8.1.0 和 MAM 12.0.3;正文中的旧版本信息是 MSAL 6.+、MAM 10.2.1,之后只提到将 SDK 升级到 8.1.0。请确认故障发生时实际打包的 MSAL 和 MAM 版本,以及升级的是哪个依赖,以免根据旧版本的配置或日志判断新构建的行为。
注意事项
排查时保留包名、签名哈希和构建变体之间的对应关系。不同签名生成的 redirect URI 不能混用。分享日志或配置前可以遮盖 client_id、租户标识和签名哈希,但请在本地对照完整值。
备注:内容仅供参考。
