🔒

SwiftUIでFaceIDを使って生体認証をやってみた!

2024/03/04に公開

読んでほしい人

  • SwiftUIを勉強してる人
  • FaceIDを使ってみたい
  • 生体認証に興味がある

補足情報

info.plistの設定をしないと、FaceIDは使えないのでこちらの動画を参考に設定してみてください。実験するときは、私は実機のiPhone使わないとできなかったです💦
https://www.youtube.com/watch?v=8MLdq9kotII

記事の内容

SwiftUIの生体認証を使ってローカルログインなるものを試してみようと思って今回学習をしてみたことを記事にしようと思いました。参考にした動画のコードを改良してログインするときに、すぐに画面が切り替わるので3秒間遅延処理をして、画面遷移させております。

そもそも生体認証とは???
https://www.nec-solutioninnovators.co.jp/ss/kaoato/column/08/

🔑生体認証とは

生体認証(バイオメトリクス認証)とは、身体に関連する要素を用いて認証を行う高度技術です。顔や指紋、声、静脈など本人を特定できる情報を事前にシステムへ登録しておき、本人が持つ身体的特徴と一致するかどうかを照合して認証します。人間の身体は一人ひとり異なるので、パスワード認証など他の認証方式と比較して、なりすましが困難で安全性が高く、金融機関など高度なセキュリティが求められるシーンでよく利用されています。ただ、導入コストに関しては、他の認証方式と比較すると高額なものが多いです。
身近な例を挙げると、スマートフォンのロック解除にも、顔認証や指紋認証が採用されています。近年、不正アクセスによる情報漏えいやサービス停止などが相次いでおり、安全性を高めるために堅牢な認証方式が欠かせません。

🔑 生体認証の種類と特徴

認証を行うための情報は大きく分けて、パスワードやPINコードなど本人だけが知っている情報を用いる「知識情報」、ICカードやスマートフォンなど本人だけが持つ「所持情報」、そして本人の身体的要素を用いる「生体情報」の3種類です。生体認証に用いられる要素には、顔や指紋などよく知られたもののほかに、虹彩やDNAもあります。それぞれどのような特徴があるのか、得られるメリットおよび利用する際に懸念される点も含めて解説します。

こちらがDemo用のソースコードです。ボタンを押したらログインできるので、自分の顔を登録して認証をするロジックまでは作っていないです🙇

import SwiftUI
import LocalAuthentication

struct ContentView: View {
    @State private var isUnlocked = false
    
    var body: some View {
        VStack {
            if isUnlocked {
                HelloView()
            } else {
              Image(systemName: "lock.square")
                    .font(.system(size: 100))
                    .padding()
                
                Button("Authenticate") {
                    authenticate()
                }
            }
        }
    }
    
    func authenticate() {
        let context = LAContext()
        var error: NSError?

        // Check whether it's possible to use biometric authentication
        if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {

            // Handle events
            context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "This is a security check reason.") { success, authenticationError in
                
                if success {
                    DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
                        isUnlocked = true
                    }
                }
            }
        }
    }
}

struct HelloView: View {
    var body: some View {
        Text("ログインしました🎉")
            .bold()
            .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

こちらが実機を使ってみた動作の写真です。



最後に

今回は単純な生体認証のログイン機能を紹介しただけですが、x-codeのinfo.plistの設定が慣れるまで手間でした。こちらの設定は動画を参考にしながらやってみたください。設定間違えたら、ーボタンを押すと消せます。

こちらの海外動画も生体認証の学習の参考になりそうです。
https://www.hackingwithswift.com/books/ios-swiftui/using-touch-id-and-face-id-with-swiftui

Discussion