前言
國內(nèi)的登陸一般可以通過極光故痊、友盟等這些第三方平臺提供的sdk顶瞳,實現(xiàn)一鍵接入。國外的就比較雜了愕秫,比如常用的 GitHub慨菱、Twitter、apple戴甩、Microsoft等符喝, Google 提供了 firebase 統(tǒng)一驗證的機(jī)制,雖然不能統(tǒng)一登陸方式等恐,但是通過 firebase 能使登陸流程更加規(guī)范化洲劣,減少后端開發(fā)的工作量备蚓,而且要使用 Google 登陸前课蔬,必須要集成 firebase,同時它也是國際型項目等首選方案郊尝,它等服務(wù)還包括推送二跋,郵箱驗證,統(tǒng)計流昏、即時通訊等扎即。文章只演示 Google 和 Facebook 登陸集成及配置吞获。
賬號配置
關(guān)于賬號配置請參考上篇文章配置流程
Vue 接入firebase驗證、Google登陸谚鄙、Facebook登陸完整流程
集成及使用
在 pubspec.yaml 中新增依賴
firebase_auth: ^0.16.1
google_sign_in: ^4.5.1
google_sign_in_web: ^0.9.1
flutter_facebook_login: ^3.0.0
其它平臺請參考對應(yīng)的集成文檔
android 配置
1.通過 keytools 工具獲取 app 的 SHA 證書指紋
如果沒有就去創(chuàng)建一個各拷,否則無法使用firebase 登陸,(不知道怎么獲取的也可以百度闷营,網(wǎng)上很多教程)
官方文檔(需科學(xué)上網(wǎng))
keytool -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore
2.將指紋添加到下面
3.下載 google-services.json 拷貝到 android/app 目錄下
如果集成了 Facebook 還需要在 AndroidManifest.xml 中新增 FacebookActivity
<activity android:name="com.facebook.FacebookActivity"
android:configChanges=
"keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
ios 配置
在 ios 選項中將 GoogleService-Info.plist 拷貝到 Xcode 項目的根目錄中
使用
1.初始化
FirebaseAuth _auth = FirebaseAuth.instance;
GoogleSignIn _googleSignIn = GoogleSignIn(
scopes: <String>[
'email',
'https://www.googleapis.com/auth/contacts.readonly',
],
);
static final FacebookLogin facebookSignIn = new FacebookLogin();
2.導(dǎo)入相關(guān)依賴
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:flutter_facebook_login/flutter_facebook_login.dart';
3.google登陸
void signInWithGoogle() async {
try{
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;
assert(user.email != null);
assert(user.displayName != null);
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
IdTokenResult idTokenResult = await user.getIdToken(refresh: true);
setState(() {
idToken = idTokenResult.token;
});
}catch(e){
SnackTool.showSnackText(context, "Auth error !");
}
}
Facebook登陸
Future<Null> signInFacebook() async {
try{
final FacebookLoginResult result = await facebookSignIn.logIn(['email']);
switch (result.status) {
case FacebookLoginStatus.loggedIn:
final FacebookAccessToken accessToken = result.accessToken;
final AuthCredential credential =
FacebookAuthProvider.getCredential(accessToken: accessToken.token);
final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;
IdTokenResult idTokenResult = await user.getIdToken(refresh: true);
setState(() {
idToken = idTokenResult.token;
});
break;
case FacebookLoginStatus.cancelledByUser:
print('Login cancelled by the user.');
break;
case FacebookLoginStatus.error:
print('Something went wrong with the login process.\n'
'Here\'s the error Facebook gave us: ${result.errorMessage}');
break;
}
}catch(e){
SnackTool.showSnackText(context, "Auth error !");
}
}
?? 最終結(jié)果是要獲取到 idtoken烤黍,中間任何步驟都不能省略,如果是其它平臺也同理傻盟,最后獲取到對應(yīng)平臺都token之后都需要再通過 firebase 簽名驗證速蕊,生產(chǎn) firebase 統(tǒng)一的 idtoken。
最后就是后端需要處理的事情了娘赴,獲取 idtoken之后 后端就能獲取用戶信息了规哲。
問題
集成中曾遇到 listenablefuture libs 沖突
解決方案是在 android/app/build.gradle 中的 android 里加上
configurations {
all*.exclude group: 'com.google.guava', module: 'listenablefuture'
}