Xác thực với Firebase bằng số điện thoại bằng JavaScript,Xác thực bằng Firebase bằng số điện thoại bằng JavaScript

Bạn có thể sử dụng Xác thực Firebase để đăng nhập người dùng bằng cách gửi tin nhắn SMS tới đ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.

Cách dễ nhất để thêm thông tin đăng nhập bằng số điện thoại vào ứng dụng của bạn là sử dụng FirebaseUI , bao gồm tiện ích đăng nhập thả xuống triển khai luồng đăng nhập để đăng nhập bằng số điện thoại, cũng như dấu hiệu liên kết và dựa trên mật khẩu -TRONG. Tài liệu này mô tả cách triển khai luồng đăng nhập bằng số điện thoại bằng SDK Firebase.

Trước khi bắt đầu

Nếu bạn chưa sao chép, hãy sao chép đoạn mã khởi tạo từ bảng điều khiển Firebase vào dự án của bạn như được mô tả trong Thêm Firebase vào dự án JavaScript của bạn .

Mối lo ngại về an ninh

Việc xác thực chỉ sử dụng số điện thoại tuy thuận tiện nhưng lại kém an toàn hơn các phương pháp hiện có khác vì việc sở hữu số điện thoại có thể dễ dàng được chuyển giao giữa những người dùng. 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 tài khoản bằng số điện thoại của thiết bị.

Nếu sử dụng tính năng đăng nhập dựa trên số điện thoại trong ứng dụng của mình, 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 và thông báo cho người dùng về những cân nhắc về bảo mật khi sử dụng tính năng đăng nhập bằng số điện thoại.

Bật đă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 Số điện thoại cho dự án Firebase của mình:

  1. Trong bảng điều khiển Firebase , hãy mở phần Xác thực .
  2. Trên trang Phương thức đăng nhập , bật phương thức đăng nhập Số điện thoại .
  3. Trên cùng một trang, nếu miền sẽ lưu trữ ứng dụng của bạn không được liệt kê trong phần miền chuyển hướng OAuth , hãy thêm miền của bạn.

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 các ứng dụng sẽ không bị ảnh hưởng. Tuy nhiên, nếu bạn cần đăng nhập vào một lượng lớn người dùng bằng xác thực điện thoại, bạn có thể cần phải nâng cấp gói giá của mình. Xem trang định giá .

Thiết lập trình xác minh reCAPTCHA

Trước khi có thể đăng nhập người dùng bằng số điện thoại của họ, bạn phải thiết lập trình xác minh reCAPTCHA của Firebase. Firebase sử dụng reCAPTCHA để ngăn chặn hành vi lạm dụng, chẳng hạn như bằng cách đảm bảo rằng yêu cầu xác minh số điện thoại đến từ một trong các miền được phép của ứng dụng của bạn.

Bạn không cần thiết lập ứng dụng khách reCAPTCHA theo cách thủ công; khi bạn sử dụng đối tượng RecaptchaVerifier của SDK Firebase, Firebase sẽ tự động tạo và xử lý mọi khóa và bí mật cần thiết của ứng dụng khách.

Đối tượng RecaptchaVerifier hỗ trợ reCAPTCHA vô hình , thường có thể xác minh người dùng mà không yêu cầu bất kỳ hành động nào của người dùng, cũng như tiện ích reCAPTCHA luôn yêu cầu sự tương tác của người dùng để hoàn tất thành công.

ReCAPTCHA được hiển thị cơ bản có thể được bản địa hóa theo tùy chọn của người dùng bằng cách cập nhật mã ngôn ngữ trên phiên bản Auth trước khi hiển thị reCAPTCHA. Việc bản địa hóa nói trên cũng sẽ áp dụng cho tin nhắn SMS chứa mã xác minh được gửi cho người dùng.

Web modular API

import { getAuth } from "firebase/auth";

const auth = getAuth();
auth.languageCode = 'it';
// To apply the default browser preference instead of explicitly setting it.
// auth.useDeviceLanguage();

