|
|
@ -1,6 +1,13 @@ |
|
|
|
|
|
import 'dart:convert'; |
|
|
|
|
|
import 'dart:io'; |
|
|
|
|
|
import 'dart:math'; |
|
|
|
|
|
|
|
|
import 'package:firebase_auth/firebase_auth.dart'; |
|
|
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:flutter_facebook_auth/flutter_facebook_auth.dart'; |
|
|
import 'package:get/get.dart'; |
|
|
import 'package:get/get.dart'; |
|
|
|
|
|
import 'package:crypto/crypto.dart'; |
|
|
|
|
|
|
|
|
class Facebook { |
|
|
class Facebook { |
|
|
String token = ''; |
|
|
String token = ''; |
|
|
@ -9,35 +16,90 @@ class Facebook { |
|
|
String email = ''; |
|
|
String email = ''; |
|
|
String pictureurl = ''; |
|
|
String pictureurl = ''; |
|
|
String id = ''; |
|
|
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登录 |
|
|
// FaceBook登录 |
|
|
// 修改后的 signInWithFacebook |
|
|
// 修改后的 signInWithFacebook |
|
|
Future<bool> signInWithFacebook() async { |
|
|
Future<bool> signInWithFacebook() async { |
|
|
try { |
|
|
try { |
|
|
print("开始 Facebook 登录"); |
|
|
final rawNonce = generateNonce(); |
|
|
final LoginResult result = await FacebookAuth.instance.login(); |
|
|
final nonce = sha256ofString(rawNonce); |
|
|
print("Facebook 登录结果:$result"); |
|
|
final LoginResult loginResult = await FacebookAuth.instance |
|
|
|
|
|
.login( |
|
|
if (result.status == LoginStatus.success) { |
|
|
loginTracking: LoginTracking.enabled, |
|
|
token = result.accessToken!.tokenString; |
|
|
nonce: nonce, |
|
|
print("Facebook Token: $token"); |
|
|
) |
|
|
|
|
|
.catchError((onError) { |
|
|
final credential = FacebookAuthProvider.credential(token); |
|
|
if (kDebugMode) { |
|
|
print("Facebook Token: $credential"); |
|
|
//print(onError); |
|
|
final userData = await FacebookAuth.instance.getUserData(); |
|
|
} |
|
|
name = userData["name"].toString(); |
|
|
throw Exception(onError.message); |
|
|
|
|
|
}); |
|
|
email = userData["email"].toString(); |
|
|
if (loginResult.accessToken == null) { |
|
|
pictureurl = userData["picture"]["data"]["url"].toString(); |
|
|
throw Exception(loginResult.message); |
|
|
id = userData["id"].toString(); |
|
|
} |
|
|
print("user login facebook ${userData..values}"); |
|
|
// Create a credential from the access token |
|
|
print("user login facebook ${email}${pictureurl}${name}${id}"); |
|
|
OAuthCredential facebookAuthCredential; |
|
|
|
|
|
|
|
|
return true; |
|
|
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 { |
|
|
} else { |
|
|
print("登录失败,状态:${result.status},消息:${result.message}"); |
|
|
facebookAuthCredential = FacebookAuthProvider.credential( |
|
|
return false; |
|
|
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) { |
|
|
} catch (e) { |
|
|
print("Facebook 登录异常:$e"); |
|
|
print("Facebook 登录异常:$e"); |
|
|
return false; |
|
|
return false; |
|
|
|