Ứng dụng xác thực với Touch ID bằng Swift

105

TouchID

Một vài năm trước Apple đã giới thiệu Touch ID trên iPhone 5s. Thay vì yêu cầu người dùng nhập password, bạn có thể yêu cầu xác thực bằng vân tay (nếu thiết bị của họ có Touch ID) để cải thiện UX.

Với sự ra đời của iOS 7, các lập trình viên không thể sử dụng bộ cảm biến vân tay để xác thực. May mắn thay, với iOS 8, Apple đã cung cấp cho chúng ta một API để làm điều đó.

Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu cách tích hợp việc xác thực bằng Touch ID vào trong ứng dụng.

Local Authentication framework

Nếu bạn muốn làm việc với TouchID, bạn phải tích hợp Local Authentication framework vào trong ứng dụng của bạn.

Đứng từ Project Settings > General và cuộn xuống tới Linked Frameworks and Libraries section. Click vào dấu + sign and add LocalAuthentication.framework.

Authentication view controller

Trong ví dụ này, chúng ta chỉ hiển thị cho người dùng một màn hình với một nút login. Nếu người dùng nhấn vào nút login, họ sẽ được yêu cầu xác thực bằng Touch ID. Nếu xác thực thất bại, chúng ta sẽ hiển thị tin nhắn báo lỗi. Nếu thành công chúng ta sẽ đẩy tới một viewcontroller mới bằng navigation

Storyboard của chúng ta sẽ có các thành phần theo cấp bậc này:

  • UINavigationController: root view controller
    • AuthenticationViewController
      • UIButton : login
    • ProtectedContentViewController
      • UILabel : success message

Chúng ta liên kết nút login với file quản trị của nó là AuthenticationViewController với kiểu UIButton.

Việc tiếp theo chúng ta cần làm là import Local Authentication framework ở trong file AuthenticationViewController.

Local Authentication framework khá nhỏ so với tiêu chuẩn của Apple. Nó chỉ có một class tên là LAContext.

Tiếp theo chúng ta sẽ tạo một authentication context. Điều này được thực hiện bằng cách tạo một đối tượng từ class LAContext.

Bởi vì không phải thiết bị nào cũng có bộ cảm biến Touch ID, chúng ta cần phải xem xét nếu thiết bị đó có bộ cảm biến vân tay không.

Check for TouchID availability

Chúng ta làm điều này bằng cách gọi hàm canEvaluatePolicy:error. Hàm này sẽ trả về một biến kiểu boolean mà bạn có thể dùng để cung cấp một phương pháp xác thực dự phòng nếu thiết bị không có Touch ID. 

Chúng ta sử dụng từ khoá guard (được giới thiệu trong Swift 2), bởi vì hàm này cần trả về true, ngược lại nếu không có thì sẽ thực hiện phần còn lại của hàm này. Bây giờ, bạn chỉ hiển thị cho người dùng với một UIAlertViewController để đưa ra một số thông tin phản hồi.

Validating the fingerprint

Nếu thiết bị có bộ cảm biến Touch ID, chúng ta muốn hiển thị cho người dùng thấy dưới dạng Touch ID form.

Popup này sẽ hiển thị khi bạn gọi hàm evaluatePolicy:localizedReason:reply: trong ngữ cảnh xác thực.

Hàm này có 3 tham số:

  1. policy: policy để thẩm định
  2. localizedReason: một chuỗi tin nhắn mà nó sẽ hiển thị cho người dùng, giải thích lý do vì sao họ cần cung cấp dấu vân tay
  3. reply: một closure được thực hiện khi việc thẩm định kết thúc. Closure này có 2 tham số:
    1. success: là true nếu vân tay được chấp nhận, ngược lại là false
    2. error: là đối tượng NSError với một error code (kiểm tra LAError cho các tuỳ chọn)

Đây là đoạn code:

Handling success

Hàm navigateToAuthenticatedViewController chỉ nhận một viewcontroller trong Storyboard và thực hiện pushViewController bằng navigationcontroller.

Handling failure

Nếu xuất hiện lỗi, chúng ta có một hàm để trả về lỗi dựa trên error code. Error code có thể so sánh với class LAError.

Source code