Web namespaced API

firebase.auth().languageCode = 'it';
// To apply the default browser preference instead of explicitly setting it.
// firebase.auth().useDeviceLanguage();

Sử dụng reCAPTCHA vô hình

Để sử dụng reCAPTCHA ẩn, hãy tạo đối tượng RecaptchaVerifier với thông số size được đặt thành invisible , chỉ định ID của nút gửi biểu mẫu đăng nhập của bạn. Ví dụ:

Web modular API

import { getAuth, RecaptchaVerifier } from "firebase/auth";

const auth = getAuth();
window.recaptchaVerifier = new RecaptchaVerifier(auth, 'sign-in-button', {
  'size': 'invisible',
  'callback': (response) => {
    // reCAPTCHA solved, allow signInWithPhoneNumber.
    onSignInSubmit();
  }
});

Web namespaced API

window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('sign-in-button', {
  'size': 'invisible',
  'callback': (response) => {
    // reCAPTCHA solved, allow signInWithPhoneNumber.
    onSignInSubmit();
  }
});

Sử dụng tiện ích reCAPTCHA

Để sử dụng tiện ích reCAPTCHA hiển thị, hãy tạo một phần tử trên trang của bạn để chứa tiện ích, sau đó tạo đối tượng RecaptchaVerifier , chỉ định ID của vùng chứa khi bạn làm như vậy. Ví dụ:

Web modular API

import { getAuth, RecaptchaVerifier } from "firebase/auth";

const auth = getAuth();
window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', {});

Web namespaced API

window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');

Tùy chọn: Chỉ định tham số reCAPTCHA

Bạn có thể tùy ý đặt các hàm gọi lại trên đối tượng RecaptchaVerifier được gọi khi người dùng giải quyết reCAPTCHA hoặc reCAPTCHA hết hạn trước khi người dùng gửi biểu mẫu:

Web modular API

import { getAuth, RecaptchaVerifier } from "firebase/auth";

const auth = getAuth();
window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', {
  'size': 'normal',
  'callback': (response) => {
    // reCAPTCHA solved, allow signInWithPhoneNumber.
    // ...
  },
  'expired-callback': () => {
    // Response expired. Ask user to solve reCAPTCHA again.
    // ...
  }
});

Web namespaced API

window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container', {
  'size': 'normal',
  'callback': (response) => {
    // reCAPTCHA solved, allow signInWithPhoneNumber.
    // ...
  },
  'expired-callback': () => {
    // Response expired. Ask user to solve reCAPTCHA again.
    // ...
  }
});

Tùy chọn: Kết xuất trước reCAPTCHA

Nếu bạn muốn kết xuất trước reCAPTCHA trước khi gửi yêu cầu đăng nhập, hãy gọi render :

Web modular API

recaptchaVerifier.render().then((widgetId) => {
  window.recaptchaWidgetId = widgetId;
});

Web namespaced API

recaptchaVerifier.render().then((widgetId) => {
  window.recaptchaWidgetId = widgetId;
});

Sau khi render giải quyết, bạn sẽ nhận được ID tiện ích của reCAPTCHA mà bạn có thể sử dụng để thực hiện lệnh gọi tới API reCAPTCHA :

Web modular API

const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);

Web namespaced API

const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);

