Bạn có thể sử dụng tính năng Xác thực Firebase để đăng nhập người dùng bằng cách gửi cho họ một email có chứa đường liên kết. Người dùng có thể nhấp vào đường liên kết đó để đăng nhập. Trong quá trình này, địa chỉ email của người dùng cũng được xác minh.
Có nhiều lợi ích khi đăng nhập bằng email:
- Quy trình đăng ký và đăng nhập đơn giản.
- Giảm nguy cơ sử dụng lại mật khẩu trên các ứng dụng, điều này có thể làm suy yếu tính bảo mật của ngay cả những mật khẩu được chọn kỹ.
- Khả năng xác thực người dùng đồng thời xác minh rằng người dùng là chủ sở hữu hợp pháp của một địa chỉ email.
- Người dùng chỉ cần có một tài khoản email có thể truy cập để đăng nhập. Không cần phải sở hữu số điện thoại hoặc tài khoản mạng xã hội.
- Người dùng có thể đăng nhập một cách an toàn mà không cần cung cấp (hoặc nhớ) a mật khẩu. Việc này có thể gây phiền toái trên thiết bị di động.
- Người dùng hiện tại đã đăng nhập bằng giá trị nhận dạng email (mật khẩu hoặc liên kết) trước đó có thể nâng cấp để chỉ đăng nhập bằng email. Ví dụ: người dùng quên mật khẩu vẫn có thể đăng nhập mà không cần đặt lại mật khẩu.
Trước khi bắt đầu
Sử dụng Trình quản lý gói Swift để cài đặt và quản lý các phần phụ thuộc của Firebase.
- Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy chuyển đến File (Tệp) > Add Packages (Thêm gói).
- Khi được nhắc, hãy thêm kho lưu trữ SDK nền tảng Apple của Firebase:
- Chọn thư viện Firebase Authentication.
- Thêm cờ
-ObjCvào phần Other Linker Flags (Cờ trình liên kết khác) trong chế độ cài đặt bản dựng của mục tiêu. - Khi hoàn tất, Xcode sẽ tự động bắt đầu phân giải và tải các phần phụ thuộc xuống ở chế độ nền.
https://github.com/firebase/firebase-ios-sdk.git
Bật tính năng đăng nhập bằng đường liên kết trong email cho dự án Firebase
Để đăng nhập người dùng bằng đường liên kết trong email, trước tiên, bạn phải bật nhà cung cấp Email và phương thức đăng nhập bằng đường liên kết trong email cho dự án Firebase:
- Trong bảng điều khiển của Firebase, hãy mở phần Auth.
- Trên thẻ Sign in method (Phương thức đăng nhập), hãy bật nhà cung cấp Email/Password (Email/Mật khẩu). Xin lưu ý rằng bạn phải bật tính năng đăng nhập bằng email/mật khẩu để sử dụng tính năng đăng nhập bằng đường liên kết trong email.
- Trong cùng một phần, hãy bật phương thức đăng nhập Email link (passwordless sign-in).
- Nhấp vào Save (Lưu).
Gửi đường liên kết xác thực đến địa chỉ email của người dùng
Để bắt đầu quy trình xác thực, hãy cung cấp cho người dùng một giao diện
nhắc người dùng cung cấp địa chỉ email của họ, sau đó gọi
sendSignInLink để yêu cầu Firebase
gửi đường liên kết xác thực đến email của người dùng.
Tạo đối tượng
ActionCodeSettingscung cấp cho Firebase hướng dẫn về cách tạo đường liên kết trong email. Đặt các trường sau:url: Đường liên kết sâu để nhúng và mọi trạng thái bổ sung cần được truyền đi. Miền của đường liên kết phải được đưa vào danh sách cho phép trong danh sách các miền được uỷ quyền của Bảng điều khiển Firebase. Bạn có thể tìm thấy danh sách này bằng cách chuyển đến thẻ Phương thức đăng nhập (Xác thực -> Phương thức đăng nhập).
iOSBundleIDvàandroidPackageName: Giúp Firebase Authentication xác định xem có nên tạo đường liên kết chỉ dành cho web hay đường liên kết dành cho thiết bị di động được mở trên thiết bị Android hoặc Apple hay không.handleCodeInApp: Đặt thành true. Bạn phải luôn hoàn tất thao tác đăng nhập trong ứng dụng, không giống như các thao tác email ngoài băng tần khác (đặt lại mật khẩu và xác minh email). Lý do là vì ở cuối quy trình, người dùng dự kiến sẽ đăng nhập và trạng thái Xác thực của họ được duy trì trong ứng dụng.linkDomain: Khi các miền liên kết Hosting tuỳ chỉnh được xác định cho một dự án, hãy chỉ định miền nào cần sử dụng khi đường liên kết được mở bằng một ứng dụng di động cụ thể. Nếu không, miền mặc định sẽ được tự động chọn (ví dụ: ).PROJECT_ID.firebaseapp.comdynamicLinkDomain: Không dùng nữa. Đừng chỉ định tham số này.
Swift
let actionCodeSettings = ActionCodeSettings() actionCodeSettings.url = URL(string: "https://www.example.com") // The sign-in operation has to always be completed in the app. actionCodeSettings.handleCodeInApp = true actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!) actionCodeSettings.setAndroidPackageName("com.example.android", installIfNotAvailable: false, minimumVersion: "12")
Objective-C
FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init]; [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]]; // The sign-in operation has to always be completed in the app. actionCodeSettings.handleCodeInApp = YES; [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]]; [actionCodeSettings setAndroidPackageName:@"com.example.android" installIfNotAvailable:NO minimumVersion:@"12"];
Để tìm hiểu thêm về
ActionCodeSettings, hãy tham khảo phần Truyền trạng thái trong các thao tác email.Yêu cầu người dùng cung cấp email của họ.
Gửi đường liên kết xác thực đến email của người dùng và lưu email của người dùng trong trường hợp người dùng hoàn tất quy trình đăng nhập bằng email trên cùng một thiết bị.
Swift
Auth.auth().sendSignInLink(toEmail: email, actionCodeSettings: actionCodeSettings) { error in // ... if let error = error { self.showMessagePrompt(error.localizedDescription) return } // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. UserDefaults.standard.set(email, forKey: "Email") self.showMessagePrompt("Check your email for link") // ... }
Objective-C
[[FIRAuth auth] sendSignInLinkToEmail:email actionCodeSettings:actionCodeSettings completion:^(NSError *_Nullable error) { // ... if (error) { [self showMessagePrompt:error.localizedDescription]; return; } // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"]; [self showMessagePrompt:@"Check your email for link"]; // ... }];
Hoàn tất quy trình đăng nhập bằng đường liên kết trong email
Các mối lo ngại về bảo mật
Để ngăn việc sử dụng đường liên kết đăng nhập để đăng nhập với tư cách là người dùng không mong muốn hoặc trên thiết bị không mong muốn, tính năng Xác thực Firebase yêu cầu người dùng cung cấp địa chỉ email khi hoàn tất quy trình đăng nhập. Để đăng nhập thành công, địa chỉ email này phải khớp với địa chỉ mà đường liên kết đăng nhập được gửi ban đầu.
Bạn có thể đơn giản hoá quy trình này cho những người dùng mở đường liên kết đăng nhập trên cùng một thiết bị mà họ yêu cầu đường liên kết bằng cách lưu trữ địa chỉ email của họ cục bộ khi bạn gửi email đăng nhập. Sau đó, hãy sử dụng địa chỉ này để hoàn tất quy trình.
Sau khi hoàn tất quy trình đăng nhập, mọi cơ chế đăng nhập chưa xác minh trước đó sẽ bị xoá khỏi người dùng và mọi phiên hiện có sẽ bị vô hiệu. Ví dụ: nếu trước đây, ai đó đã tạo một tài khoản chưa xác minh bằng cùng một email và mật khẩu, thì mật khẩu của người dùng sẽ bị xoá để ngăn kẻ mạo danh đã tuyên bố quyền sở hữu và tạo tài khoản chưa xác minh đó đăng nhập lại bằng cùng một tài khoản.
Hoàn tất quy trình đăng nhập trong ứng dụng di động Apple
Firebase Authentication sử dụng Firebase Hosting để gửi đường liên kết trong email đến thiết bị di động. Để hoàn tất quy trình đăng nhập bằng ứng dụng di động, ứng dụng phải được định cấu hình để phát hiện đường liên kết đến ứng dụng, phân tích cú pháp đường liên kết sâu cơ bản , sau đó hoàn tất quy trình đăng nhập. Hãy xem phần về các đường liên kết phổ biến và miền được liên kết trên iOS để biết thêm thông tin chi tiết về cách thực hiện việc này.
Định cấu hình Firebase Hosting
Firebase Authentication sử dụng Firebase Hosting miền khi tạo và gửi đường liên kết được dùng để mở trong ứng dụng di động. Một miền Firebase Hosting mặc định đã được định cấu hình cho bạn.
Định cấu hình các miền:Firebase Hosting
Trong bảng điều khiển của Firebase, hãy mở phần Hosting.
Nếu bạn muốn sử dụng miền mặc định cho đường liên kết trong email mở trong các ứng dụng di động, hãy chuyển đến trang web mặc định và ghi lại miền mặc định Hosting. Miền Hosting mặc định thường có dạng như sau:
.PROJECT_ID.firebaseapp.comBạn sẽ cần giá trị này khi định cấu hình ứng dụng để chặn đường liên kết đến.
Nếu muốn sử dụng miền tuỳ chỉnh cho đường liên kết trong email, bạn có thể đăng ký một miền với Firebase Hosting và sử dụng miền đó cho miền của đường liên kết.
Định cấu hình ứng dụng Apple:
Bạn cần định cấu hình miền đã chọn làm Associated Domain cho các đường liên kết đến ứng dụng. Để thiết lập quyền trong ứng dụng, hãy mở thẻ Signing & Capabilities của mục tiêu trong Xcode rồi thêm các miền Firebase Hosting từ bước trước vào khả năng Miền được liên kết. Nếu sử dụng miền mặc định Firebase Hosting này, miền này sẽ là
.applinks:PROJECT_ID.firebaseapp.comHãy xem phần Hỗ trợ các miền được liên kết trên trang web tài liệu của Apple để biết thêm thông tin.
Xác minh đường liên kết và đăng nhập
Sau khi nhận được đường liên kết như mô tả ở trên, hãy xác minh rằng đường liên kết đó dùng để xác thực bằng đường liên kết trong email và hoàn tất quy trình đăng nhập.
Swift
if Auth.auth().isSignIn(withEmailLink: link) { Auth.auth().signIn(withEmail: email, link: self.link) { user, error in // ... } }
Objective-C
if ([[FIRAuth auth] isSignInWithEmailLink:link]) { [[FIRAuth auth] signInWithEmail:email link:link completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { // ... }]; }
Để tìm hiểu cách xử lý quy trình đăng nhập bằng đường liên kết trong email trong ứng dụng Android, hãy tham khảo hướng dẫn dành cho Android.
Để tìm hiểu cách xử lý quy trình đăng nhập bằng đường liên kết trong email trong ứng dụng web, hãy tham khảo hướng dẫn dành cho Web.
Liên kết/xác thực lại bằng đường liên kết trong email
Bạn cũng có thể liên kết phương thức xác thực này với người dùng hiện có. Ví dụ: người dùng đã xác thực bằng một nhà cung cấp khác (chẳng hạn như số điện thoại) có thể thêm phương thức đăng nhập này vào tài khoản hiện có của họ.
Sự khác biệt sẽ nằm ở nửa sau của thao tác:
Swift
let credential = EmailAuthCredential.credential(withEmail:email link:link) Auth.auth().currentUser?.link(with: credential) { authData, error in if (error) { // And error occurred during linking. return } // The provider was successfully linked. // The phone user can now sign in with their phone number or email. }
Objective-C
FIRAuthCredential *credential = [FIREmailAuthProvider credentialWithEmail:email link:link]; [FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { if (error) { // And error occurred during linking. return; } // The provider was successfully linked. // The phone user can now sign in with their phone number or email. }];
Bạn cũng có thể sử dụng phương thức này để xác thực lại người dùng đường liên kết trong email trước khi chạy một thao tác nhạy cảm.
Swift
let credential = EmailAuthProvider.credential(withEmail:email link:link) Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in if (error) { // And error occurred during re-authentication. return } // The user was successfully re-authenticated. }
Objective-C
FIRAuthCredential *credential = [FIREmailAuthCredential credentialWithEmail:email link:link]; [FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { if (error) { // And error occurred during re-authentication return; } // The user was successfully re-authenticated. }];
Tuy nhiên, vì quy trình có thể kết thúc trên một thiết bị khác mà người dùng ban đầu chưa đăng nhập, nên quy trình này có thể không hoàn tất. Trong trường hợp đó, một thông báo lỗi có thể xuất hiện với người dùng để buộc họ mở đường liên kết trên cùng một thiết bị. Một số trạng thái có thể được truyền trong đường liên kết để cung cấp thông tin về loại thao tác và mã nhận dạng người dùng.
Không dùng nữa: Xác minh dựa trên Firebase Dynamic Links
Trước SDK iOS v11.8.0 của Firebase Authentication, tính năng đăng nhập bằng đường liên kết trong email dựa vào Firebase Dynamic Links để mở các đường liên kết đăng nhập trong ứng dụng chính xác. Các đường liên kết xác minh này không dùng nữa vì Firebase Dynamic Links sẽ ngừng hoạt động vào ngày 25 tháng 8 năm 2025.
Nếu ứng dụng của bạn sử dụng các đường liên kết kiểu cũ, bạn nên di chuyển ứng dụng sang hệ thống mới dựa trên Firebase Hosting.
Không dùng nữa: Phân biệt email-mật khẩu với đường liên kết trong email
Nếu bạn tạo dự án vào hoặc sau ngày 15 tháng 9 năm 2023, thì tính năng bảo vệ chống liệt kê email
sẽ được bật theo mặc định. Tính năng này giúp cải thiện tính bảo mật của tài khoản người dùng trong dự án, nhưng sẽ tắt phương thức fetchSignInMethodsForEmail()
. Trước đây, chúng tôi khuyên bạn nên triển khai các quy trình ưu tiên giá trị nhận dạng.
Mặc dù bạn có thể tắt tính năng bảo vệ chống liệt kê email cho dự án, nhưng chúng tôi khuyên bạn không nên làm như vậy.
Để tìm hiểu thêm, hãy xem bài viết Bật hoặc tắt tính năng bảo vệ chống liệt kê email.
Các bước tiếp theo
Sau khi người dùng đăng nhập lần đầu tiên, một tài khoản người dùng mới sẽ được tạo và liên kết với thông tin đăng nhập, tức là tên người dùng và mật khẩu, số điện thoại hoặc thông tin nhà cung cấp dịch vụ xác thực mà người dùng đã đăng nhập. Tài khoản mới này được lưu trữ như một phần của dự án Firebase và có thể dùng để xác định người dùng trên mọi ứng dụng trong dự án, bất kể người dùng đăng nhập bằng cách nào.
-
Trong ứng dụng, bạn có thể lấy thông tin cơ bản về hồ sơ của người dùng từ đối tượng
User. Xem bài viết Quản lý người dùng. Trong Firebase Realtime Database và Cloud Storage Quy tắc bảo mật, bạn có thể lấy mã nhận dạng người dùng duy nhất của người dùng đã đăng nhập từ biến
auth, và sử dụng mã này để kiểm soát dữ liệu mà người dùng có thể truy cập.
Bạn có thể cho phép người dùng đăng nhập vào ứng dụng bằng nhiều nhà cung cấp dịch vụ xác thực bằng cách liên kết thông tin đăng nhập của nhà cung cấp dịch vụ xác thực với tài khoản người dùng hiện có.
Để đăng xuất người dùng, hãy gọi
signOut:.
Swift
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Bạn cũng có thể muốn thêm mã xử lý lỗi cho toàn bộ các lỗi xác thực lỗi. Xem bài viết Xử lý lỗi.