我有一个应用程序,使用flutter_web_auth 0.4.1包实现web身份验证。
当我在三星智能手机上测试我的实现时,一切都很顺利。Chrome浏览器在身份验证网站上启动,身份验证后,我回到我的应用程序中,视图像我需要的那样刷新。
但是当我在华为平板电脑上测试我的实现时,就在chrome发布后,我失去了连接。经过身份验证后,我回到了我的应用程序,但我可以看到应用程序正在重新加载(我可以看到闪屏),没有保存令牌,因为我总是回到登录屏幕。
这是我的实现:
认证函数(由一个ElevatedButton onPressed事件调用):
authenticate() async {
final result = await FlutterWebAuth.authenticate(
url: "https://xxxx.yyyy.eu/auth/login?authorize=yes",
callbackUrlScheme: "com.example.zzzzzzzz");
final token = Uri.parse(result).queryParameters['token'] ?? '';
// Save token
var prefs = await SharedPreferences.getInstance();
prefs.setString("token", token);
refreshAfterAuthentication();
}
AndroidManifest.xml:
<activity android:name="com.linusu.flutter_web_auth.CallbackActivity" >
<intent-filter android:label="flutter_web_auth">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="com.example.zzzzzzzz" />
</intent-filter>
</activity>
认证后的Web重定向(Angular应用):
window.location.href = 'com.example.zzzzzzzz://success?token=' + data.token;
由于我失去了连接,就在chrome启动后,我无法看到登录控制台关于什么是导致重定向到它后重新加载应用程序。
有没有别的方法来调试这种情况?
编辑:
智能手机运行Android 9,平板电脑运行Android 8。是否有可能在Android 8上无法实现web认证?
android manifest .xml中是否有Internet权限?
<uses-permission android:name="android.permission.INTERNET"/>
如果答案是肯定的,我认为你必须在你的请求中添加timeOut:
final result = await FlutterWebAuth.authenticate(
url: "https://xxxx.yyyy.eu/auth/login?authorize=yes",
callbackUrlScheme: "com.example.zzzzzzzz").timeout(
Duration(seconds: 5000),
);
我通过向AndroidManifest.xml
中的活动添加导出属性来解决此问题,如下所示:
AndroidManifest.xml:
<activity android:name="com.linusu.flutter_web_auth.CallbackActivity" android:exported="true">
<intent-filter android:label="flutter_web_auth">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="com.example.andidoor" />
</intent-filter>
</activity>
Android参考:https://developer.android.com/guide/topics/manifest/activity-element#exported