Gửi mã xác minh tới đ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 giao diện nhắc họ cung cấp số điện thoại của mình, sau đó gọi signInWithPhoneNumber để 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 SMS:

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

    Các yêu cầu pháp lý khác nhau, nhưng theo phương pháp hay nhất và để đặt kỳ vọng cho người dùng, bạn nên thông báo cho họ 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à áp dụng mức giá tiêu chuẩn.

  2. Gọi signInWithPhoneNumber , chuyển tới số điện thoại của người dùng và RecaptchaVerifier mà bạn đã tạo trước đó.

    Web modular API

    import { getAuth, signInWithPhoneNumber } from "firebase/auth";
    
    const phoneNumber = getPhoneNumberFromUserInput();
    const appVerifier = window.recaptchaVerifier;
    
    const auth = getAuth();
    signInWithPhoneNumber(auth, phoneNumber, appVerifier)
        .then((confirmationResult) => {
          // SMS sent. Prompt user to type the code from the message, then sign the
          // user in with confirmationResult.confirm(code).
          window.confirmationResult = confirmationResult;
          // ...
        }).catch((error) => {
          // Error; SMS not sent
          // ...
        });

    Web namespaced API

    const phoneNumber = getPhoneNumberFromUserInput();
    const appVerifier = window.recaptchaVerifier;
    firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier)
        .then((confirmationResult) => {
          // SMS sent. Prompt user to type the code from the message, then sign the
          // user in with confirmationResult.confirm(code).
          window.confirmationResult = confirmationResult;
          // ...
        }).catch((error) => {
          // Error; SMS not sent
          // ...
        });
    Nếu signInWithPhoneNumber gây ra lỗi, hãy đặt lại reCAPTCHA để người dùng có thể thử lại:
    grecaptcha.reset(window.recaptchaWidgetId);
    
    // Or, if you haven't stored the widget ID:
    window.recaptchaVerifier.render().then(function(widgetId) {
      grecaptcha.reset(widgetId);
    });
    

Phương thức signInWithPhoneNumber đưa ra thử thách reCAPTCHA cho người dùng và nếu người dùng vượt qua thử thách, nó sẽ yêu cầu Xác thực Firebase gửi tin nhắn SMS chứa mã xác minh tới điện thoại của người dùng.

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

Sau khi cuộc gọi tới signInWithPhoneNumber thành công, hãy nhắc người dùng nhập mã xác minh mà họ nhận được qua SMS. Sau đó, đăng nhập người dùng bằng cách chuyển mã tới phương thức confirm của đối tượng ConfirmationResult đã được chuyển tới trình xử lý thực hiện của signInWithPhoneNumber (nghĩa là khối then của nó). Ví dụ:

Web modular API

const code = getCodeFromUserInput();
confirmationResult.confirm(code).then((result) => {
  // User signed in successfully.
  const user = result.user;
  // ...
}).catch((error) => {
  // User couldn't sign in (bad verification code?)
  // ...
});

Web namespaced API

const code = getCodeFromUserInput();
confirmationResult.confirm(code).then((result) => {
  // User signed in successfully.
  const user = result.user;
  // ...
}).catch((error) => {
  // User couldn't sign in (bad verification code?)
  // ...
});

Nếu cuộc gọi confirm thành công thì người dùng đã đăng nhập thành công.

Lấy đối tượng AuthCredential trung gian

Nếu bạn cần lấy đối tượng AuthCredential cho tài khoản người dùng, hãy chuyển mã xác minh từ kết quả xác nhận và mã xác minh tới PhoneAuthProvider.credential thay vì gọi confirm :

var credential = firebase.auth.PhoneAuthProvider.credential(confirmationResult.verificationId, code);

Sau đó, bạn có thể đăng nhập người dùng bằng thông tin xác thực:

firebase.auth().signInWithCredential(credential);

Thử nghiệm với số điện thoại hư cấu

Bạn có thể thiết lập số điện thoại hư cấu để phát triển thông qua bảng điều khiển Firebase. Thử nghiệm với số điện thoại hư cấu mang lại những lợi ích sau:

  • Kiểm tra xác thực số điện thoại mà không tiêu tốn hạn ngạch sử dụng của bạn.
  • Kiểm tra xác thực số điện thoại mà không gửi tin nhắn SMS thực tế.
  • Chạy các bài kiểm tra liên tiếp với cùng một số điện thoại mà không bị hạn chế. Điều này giảm thiểu nguy cơ bị từ chối trong quá trình đánh giá trên App Store nếu người đánh giá tình cờ sử dụng cùng một số điện thoại để thử nghiệm.
  • Dễ dàng kiểm tra trong môi trường phát triển mà không cần nỗ lực thêm, chẳng hạn như khả năng phát triển trong trình mô phỏng iOS hoặc trình mô phỏng Android mà không cần Dịch vụ của Google Play.
  • Viết các bài kiểm tra tích hợp mà không bị chặn bởi các kiểm tra bảo mật thường được áp dụng trên số điện thoại thực trong môi trường sản xuất.

