From 8b1c9da2d922c0417d938ff411f453f9cb082734 Mon Sep 17 00:00:00 2001 From: fdp <1286779656@qq.com> Date: Fri, 28 Mar 2025 13:44:19 +0800 Subject: [PATCH] =?UTF-8?q?facebook=E7=99=BB=E5=BD=95=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Runner/Info.plist | 4 + .../login/controllers/facebookLogin.dart | 106 ++++++++++++++---- 2 files changed, 88 insertions(+), 22 deletions(-) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 560e6c858..b44af52ee 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -5,6 +5,8 @@ CFBundleURLTypes + CFBundleURLName + com.yunqiinnovation.deepsound CFBundleURLSchemes fb3829022037361855 @@ -38,6 +40,8 @@ DeepSound CFBundleExecutable $(EXECUTABLE_NAME) +NSUserTrackingUsageDescription + This application needs to access your tracking data in order to offer better personalized services and advertisements CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion diff --git a/lib/modules/login/controllers/facebookLogin.dart b/lib/modules/login/controllers/facebookLogin.dart index d73cc7f87..61e17a4a8 100644 --- a/lib/modules/login/controllers/facebookLogin.dart +++ b/lib/modules/login/controllers/facebookLogin.dart @@ -1,6 +1,13 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:math'; + import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; import 'package:get/get.dart'; +import 'package:crypto/crypto.dart'; class Facebook { String token = ''; @@ -9,35 +16,90 @@ class Facebook { String email = ''; String pictureurl = ''; String id = ''; + String generateNonce([int length = 32]) { + const charset = + '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._'; + final random = Random.secure(); + return List.generate(length, (_) => charset[random.nextInt(charset.length)]) + .join(); + } + + /// Returns the sha256 hash of [input] in hex notation. + String sha256ofString(String input) { + final bytes = utf8.encode(input); + final digest = sha256.convert(bytes); + return digest.toString(); + } // FaceBook登录 // 修改后的 signInWithFacebook Future signInWithFacebook() async { try { - print("开始 Facebook 登录"); - final LoginResult result = await FacebookAuth.instance.login(); - print("Facebook 登录结果:$result"); - - if (result.status == LoginStatus.success) { - token = result.accessToken!.tokenString; - print("Facebook Token: $token"); - - final credential = FacebookAuthProvider.credential(token); - print("Facebook Token: $credential"); - final userData = await FacebookAuth.instance.getUserData(); - name = userData["name"].toString(); - - email = userData["email"].toString(); - pictureurl = userData["picture"]["data"]["url"].toString(); - id = userData["id"].toString(); - print("user login facebook ${userData..values}"); - print("user login facebook ${email}${pictureurl}${name}${id}"); - - return true; + final rawNonce = generateNonce(); + final nonce = sha256ofString(rawNonce); + final LoginResult loginResult = await FacebookAuth.instance + .login( + loginTracking: LoginTracking.enabled, + nonce: nonce, + ) + .catchError((onError) { + if (kDebugMode) { + //print(onError); + } + throw Exception(onError.message); + }); + if (loginResult.accessToken == null) { + throw Exception(loginResult.message); + } + // Create a credential from the access token + OAuthCredential facebookAuthCredential; + + print("tokenType${loginResult.accessToken!.type}"); + + if (Platform.isIOS) { + // Create a credential from the access token + switch (loginResult.accessToken!.type) { + case AccessTokenType.classic: + final classicToken = loginResult.accessToken as ClassicToken; + token = classicToken.tokenString; + print('Token 字符串: ${classicToken.tokenString}'); + print('classicToken值: ${classicToken}'); + facebookAuthCredential = FacebookAuthProvider.credential( + classicToken.authenticationToken!, + ); + break; + case AccessTokenType.limited: + final limitedToken = loginResult.accessToken as LimitedToken; + token = limitedToken.tokenString; + print('Token 字符串: ${limitedToken.tokenString}'); + print('LimitedToken值: ${limitedToken}'); + facebookAuthCredential = OAuthCredential( + providerId: 'facebook.com', + signInMethod: 'oauth', + idToken: limitedToken.tokenString, + rawNonce: rawNonce, + ); + break; + } } else { - print("登录失败,状态:${result.status},消息:${result.message}"); - return false; + facebookAuthCredential = FacebookAuthProvider.credential( + loginResult.accessToken!.tokenString, + ); + token = loginResult.accessToken!.tokenString; + } + print('facebookAuthCredential值: ${facebookAuthCredential}'); + if (facebookAuthCredential == null) { + throw Exception("Facebook Login Fail."); } + final userData = await FacebookAuth.instance.getUserData(); + name = userData["name"].toString(); + + email = userData["email"].toString(); + pictureurl = userData["picture"]["data"]["url"].toString(); + id = userData["id"].toString(); + print("user login facebook ${email}${pictureurl}${name}${id}"); + + return true; } catch (e) { print("Facebook 登录异常:$e"); return false;