Firebase Cloud Messaging V1 API认证报错及迁移方案咨询
FCM V1 API迁移问题及401认证错误情况
问题说明
猜测Firebase已对新用户禁用Legacy API,强制要求使用V1 API。使用Postman发送通知时收到如下401认证错误:
"error": { "code": 401, "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.", "status": "UNAUTHENTICATED" }
本人持有服务账号、Server Key等凭据,但不清楚如何完成API迁移。当前技术栈:dart-shelf作为后端,Flutter作为客户端,后端部署在Google Cloud Computing上。
Postman配置信息
- 授权设置:
Authorization = Bearer +AAAAA..token - 请求体内容:
{ "message":{ "token":"<generated token by flutter>", "notification":{ "body":"This is an FCM notification message!", "title":"FCM Message" } } }
Flutter端生成设备Token的代码
@override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { _init(); }); var initializationSettingsAndroid = const AndroidInitializationSettings('ic_launcher'); var initialzationSettingsAndroid = const AndroidInitializationSettings('@mipmap/ic_launcher'); var initializationSettings = InitializationSettings(android: initialzationSettingsAndroid); flutterLocalNotificationsPlugin.initialize(initializationSettings); FirebaseMessaging.onMessage.listen((RemoteMessage message) { RemoteNotification? notification = message.notification; AndroidNotification? android = message.notification?.android; if (notification != null && android != null) { flutterLocalNotificationsPlugin.show( notification.hashCode, notification.title, notification.body, NotificationDetails( android: AndroidNotificationDetails( channel.id, channel.name, color: Colors.blue, // TODO add a proper drawable resource to android, for now using // one that already exists in example app. icon: "@mipmap/ic_launcher", ), )); } }); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { RemoteNotification? notification = message.notification; AndroidNotification? android = message.notification?.android; if (notification != null && android != null) { showDialog( context: context, builder: (_) { return AlertDialog( title: Text(notification.title!), content: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [Text(notification.body!)], ), ), ); }); } }); getToken(); }
内容的提问来源于stack exchange,提问作者demonjoseph
相关产品推荐
相关产品推荐