Số điện thoại hư cấu phải đáp ứng các yêu cầu sau:

  1. Đảm bảo bạn sử dụng số điện thoại thực sự là hư cấu và chưa tồn tại. Xác thực Firebase không cho phép bạn đặt số điện thoại hiện có được người dùng thực sử dụng làm số thử nghiệm. Một tùy chọn là sử dụng các số có tiền tố 555 làm số điện thoại thử nghiệm ở Hoa Kỳ, ví dụ: +1 650-555-3434
  2. Số điện thoại phải được định dạng chính xác về độ dài và các ràng buộc khác. Họ vẫn sẽ trải qua quá trình xác thực giống như số điện thoại của người dùng thực.
  3. Bạn có thể thêm tối đa 10 số điện thoại để phát triển.
  4. Sử dụng số/mã điện thoại thử nghiệm khó đoán và thay đổi chúng thường xuyên.

Tạo số điện thoại hư cấu và mã xác minh

  1. Trong bảng điều khiển Firebase , hãy mở phần Xác thực .
  2. Trong tab Phương thức đăng nhập , hãy bật Nhà cung cấp điện thoại nếu bạn chưa bật.
  3. Mở menu Số điện thoại để kiểm tra đàn accordion.
  4. Cung cấp số điện thoại bạn muốn kiểm tra, ví dụ: +1 650-555-3434 .
  5. Cung cấp mã xác minh gồm 6 chữ số cho số cụ thể đó, ví dụ: 654321 .
  6. Thêm số. Nếu có nhu cầu, bạn có thể xóa số điện thoại và mã số đó bằng cách di chuột qua hàng tương ứng và nhấn vào biểu tượng thùng rác.

Kiểm tra bằng tay

Bạn có thể trực tiếp bắt đầu sử dụng số điện thoại hư cấu trong ứng dụng của mình. Điều này cho phép bạn thực hiện kiểm tra thủ công trong các giai đoạn phát triển mà không gặp phải vấn đề về hạn ngạch hoặc hạn chế. Bạn cũng có thể kiểm tra trực tiếp từ trình mô phỏng iOS hoặc trình mô phỏng Android mà không cần cài đặt Dịch vụ Google Play.

Khi bạn cung cấp số điện thoại hư cấu và gửi mã xác minh, sẽ không có SMS thực tế nào được gửi. Thay vào đó, bạn cần cung cấp mã xác minh đã định cấu hình trước đó để hoàn tất quá trình đăng nhập.

Khi hoàn tất đăng nhập, người dùng Firebase sẽ được tạo bằng số điện thoại đó. Người dùng có hành vi và thuộc tính giống như người dùng số điện thoại thực và có thể truy cập Cơ sở dữ liệu thời gian thực/Cloud Firestore và các dịch vụ khác theo cùng một cách. Mã thông báo ID được tạo ra trong quá trình này có cùng chữ ký với người dùng số điện thoại thực.

Một tùy chọn khác là đặt vai trò thử nghiệm thông qua xác nhận quyền sở hữu tùy chỉnh đối với những người dùng này để phân biệt họ là người dùng giả mạo nếu bạn muốn hạn chế hơn nữa quyền truy cập.

Thử nghiệm hội nhập

