Xác thực bằng Firebase bằng Số điện thoại với Unity

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 tin nhắn SMS đến điện thoại của người dùng. Người dùng đăng nhập bằng mã một lần có trong tin nhắn SMS.

Tài liệu này mô tả cách triển khai quy trình đăng nhập bằng số điện thoại bằng cách sử dụng Firebase SDK.

Trước khi bắt đầu

  1. Để có thể sử dụng tính năng Xác thực Firebase, bạn cần thêm SDK Unity của Firebase (cụ thể là FirebaseAuth.unitypackage) vào dự án Unity của mình.

    Hãy xem hướng dẫn chi tiết về các bước thiết lập ban đầu này trong bài viết Thêm Firebase vào dự án Unity.

  2. Nếu bạn chưa kết nối ứng dụng của mình với dự án Firebase, hãy thực hiện việc này trong bảng điều khiển của Firebase.
  3. Tìm hiểu các yêu cầu về nền tảng để đăng nhập bằng số điện thoại:
    • Đăng nhập bằng số điện thoại chỉ dành cho nền tảng di động.
    • Trên iOS, đăng nhập bằng số điện thoại yêu cầu một thiết bị thực và sẽ không hoạt động trên trình mô phỏng.

Các mối lo ngại về bảo mật

Mặc dù thuận tiện nhưng việc xác thực chỉ sử dụng số điện thoại sẽ kém an toàn hơn so với các phương thức khác hiện có, vì người dùng có thể dễ dàng chuyển quyền sở hữu số điện thoại. Ngoài ra, trên các thiết bị có nhiều hồ sơ người dùng, bất kỳ người dùng nào có thể nhận tin nhắn SMS đều có thể đăng nhập vào một tài khoản bằng số điện thoại của thiết bị đó.

Nếu sử dụng phương thức đăng nhập dựa trên số điện thoại trong ứng dụng, bạn nên cung cấp tính năng này cùng với các phương thức đăng nhập an toàn hơn, đồng thời thông báo cho người dùng về các lợi ích bảo mật khi sử dụng việc đăng nhập bằng số điện thoại.

Bật tính năng đăng nhập bằng số điện thoại cho dự án Firebase của bạn

Để đăng nhập người dùng bằng SMS, trước tiên bạn phải bật phương thức đăng nhập bằng số điện thoại cho dự án Firebase của bạn:

  1. Trong bảng điều khiển của Firebase, hãy mở phần Xác thực.
  2. Trên trang Phương thức đăng nhập, hãy bật phương thức đăng nhập Số điện thoại.

Hạn mức yêu cầu đăng nhập bằng số điện thoại của Firebase đủ cao để hầu hết ứng dụng không bị ảnh hưởng. Tuy nhiên, nếu cần đăng nhập vào rất nhiều người dùng bằng tính năng xác thực qua điện thoại, thì bạn có thể phải nâng cấp gói giá của mình. Xem trang giá.

Bắt đầu nhận thông báo APN (chỉ iOS)

Để sử dụng tính năng xác thực số điện thoại trên iOS, ứng dụng của bạn phải nhận được thông báo AAP từ Firebase. Khi bạn đăng nhập lần đầu tiên bằng số điện thoại của người dùng trên một thiết bị, tính năng Xác thực Firebase sẽ gửi một thông báo đẩy im lặng đến thiết bị để xác minh rằng yêu cầu đăng nhập bằng số điện thoại đến từ ứng dụng của bạn. (Vì lý do này, bạn không thể sử dụng tính năng đăng nhập bằng số điện thoại trên trình mô phỏng.)

Cách bật thông báo APN để dùng với tính năng Xác thực Firebase:

  1. Trong Xcode, hãy bật thông báo đẩy cho dự án của bạn.
  2. Tải chứng chỉ APN của bạn lên Firebase. Nếu bạn chưa có chứng chỉ APN, hãy nhớ tạo một chứng chỉ trong Trung tâm thành viên dành cho nhà phát triển của Apple.

    1. Bên trong dự án của bạn trong bảng điều khiển của Firebase, hãy chọn biểu tượng bánh răng, chọn Cài đặt dự án, sau đó chọn thẻ Gửi thông báo qua đám mây.

    2. Chọn nút Tải chứng chỉ lên cho chứng chỉ phát triển, chứng chỉ sản xuất của bạn hoặc cả hai. Bạn phải điền ít nhất một tệp.

    3. Đối với mỗi chứng chỉ, hãy chọn tệp .p12 và cung cấp mật khẩu (nếu có). Hãy đảm bảo mã nhận dạng gói của chứng chỉ này khớp với mã nhận dạng gói của ứng dụng. Chọn Save (Lưu).

Gửi mã xác minh đến điện thoại của người dùng

