Touch ID や Face ID で認証を行う方法

スマートフォンはすっかり私たちの暮らしに浸透して、まさに生活に不可欠になりました。

それに伴って、利用範囲はどんどん増えてきており、スマートフォンを安全に使うことは非常に重要となっています。

プログラミングをする側の立場で言えば、安全なアプリケーションを開発することの重要性が高まっているということですね。

ここでは Touch ID や Face ID による認証を自分のアプリケーションに組み込む方法について説明します。

1. Touch ID / Face ID とは?

Touch ID (タッチ・アイディー) というのは、Apple のデバイスにおける、指紋を使って認証を行う機能の名称です。 iPhone 5S 以降で利用可能になりました。

「認証」(authentication) というのは「誰であるか識別する」ということです。

ただし、iPhone X や iPhone 11 のシリーズは後述の Face ID という、他の認証機能を採用しているので Touch ID は使えません。

指紋のパターンは全て異なっていますが、たまたま指紋の一部分が似ていて、同じ指紋であると認識される確率は、 アップルの資料によればおよそ5万分の1です。Touch ID を使って指紋認証を試みて、5回失敗したらパスコードを入力するように促されるので、 何度も試すことも難しい仕組みになっています。

Face ID (フェイス・アイディー) というのは、Apple のデバイスにおける、顔を使って認証を行う機能の名称です。 iPhone X ではじめて利用可能になりました。

顔に3万点以上の数の赤外線ドットをあて顔の凹凸を含む形状と、赤外線イメージを保存しておき、その情報をもとに本人かどうか確認する仕組みになっています。

アップルの資料によれば赤の他人がたまたま本人とみなされる確率は 100万分の1程度とのことです。 この数字だけで言えば Face ID は Touch ID よりかなり安全性が高いと言えそうです。ただし、 双子や似ている兄弟姉妹、あるいは 13歳未満の子供の場合はパスコードを使うことが推奨されています。

このように指紋や顔といった、身体的特徴を使って認証を行うことを、生体認証あるいはバイオメトリックス認証といいます。

「バイオ」という言葉は生物を表していて、「メトリックス」は測定とか計測を意味する言葉です。バイオメトリックスというと、 生物データを数値測定して利用する技術を意味します。

2. Touch ID / Face ID で認証する方法

それではさっそく、簡単なサンプルプログラムを作って、Touch ID や Face ID の使い方をみていきましょう。

まず、ストーリーボードでボタンとラベルを1つずつ配置します。

今回、このボタンをタップしたら認証を行って、正しく認証できればラベルに「Authenticated (認証されました)」と表示し、なんらかの理由で認証ができなかった場合は、 エラーコードを表示します。

ラベルのアウトレットを resultLabel として作成します。また、 ボタンのアクションを testPressed という名前の関数にします。

iPhone のバイオメトリクスの機能を使って認証を行うコードは次のようになります。

import UIKit
import LocalAuthentication

class ViewController: UIViewController {

  @IBOutlet weak var resultLabel: UILabel!
  
  override func viewDidLoad() {
    super.viewDidLoad()
  }

  @IBAction func testPressed(_ sender: Any) {
    
    let context = LAContext()
    let reason = "This app uses Touch ID / Facd ID to secure your data."
    var authError: NSError?
    
    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) {
      context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { (success, error) in
        if success {
          self.setMessage("Authenticated")
        } else {
          let message = error?.localizedDescription ?? "Failed to authenticate"
          self.setMessage(message)
        }
      }
    } else {
      let message = authError?.localizedDescription ?? "canEvaluatePolicy returned false"
      setMessage(message)
    }
  }
  
  func setMessage(_ message: String) {
    DispatchQueue.main.async { [unowned self] in
      self.resultLabel.text = message
    }
  }
  
}

LAContextcanEvaluatePolicy 関数で バイオメトリクスを用いた認証が可能かどうかチェックします。

バイオメトリクスを用いた認証が利用可能ではない理由としては、iPhone 5 以前の iPhone を利用しているとか、 Touch ID や Face ID が利用可能な機種でもそれらの利用登録 (enroll) ができていない、ということが考えられます。

利用可能となれば、evaluatePolicy 関数を使って、認証を行います。

認証の結果は、非同期でバックグラウンドのスレッドでクロージャが呼ばれることで、チェックできます。 認証が成功すれば上記コードのトレーリングクロージャの1つ目のパラメータ successtrue となり、 呼び出されます。

クロージャについては 「クロージャ | Swift の基本」で説明しています。 苦手な人はそちらも参考にしてください。

つまり、if success { ... の箇所が認証が成功した時に実行されるコードブロックになります。 今回は "Authenticated" という文字をセットしているだけです。

クロージャばバックグラウンドスレッドで呼ばれているので、UI コンポーメントの更新ができません。このため、 ここでは setMessage という関数を作り、そこでメインスレッドに処理をディスパッチして、 ラベルを更新しています。

Face ID のために Info.plist の構成も必要

Touch ID を使うだけなら上記のコードを書けばすぐに動作します。

Face ID にも対応するには Info.plistPrivacy - Face ID Usage Description も登録する必要があります。

コードはこれだけです。簡単ですね。

3. Touch ID / Face ID の動作確認

上のコードを書いたら動作確認をしてみましょう。

もちろん実機で確認できるのが良いのですが、シミュレーターを使ってもテストできるようになっています。

3-1. シミュレータの設定

まずは iPhone 8 のシミュレータで上記コードを実行して、TEST ボタンをタップすると次のようなメッセージが表示されると思います。

これは指紋が登録されていないために発生してします。

そこで Hardware メニューから Touch ID > Enrolled を選択します。

有効になると Enrolled の横にチェックマークがつきます。

この状態で再度 TEST をタップすれば、次のように Touch ID のプロンプトが表示されるはずです。

シミュレータを使うには Enrolled の下にあるメニューから、 Matching TouchNon-matching Touch を選択します。

3-2. Touch ID による認証

こちらは実機 (iPhone 7) での動作確認の様子です。

TEST をタップすると、次のように Touch ID のプロンプトが表示されます。

正しく認証されると "Authenticated" と画面に表示されるはずです。

正しくない場合は、自動的に次のようにプロンプトが再表示されます。パスコードを入力することも可能です。

数回正しくない入力があると自動的にパスコードの入力画面が表示されます。

処理をキャンセルすると、認証の失敗理由として "Canceled by user" (ユーザーがキャンセルしました) と表示されます。

iPhone ユーザーなら、とても自然な見慣れた流れになっています。こんな便利な機能を、自分のアプリでも簡単に利用できるのがありがたいですね。

3-3. Face ID による認証

Face ID の場合は流れが Touch ID の場合と少し変わり、アプリの初回利用時に Face ID を使って良いかどうか、ユーザーに確認します。

OK とすれば、Face ID がそのまま利用できます。

しかし Face ID の利用をユーザーが許可しなければ、認証の失敗メッセージとして次のような内容が表示されます。

いずれにしても、基本的な利用の流れは Touch ID でも Face ID でも同様なので、同じコードで両方をサポートすることができます。

以上、ここでは Touch ID と Face ID の利用方法について、とても単純なコードを使って説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Swift による iOS 開発入門