Ngoài thử nghiệm thủ công, Xác thực Firebase còn cung cấp API để giúp viết thử nghiệm tích hợp cho thử nghiệm xác thực điện thoại. Các API này vô hiệu hóa xác minh ứng dụng bằng cách vô hiệu hóa yêu cầu reCAPTCHA trên web và tắt thông báo đẩy trong iOS. Điều này giúp cho việc thử nghiệm tự động hóa có thể thực hiện được trong các luồng này và dễ thực hiện hơn. Ngoài ra, chúng còn giúp cung cấp khả năng kiểm tra các luồng xác minh tức thì trên Android.

Trên web, đặt appVerificationDisabledForTesting thành true trước khi hiển thị firebase.auth.RecaptchaVerifier . Thao tác này sẽ tự động giải quyết reCAPTCHA, cho phép bạn chuyển số điện thoại mà không cần giải quyết thủ công. Lưu ý rằng ngay cả khi reCAPTCHA bị tắt, việc sử dụng số điện thoại không hư cấu vẫn sẽ không hoàn tất quá trình đăng nhập. Chỉ những số điện thoại hư cấu mới có thể được sử dụng với API này.

// Turn off phone auth app verification.
firebase.auth().settings.appVerificationDisabledForTesting = true;

var phoneNumber = "+16505554567";
var testVerificationCode = "123456";

// This will render a fake reCAPTCHA as appVerificationDisabledForTesting is true.
// This will resolve after rendering without app verification.
var appVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');
// signInWithPhoneNumber will call appVerifier.verify() which will resolve with a fake
// reCAPTCHA response.
firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier)
    .then(function (confirmationResult) {
      // confirmationResult can resolve with the fictional testVerificationCode above.
      return confirmationResult.confirm(testVerificationCode)
    }).catch(function (error) {
      // Error; SMS not sent
      // ...
    });

Trình xác minh ứng dụng reCAPTCHA mô phỏng hiển thị và vô hình hoạt động khác nhau khi tắt xác minh ứng dụng:

  • ReCAPTCHA hiển thị : Khi reCAPTCHA hiển thị được hiển thị thông qua appVerifier.render() , nó sẽ tự động phân giải sau một phần giây trễ. Điều này tương đương với việc người dùng nhấp vào reCAPTCHA ngay khi kết xuất. Phản hồi reCAPTCHA sẽ hết hạn sau một thời gian và sau đó tự động giải quyết lại.
  • ReCAPTCHA vô hình : ReCAPTCHA vô hình không tự động phân giải khi hiển thị và thay vào đó thực hiện như vậy trong lệnh gọi appVerifier.verify() hoặc khi nút neo của reCAPTCHA được nhấp vào sau một phần giây trễ. Tương tự, phản hồi sẽ hết hạn sau một thời gian và sẽ chỉ tự động giải quyết sau lệnh gọi appVerifier.verify() hoặc khi người dùng nhấp lại vào nút neo của reCAPTCHA.

Bất cứ khi nào reCAPTCHA mô phỏng được giải quyết, chức năng gọi lại tương ứng sẽ được kích hoạt như mong đợi với phản hồi giả. Nếu lệnh gọi lại hết hạn cũng được chỉ định, nó sẽ kích hoạt khi hết hạn.

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 xác thực—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 của bạn và có thể được sử 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 ứng dụng của bạn, cách được khuyên dùng để biết trạng thái xác thực của người dùng là đặt trình quan sát trên đối tượng Auth . Sau đó, bạn có thể lấy thông tin hồ sơ cơ bản của người dùng từ đối tượng User . Xem Quản lý người dùng .

  • Trong Quy tắc bảo mật cơ sở dữ liệu thời gian thực và lưu trữ đám mây của Firebase, bạn có thể lấy ID người dùng duy nhất của người dùng đã đăng nhập từ biến auth và sử dụng nó để kiểm soát dữ liệu nào 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 bằng nhiều nhà cung cấp xác thực bằng cách liên kết thông tin xác thực của nhà cung cấp 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 :

Web modular API

import { getAuth, signOut } from "firebase/auth";

const auth = getAuth();
signOut(auth).then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});

Web namespaced API

firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});