社交账号身份验证是包含多个步骤的身份验证流程,您可以通过该流程让用户登录到某个账号或将该账号与现有账号关联。
原生平台和 Web 都支持创建凭据,然后将凭据传递给 signInWithCredential
或 linkWithCredential
方法。或者,在 Web 平台上,您可以通过弹出式窗口或重定向来触发身份验证流程。
将 Google 登录流程与 Firebase 搭配使用时,大多数配置已设置,不过您需要确保机器的 SHA1 密钥已配置为与 Android 搭配使用。如需了解如何生成密钥,请参阅身份验证文档。
确保 Firebase 控制台上已启用“Google”登录提供方。
如果您的用户使用 Google 账号登录,则在手动注册账号后,其身份验证提供方将自动更改为 Google,这是 Firebase Authentication 的可信提供方概念决定的。您可以点击此处了解详情。
iOS+ 和 Android
在原生平台上,需要使用第三方库来触发身份验证流程。
安装官方 google_sign_in
插件。
安装后,触发登录流程并创建新凭据:
import 'package:google_sign_in/google_sign_in.dart';
Future<UserCredential> signInWithGoogle() async {
// Trigger the authentication flow
final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();
// Obtain the auth details from the request
final GoogleSignInAuthentication? googleAuth = await googleUser?.authentication;
// Create a new credential
final credential = GoogleAuthProvider.credential(
accessToken: googleAuth?.accessToken,
idToken: googleAuth?.idToken,
);
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithCredential(credential);
}
Web
在 Web 上,Firebase SDK 支持使用 Firebase 项目自动处理身份验证流程。例如:
创建 Google 身份验证提供方,并提供您希望从用户那里获取的任何其他权限范围:
GoogleAuthProvider googleProvider = GoogleAuthProvider();
googleProvider.addScope('https://www.googleapis.com/auth/contacts.readonly');
googleProvider.setCustomParameters({
'login_hint': 'user@example.com'
});
向 signInWithPopup
方法提供凭据。这会打开一个新窗口,提示用户登录您的项目。或者,您也可以使用 signInWithRedirect
,让用户在同一窗口中完成身份验证流程。
Future<UserCredential> signInWithGoogle() async {
// Create a new provider
GoogleAuthProvider googleProvider = GoogleAuthProvider();
googleProvider.addScope('https://www.googleapis.com/auth/contacts.readonly');
googleProvider.setCustomParameters({
'login_hint': 'user@example.com'
});
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithPopup(googleProvider);
// Or use signInWithRedirect
// return await FirebaseAuth.instance.signInWithRedirect(googleProvider);
}
Google Play 游戏(仅限 Android)
确保在 Firebase 控制台上启用了“Play 游戏”登录提供方。按照 Play 游戏 Firebase 项目设置说明操作。
按照有关使用 Firebase 应用配置 Play 游戏服务的说明操作。
Android
Future<void> _signInWithPlayGames() async {
// Get server auth code from 3rd party provider
// See PR description for details on how you might get the server auth code:
// https://github.com/firebase/flutterfire/pull/12201#issue-2100392487
final serverAuthCode = '...';
final playGamesCredential = PlayGamesAuthProvider.credential(
serverAuthCode: serverAuthCode);
await FirebaseAuth.instance
.signInWithCredential(playGamesCredential);
}
在开始之前,请先设置您的 Facebook 开发者应用,然后按照设置过程启用 Facebook 登录流程。
确保在 Firebase 控制台上启用了“Facebook”登录提供方,并设置了 Facebook 应用 ID 和密钥。
iOS+ 和 Android
在原生平台上,需要使用第三方库来安装 Facebook SDK 并触发身份验证流程。
安装 flutter_facebook_auth
插件。
您需要按照插件文档中的步骤进行操作,以确保 Android 和 iOS 版 Facebook SDK 均已正确初始化。完成后,触发登录流程,创建 Facebook 凭据并让用户登录:
import 'package:flutter_facebook_auth/flutter_facebook_auth.dart';
Future<UserCredential> signInWithFacebook() async {
// Trigger the sign-in flow
final LoginResult loginResult = await FacebookAuth.instance.login();
// Create a credential from the access token
final OAuthCredential facebookAuthCredential = FacebookAuthProvider.credential(loginResult.accessToken.token);
// Once signed in, return the UserCredential
return FirebaseAuth.instance.signInWithCredential(facebookAuthCredential);
}
Web
在 Web 上,Firebase SDK 支持使用 Firebase 控制台上提供的 Facebook 应用详细信息自动处理身份验证流程。例如:
创建 Facebook 提供方,并提供您希望从用户那里获取的任何其他权限范围。
确保将 Firebase 控制台中的 OAuth 重定向 URI 添加为 Facebook 应用的有效 OAuth 重定向 URI。
FacebookAuthProvider facebookProvider = FacebookAuthProvider();
facebookProvider.addScope('email');
facebookProvider.setCustomParameters({
'display': 'popup',
});
向 signInWithPopup
方法提供凭据。这会打开一个新窗口,提示用户登录您的 Facebook 应用:
Future<UserCredential> signInWithFacebook() async {
// Create a new provider
FacebookAuthProvider facebookProvider = FacebookAuthProvider();
facebookProvider.addScope('email');
facebookProvider.setCustomParameters({
'display': 'popup',
});
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithPopup(facebookProvider);
// Or use signInWithRedirect
// return await FirebaseAuth.instance.signInWithRedirect(facebookProvider);
}
Apple
iOS+
在开始之前,请先配置“使用 Apple 账号登录”并启用 Apple 作为登录提供方。
接下来,请确保您的 Runner
应用具有“使用 Apple 账号登录”功能。
Android
在开始之前,请先配置“使用 Apple 账号登录”并启用 Apple 作为登录提供方。
Web
在开始之前,请先配置“使用 Apple 账号登录”并启用 Apple 作为登录提供方。
import 'package:firebase_auth/firebase_auth.dart';
Future<UserCredential> signInWithApple() async {
final appleProvider = AppleAuthProvider();
if (kIsWeb) {
await FirebaseAuth.instance.signInWithPopup(appleProvider);
} else {
await FirebaseAuth.instance.signInWithProvider(appleProvider);
}
}
仅限 Apple 平台登录
您还可以通过以下方法在 iOS+ 平台上实现 Apple 登录:
// Implement a function that generates a nonce. See iOS documentation for how to create a nonce:
// https://firebase.google.com/docs/auth/ios/apple#sign_in_with_apple_and_authenticate_with_firebase
String rawNonce = createNonce();
// Create a SHA-256 hash of the nonce. Consider using the `crypto` package from the pub.dev registry.
String hashSHA256String = createHashSHA256String(rawNonce);
// Use the hash of the nonce to get the idToken. Consider using the `sign_in_with_apple` plugin from the pub.dev registry.
String idToken = await getIdToken();
final fullName = AppleFullPersonName(
familyName: 'Name',
givenName: 'Your',
);
// Use the `rawNonce` and `idToken` to get the credential
final credential = AppleAuthProvider.credentialWithIDToken(
idToken,
rawNonce,
fullName,
);
await FirebaseAuth.instance.signInWithCredential(credential);
撤消 Apple 身份验证令牌
Apple 平台上的 Apple 登录会返回一个授权代码,可借助该代码使用 revokeTokenWithAuthorizationCode()
API 撤消 Apple 身份验证令牌。
import 'package:firebase_auth/firebase_auth.dart';
Future<UserCredential> signInWithApple() async {
final appleProvider = AppleAuthProvider();
UserCredential userCredential = await FirebaseAuth.instance.signInWithPopup(appleProvider);
// Keep the authorization code returned from Apple platforms
String? authCode = userCredential.additionalUserInfo?.authorizationCode;
// Revoke Apple auth token
await FirebaseAuth.instance.revokeTokenWithAuthorizationCode(authCode!);
}
Apple Game Center(仅限 Apple 设备)
确保在 Firebase 控制台上启用了“Game Center”登录提供方。按照有关 Game Center Firebase 项目设置的说明操作。
您需要先使用 Game Center 登录,然后才能通过 Firebase 发放 Firebase Game Center 凭据并登录。以下是有关如何实现该目标的一些说明。
iOS+
Future<void> _signInWithGameCenter() async {
final credential = GameCenterAuthProvider.credential();
await FirebaseAuth.instance
.signInWithCredential(credential);
}
Microsoft
iOS+
Android
在开始之前,请先配置 Android 版 Microsoft 登录。
不要忘记添加应用的 SHA-1 指纹。
Web
在开始之前,请先配置 Web 版 Microsoft 登录。
import 'package:firebase_auth/firebase_auth.dart';
Future<UserCredential> signInWithMicrosoft() async {
final microsoftProvider = MicrosoftAuthProvider();
if (kIsWeb) {
await FirebaseAuth.instance.signInWithPopup(microsoftProvider);
} else {
await FirebaseAuth.instance.signInWithProvider(microsoftProvider);
}
}
确保在 Firebase 控制台上启用了“Twitter”登录提供方,并设置了 API 密钥和 API 密文。请务必前往 Twitter 应用配置,在您的应用的设置页面中,将 Firebase OAuth 重定向 URI(例如 my-app-12345.firebaseapp.com/__/auth/handler)设置为您的授权回调网址。
此外,您可能需要申请获取更高的 API 访问权限,具体取决于您的应用。
iOS+
您需要按照 iOS 指南第 1 步中的说明配置自定义网址方案。
Android
如果您尚未指定应用的 SHA-1 指纹,请在 Firebase 控制台的设置页面中指定。如需详细了解如何获取您的应用的 SHA-1 指纹,请参阅对客户端进行身份验证。
Web
可直接使用。
import 'package:firebase_auth/firebase_auth.dart';
Future<void> _signInWithTwitter() async {
TwitterAuthProvider twitterProvider = TwitterAuthProvider();
if (kIsWeb) {
await FirebaseAuth.instance.signInWithPopup(twitterProvider);
} else {
await FirebaseAuth.instance.signInWithProvider(twitterProvider);
}
}
GitHub
确保在 GitHub 开发者设置中设置了 OAuth 应用、在 Firebase 控制台上启用了“GitHub”登录提供方并设置了客户端 ID 和密钥、在 GitHub 应用中设置了回调网址。
iOS+ 和 Android
对于原生平台,您需要添加 google-services.json
和 GoogleService-Info.plist
。
对于 iOS 设备,请按照 iOS 指南第 1 步中的说明添加自定义网址方案。
Future<UserCredential> signInWithGitHub() async {
// Create a new provider
GithubAuthProvider githubProvider = GithubAuthProvider();
return await FirebaseAuth.instance.signInWithProvider(githubProvider);
}
Web
在 Web 上,GitHub SDK 支持使用 Firebase 控制台上提供的 GitHub 应用详细信息自动处理身份验证流程。确保 Firebase 控制台中的回调网址已添加为开发者控制台上的 GitHub 应用中的回调网址。
例如:
创建一个 GitHub 提供方并向 signInWithPopup
方法提供凭据。这会打开一个新窗口,提示用户登录您的 GitHub 应用:
Future<UserCredential> signInWithGitHub() async {
// Create a new provider
GithubAuthProvider githubProvider = GithubAuthProvider();
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithPopup(githubProvider);
// Or use signInWithRedirect
// return await FirebaseAuth.instance.signInWithRedirect(githubProvider);
}
Yahoo
确保在 Firebase 控制台上启用了“Yahoo”登录提供方,并设置了 API 密钥和 API 密文。此外,请务必在应用的 Yahoo 开发者网络配置中将 Firebase OAuth 重定向 URI(例如 my-app-12345.firebaseapp.com/__/auth/handler)设置为重定向 URI。
iOS+
在开始之前,请先配置 iOS 版 Yahoo 登录并向您的运行程序添加自定义网址方案(第 1 步)。
Android
在开始之前,请先配置 Android 版 Yahoo 登录。
不要忘记添加应用的 SHA-1 指纹。
Web
可直接使用。
import 'package:firebase_auth/firebase_auth.dart';
Future<UserCredential> signInWithYahoo() async {
final yahooProvider = YahooAuthProvider();
if (kIsWeb) {
await _auth.signInWithPopup(yahooProvider);
} else {
await _auth.signInWithProvider(yahooProvider);
}
}
使用 OAuth 访问令牌
如果使用 AuthProvider,您便可以通过发出以下请求来检索与提供方关联的访问令牌。
final appleProvider = AppleAuthProvider();
final user = await FirebaseAuth.instance.signInWithProvider(appleProvider);
final accessToken = user.credential?.accessToken;
// You can send requests with the `accessToken`
关联身份验证提供方
如果要将某个提供方与一个现有用户相关联,可以使用以下方法: ```dart await FirebaseAuth.instance.signInAnonymously();
final appleProvider = AppleAuthProvider();
if (kIsWeb) { await FirebaseAuth.instance.currentUser?.linkWithPopup(appleProvider);
// 您也可以使用 linkWithRedirect
} else {
await FirebaseAuth.instance.currentUser?.linkWithProvider(appleProvider);
}
// 您的匿名用户现已升级,可以通过“使用 Apple 账号登录”功能进行关联 ```
向提供方重新进行身份验证
上述模式同样适用于 reauthenticateWithProvider
,对于要求用户必须在近期内登录过才能执行的敏感操作,可使用它来检索新的凭据。
final appleProvider = AppleAuthProvider();
if (kIsWeb) {
await FirebaseAuth.instance.currentUser?.reauthenticateWithPopup(appleProvider);
// Or you can reauthenticate with a redirection
// await FirebaseAuth.instance.currentUser?.reauthenticateWithRedirect(appleProvider);
} else {
await FirebaseAuth.instance.currentUser?.reauthenticateWithProvider(appleProvider);
}
// You can now perform sensitive operations