Để bắt đầu đăng nhập bằng số điện thoại, hãy hiển thị cho người dùng một giao diện nhắc họ cung cấp số điện thoại, sau đó gọi PhoneAuthProvider.VerifyPhoneNumber để yêu cầu Firebase gửi mã xác thực đến điện thoại của người dùng bằng tin nhắn SMS:

  1. Lấy số điện thoại của người dùng.

    Có nhiều yêu cầu pháp lý, nhưng phương pháp hay nhất và để đặt ra kỳ vọng cho người dùng là bạn nên cho người dùng biết rằng nếu họ sử dụng tính năng đăng nhập bằng điện thoại, họ có thể nhận được tin nhắn SMS để xác minh và mức phí tiêu chuẩn sẽ được áp dụng.

  2. Gọi PhoneAuthProvider.VerifyPhoneNumber, truyền đến phương thức này một PhoneAuthOptions chứa số điện thoại của người dùng.
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(
      new Firebase.Auth.PhoneAuthOptions {
        PhoneNumber = phoneNumber,
        TimeoutInMilliseconds = phoneAuthTimeoutMs,
        ForceResendingToken = null
      },
      verificationCompleted: (credential) => {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // There is no need to input the verification code.
        // `credential` can be used instead of calling GetCredential().
      },
      verificationFailed: (error) => {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) => {
        // Verification code was successfully sent via SMS.
        // `id` contains the verification id that will need to passed in with
        // the code from the user when calling GetCredential().
        // `token` can be used if the user requests the code be sent again, to
        // tie the two requests together.
      },
      codeAutoRetrievalTimeout: (id) => {
        // Called when the auto-sms-retrieval has timed out, based on the given
        // timeout parameter.
        // `id` contains the verification id of the request that timed out.
      });
    
    Khi bạn gọi PhoneAuthProvider.VerifyPhoneNumber, Firebase,
    • (trên iOS) và gửi thông báo đẩy im lặng đến ứng dụng của bạn.
    • Firebase gửi một tin nhắn SMS chứa mã xác thực đến số điện thoại được chỉ định và chuyển mã xác minh đến hàm hoàn tất của bạn. Bạn sẽ cần cả mã xác minh và mã xác minh để đăng nhập vào người dùng.
  3. Lưu mã xác minh và khôi phục khi ứng dụng của bạn tải xong. Bằng cách này, bạn có thể đảm bảo rằng mình vẫn có mã xác minh hợp lệ nếu ứng dụng của bạn bị chấm dứt trước khi người dùng hoàn tất quy trình đăng nhập (ví dụ: khi chuyển sang ứng dụng SMS).

    Bạn có thể duy trì mã xác minh này theo bất kỳ cách nào bạn muốn. Một cách đơn giản là lưu mã xác minh bằng UnityEngine.PlayerPrefs.

Nếu lệnh gọi lại được chuyển vào codeSent được gọi, bạn có thể nhắc người dùng nhập mã xác minh khi họ nhận được mã trong tin nhắn SMS.

Mặt khác, nếu lệnh gọi lại cho verificationCompleted được gọi, thì quá trình xác minh tự động đã thành công và giờ bạn sẽ có PhoneAuthCredential để sử dụng như mô tả bên dưới.

Đăng nhập người dùng bằng mã xác minh

Sau khi người dùng cung cấp cho ứng dụng của bạn mã xác minh trong tin nhắn SMS, hãy đăng nhập người dùng bằng cách tạo một đối tượng PhoneAuthCredential từ mã xác minh và mã xác minh, rồi truyền đối tượng đó đến FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync.

  1. Nhận mã xác minh từ người dùng.
  2. Tạo đối tượng Credential từ mã xác minh và mã xác minh.
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. Đăng nhập vào người dùng bằng đối tượng PhoneAuthCredential:
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " +
                       task.Exception);
        return;
      }
    
      FirebaseUser newUser = task.Result.User;
      Debug.Log("User signed in successfully");
      // This should display the phone number.
      Debug.Log("Phone number: " + newUser.PhoneNumber);
      // The phone number providerID is 'phone'.
      Debug.Log("Phone provider ID: " + newUser.ProviderId);
    });
    

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 (chẳng hạn như tên người dùng và mật khẩu, số điện thoại hoặc thông tin của 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 trong dự án Firebase và có thể được dùng để xác định người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đăng nhập bằng cách nào.

  • Trong các ứng dụng, bạn có thể lấy thông tin hồ sơ cơ bản của người dùng từ đối tượng Firebase.Auth.FirebaseUser:

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // The user's Id, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server, if you
      // have one; use User.TokenAsync() instead.
      string uid = user.UserId;
    }
    
  • Trong Quy tắc bảo mật của Cloud Storage và Cơ sở dữ liệu theo thời gian thực của Firebase, bạn có thể lấy mã nhận dạng người dùng riêng biệt của người dùng đã đăng nhập từ biến auth rồi sử dụng mã này để kiểm soát những 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 của mình thông qua 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 một tài khoản người dùng hiện có.

Để đăng xuất một người dùng, hãy gọi SignOut():

auth.SignOut();