如何在Xamarin Android的Azure MobileServiceClient中切换Google认证用户
这个问题我之前也碰到过,本质是Google认证的会话缓存(包括Azure客户端本地缓存和系统浏览器的登录会话)在搞鬼,给你几个靠谱的解决办法:
1. 先调用Azure客户端的登出方法清除本地缓存
首先,你需要先清除MobileServiceClient保存的当前用户认证信息,这样客户端就不会自动复用之前的登录状态。直接调用LogoutAsync方法就行:
await DataService.client.LogoutAsync();
调用这个方法后,再重新执行你的LoginAsync代码,大部分情况下会重新弹出登录界面。不过要注意:这个方法只清除Azure客户端本地的缓存,如果系统浏览器里还保存着Google的登录会话,可能还是会自动登录原来的账号,这时候就需要用下面的方法了。
2. 强制Google认证显示账号选择界面
在调用LoginAsync时,添加prompt=select_account的参数,让Google认证服务器强制显示账号选择界面,不管之前有没有登录会话。代码示例如下:
// 构造认证参数,强制让用户选择账号 var authParameters = new Dictionary<string, string> { { "prompt", "select_account" } }; // 带参数调用登录方法 var user = await DataService.client.LoginAsync(this, MobileServiceAuthenticationProvider.Google, "myapp", authParameters);
如果需要让用户重新授权(比如权限有变更),也可以把参数改成{ "prompt", "consent" },不过select_account更直接针对切换用户的场景。
3. 清除系统浏览器的缓存(极端情况)
如果上面的方法都不管用,可能是系统浏览器的Cookie缓存太顽固。这时候可以引导用户手动清除浏览器缓存,或者在你的应用里调用系统设置的相关功能(不过这个需要额外的权限,不太推荐)。一般来说,用方法2的参数就能解决大部分问题,这个作为兜底方案。
总结一下,最稳妥的流程是:先调用LogoutAsync清除客户端缓存,再带prompt=select_account参数调用LoginAsync,这样就能确保每次登录都让用户选择账号,完美实现切换用户的需求。
内容的提问来源于stack exchange,提问作者Jim Wilcox

