Thực hiện Xác minh SMS trên máy chủ

Để tự động xác minh số điện thoại, bạn phải triển khai cả phần máy khách và máy chủ của quy trình xác minh. Tài liệu này mô tả cách triển khai phần máy chủ.

Máy chủ xác minh số điện thoại chịu trách nhiệm thực hiện 3 tác vụ:

  1. Tạo thông báo xác minh chứa mã một lần và có định dạng mà API SMS Retriever phía máy khách yêu cầu
  2. Gửi tin nhắn xác minh tới thiết bị của người dùng
  3. Xác minh mã một lần khi mã được gửi trở lại máy chủ và hoàn tất mọi tác vụ sau xác minh mà phần phụ trợ của bạn yêu cầu

Chi tiết cụ thể về cách ứng dụng tương tác với máy chủ là tuỳ thuộc vào bạn. Một phương pháp phổ biến là hiển thị API REST với 2 điểm cuối: một điểm cuối nhận yêu cầu xác minh một số điện thoại nhất định và gửi tin nhắn xác minh qua SMS, còn điểm cuối thứ hai nhận mã một lần từ ứng dụng của bạn.

1. Tạo thông báo xác minh

Khi máy chủ của bạn nhận được yêu cầu xác minh số điện thoại, trước tiên, hãy tạo thông báo xác minh mà bạn sẽ gửi đến thiết bị của người dùng. Thông báo này phải:

  • Không dài quá 140 byte
  • Chứa mã một lần mà ứng dụng gửi lại tới máy chủ của bạn để hoàn tất quy trình xác minh (xem phần Tạo mã một lần)
  • Bao gồm một chuỗi băm gồm 11 ký tự giúp nhận dạng ứng dụng của bạn (xem phần Tính toán chuỗi băm của ứng dụng)

Nếu không, bạn có thể tuỳ ý chọn nội dung của thư xác minh. Bạn nên tạo một thông báo để có thể dễ dàng trích xuất mã một lần sau này. Ví dụ: thông báo xác minh hợp lệ có thể có dạng như sau:

Your ExampleApp code is: 123ABC78

FA+9qCX9VSu

Tạo mã một lần

Bạn có thể triển khai mã một lần theo nhiều cách, miễn là các mã này không thể dự đoán được và bạn có thể liên kết các mã đó với người dùng hoặc số điện thoại khi ứng dụng khách gửi chúng trở lại máy chủ của bạn. Bạn nên làm cho các mã dễ nhập để hỗ trợ mọi tình huống có thể yêu cầu người dùng nhập mã theo cách thủ công.

Có một cách để triển khai mã một lần là tạo các số ngẫu nhiên. Bạn sẽ sử dụng các số này làm khoá trong bảng cơ sở dữ liệu. Ví dụ: bạn có thể có bảng Phần mềm đang chờ xử lý như sau:

Mã nhận dạng Người dùng Ngày hết hạn
123456789... 1234 14-3-2017 1:59

Bạn có thể sử dụng mã nhận dạng được mã hoá base32 làm mã một lần.

Tính toán chuỗi băm của ứng dụng

Dịch vụ Google Play sử dụng chuỗi băm để xác định thông báo xác minh cần gửi tới ứng dụng của bạn. Chuỗi băm bao gồm tên gói của ứng dụng và chứng chỉ khoá công khai của ứng dụng. Cách tạo chuỗi băm:

  1. Nếu bạn sử dụng tính năng ký ứng dụng của Google Play, hãy tải chứng chỉ ký ứng dụng của bạn xuống (deployment_cert.der) từ phần Ký ứng dụng của Google Play Console.

    Sau đó, hãy nhập chứng chỉ ký ứng dụng vào kho khoá tạm thời:

    keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
    

    Nếu bạn ký trực tiếp APK, hãy bỏ qua bước này.

  2. Lấy chứng chỉ ký ứng dụng của bạn (chứng chỉ mà bạn đã nhập ở trên hoặc chứng chỉ bạn dùng để ký trực tiếp tệp APK của mình) dưới dạng một chuỗi hex viết thường.

    Ví dụ: để lấy chuỗi hex từ kho khoá tạm thời đã tạo ở trên, hãy nhập lệnh sau:

    keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
    

    Nếu bạn ký trực tiếp tệp APK, hãy chỉ định kho khoá sản xuất và bí danh chứng chỉ của bạn.

  3. Nếu bạn đã tạo một kho khoá tạm thời, hãy xoá kho khoá đó.

  4. Thêm chuỗi hex vào tên gói của ứng dụng (phân tách bằng một dấu cách).

  5. Tính tổng SHA-256 của chuỗi kết hợp. Hãy nhớ xoá mọi khoảng trắng ở đầu hoặc ở cuối khỏi chuỗi trước khi tính tổng SHA-256.

  6. Mã hoá Base64 giá trị nhị phân của tổng SHA-256. Trước tiên, bạn có thể cần giải mã tổng SHA-256 từ định dạng đầu ra của mã đó.

  7. Chuỗi băm của ứng dụng là 11 ký tự đầu tiên của hàm băm được mã hoá base64.

Lệnh sau tính toán chuỗi băm từ kho khoá sản xuất của ứng dụng:

keytool -exportcert -alias PlayDeploymentCert -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

Ngoài ra, bạn có thể lấy chuỗi băm của ứng dụng bằng lớp AppSignatureHelper trong ứng dụng mẫu trình truy xuất SMS. Tuy nhiên, nếu bạn sử dụng lớp trình trợ giúp, hãy nhớ xoá chuỗi đó khỏi ứng dụng sau khi nhận được chuỗi băm. Đừng sử dụng các chuỗi băm được tính toán động trên ứng dụng trong thông báo xác minh của bạn.

2. Gửi tin nhắn xác minh qua SMS

Sau khi bạn tạo thông báo xác minh, hãy gửi tin nhắn đến số điện thoại của người dùng bằng bất kỳ hệ thống SMS nào.

Ví dụ: xem phần Xác minh ứng dụng bằng Twilio SMS trên trang web dành cho nhà phát triển của Twilio.

Khi thiết bị của người dùng nhận được thông báo này, thông báo sẽ được chuyển hướng đến ứng dụng của bạn. Ứng dụng sẽ trích xuất mã một lần và gửi lại mã này trở lại máy chủ để hoàn tất quá trình xác minh.

3. Xác minh mã một lần khi mã được trả về

Máy chủ xác minh số điện thoại thường có điểm cuối thứ hai. Điểm cuối này sẽ được dùng để nhận lại mã một lần từ ứng dụng khách. Khi máy chủ nhận được mã một lần từ ứng dụng của bạn tại điểm cuối này, hãy làm như sau:

  1. Xác minh rằng mã một lần là hợp lệ và chưa hết hạn.
  2. Hãy ghi nhận rằng người dùng được liên kết với mã một lần đã hoàn tất quy trình xác minh số điện thoại.
  3. Xoá bản ghi cơ sở dữ liệu của mã một lần hoặc theo cách khác để đảm bảo rằng không ai có thể sử dụng lại cùng một mã.

Khi bạn ghi lại trạng thái xác minh của người dùng và xoá mã một lần khỏi cơ sở dữ liệu, quá trình xác minh đã hoàn tất.