Flutter firebase_auth使用OAuthProvider实现LINE登录关联匿名用户报错如何解决
我将刚在firebase_auth的GitHub仓库提交的问题同步到此处,方便各位开发者帮忙定位问题原因:
我尝试将身份标识token(identity token)和/或访问令牌(access token)传入OAuthProvider().credential()方法,目的是将使用LINE登录的用户与应用启动时创建的匿名用户进行关联,但是收到如下报错:
flutter: [firebase_auth/internal-error] An internal error has occurred, print and inspect the error details for more information. flutter: Error code: internal-error
复现步骤
我暂时无法提供完整的复现步骤,因为复现该问题需要使用pub.dev上的flutter_line_sdk包获取LINE用户的access/id token用于身份验证,相关流程较长且涉及私密/机密信息。不过下方的示例代码可以辅助排查问题。
预期行为
我期望如下代码可以像「通过Apple登录」一样返回OAuthCredential对象,之后我可以将其传入下方的方法完成用户关联:
oAuthCredential = OAuthProvider("line.com").credential( idToken: myLineUserIdToken # 可单独传或同时传两个参数 accessToken: myLineUserAccessToken, );
userCredential = await _user.linkWithCredential(oAuthCredential);
示例代码
下方代码中的_user变量是应用启动时创建的当前已登录匿名用户的引用。
final loginResult = await line.login(scopes: [ "profile", "openid", "email", ]); UserCredential userCredential; final verificationResult = await line.verifyAccessToken(); if (verificationResult.data != null) { final idToken = loginResult.accessToken.idToken; final idTokenRaw = loginResult.accessToken.idTokenRaw; OAuthCredential oAuthCredential; try { print('===== ID TOKEN (RAW) ====='); print(idTokenRaw); print('===== ACCESS TOKEN ====='); print(loginResult.accessToken.data["access_token"]); print('===== _user IS ANONYMOUS ====='); print(_user.isAnonymous); oAuthCredential = OAuthProvider("line.com").credential( idToken: loginResult.accessToken.idTokenRaw, accessToken: loginResult.accessToken.data["access_token"]); userCredential = await _user.linkWithCredential(oAuthCredential); } on FirebaseAuthException catch (e, s) { print('Error linking LINE cred to anonymous credential:'); print('\n$e\nstack:$s'); print('Error code: ${e.code}'); } }
代码输出如下:
flutter: ===== ID TOKEN (RAW) ===== flutter: my.LineAuthIdToken.jwt flutter: ===== ACCESS TOKEN ===== flutter: my.LineAuthAccessToken.jwt flutter: ===== _user IS ANONYMOUS ===== flutter: true flutter: [firebase_auth/internal-error] An internal error has occurred, print and inspect the error details for more information. stack:#0 MethodChannelUser.linkWithCredential package:firebase_auth_platform_interface/…/method_channel/method_channel_user.dart:98 <asynchronous suspension> #1 User.linkWithCredential package:firebase_auth/src/user.dart:185 <asynchronous suspension> #2 LineAuthService.signInWithLine package:wordbud/auth/line_auth_service.dart:94 (^该行对应上方代码中`userCredential = await _user.linkWithCredential(oAuthCredential);`的位置^) <asynchronous suspension> #3 _LoginState._buildLineButton.<anonymous closure> package:wordbud/…/onboarding/login.dart:268 <asynchronous suspension> flutter: Error code: internal-error
额外说明
我确认我尝试使用的access token和id token都是有效的(我试过单独传其中一个参数、同时传两个参数都没有成功),因为我已经成功使用这两个令牌在Firebase云函数中生成自定义token并完成用户登录。但是这种方式无法将新登录的LINE用户与之前的匿名用户关联,也就无法获取该匿名用户关联的Firestore数据。
OAuthProvider类的官方文档说明如下:
这是一个通用的提供方实例。
该类可被其他基于OAuth的提供方继承,也可单独用于与第三方提供方集成。
在我看来这个类就是为我这类场景设计的,使用flutter_line_sdk的身份验证流程和Apple登录没有本质区别,也提供了OAuth流程所需的全部令牌。
Flutter doctor输出
flutter doctor执行结果:
Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 2.5.3, on macOS 11.6 20G165 darwin-x64, locale en) [✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0) [✓] Xcode - develop for iOS and macOS [✓] Chrome - develop for the web [✓] Android Studio (version 2020.3) [✓] VS Code (version 1.62.3) [✓] Connected device (4 available) ! Error: iPhone 13 Pro Max is busy: Fetching debug symbols for iPhone 13 Pro Max. Xcode will continue when iPhone 13 Pro Max is finished. (code -10) • No issues found!
Flutter依赖信息
flutter pub deps -- --style=compact相关输出如下(我团队的应用规模较大且涉及机密信息,因此仅粘贴当前代码文件中引入的相关包):
(我团队的应用规模较大且涉及机密,因此仅粘贴当前代码文件引用的相关包) Dart SDK 2.14.4 Flutter SDK 2.5.3 dependencies: - flutter_line_sdk 2.1.0 [flutter] - firebase_auth 3.2.0 [firebase_auth_platform_interface firebase_auth_web firebase_core firebase_core_platform_interface flutter meta] - firebase_core 1.10.0 [firebase_core_platform_interface firebase_core_web flutter meta] - cloud_firestore 3.1.0 [cloud_firestore_platform_interface cloud_firestore_web collection firebase_core firebase_core_platform_interface flutter meta]
内容的提问来源于stack exchange,提问作者Tristan Bennett

