You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:15:05