【iOS/SwiftUI】Zxcvbnでパスワード強度チェックを行う(基礎編)

目次

概要

最近のパスワード登録画面では、入力されている文字列がパスワードとして複雑かどうかが表示されている。
Zxcvbnというライブラリを使用すると現在入力されているパスワードが強力かどうかをリアルタイムで反映することができる。
しかし、SwiftUIで、しかもカスタマイズできるような形では記事がなかったので作成する。

基礎編ということで、ここでは以下のライブラリの例に則って実装する。
【GitHub】toddheasley/zxcvbn

下準備

さて、今回はすでに実装されているプログラム、つまりライブラリを使用する。
まずはライブラリを取り入れよう!

Swift Package Managerでライブラリを導入

CocoaPodsなどもあるが、最近はSwift Package Managerで取り入れる方が多いのではないかと思っている。
それに、色々シンプルだと思っている。

まずは、プロジェクトファイルの「General」を表示して、この赤枠の「+」ボタンを押下してSwift Package Managerを立ち上げる。

そうすると以下のようなウィンドウが表示されるので、「Add Other」を押下して、
「Add Package Dependency」を選択する。

このようにライブラリ一覧が出てくるので、赤枠の部分にGitのURL「https://github.com/toddheasley/zxcvbn」を入力して検索をかける。
すると、「zxcvbn」というライブラリが出てくるので、それを選択して「Add Package」を選択する。

そうすると以下のように表示されるので「Add Package」を選択する。

すると、以下のようにライブラリ一覧に表示されるようになる。

これでプログラム上で「import zxcvbn」と書くことでこのライブラリの機能を使うことができる。

ソースコード

import SwiftUI

@main
struct TestApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            SecurityPasswordView()
        }
    }
}
import Foundation

class SecurityPasswordViewModel: ObservableObject {
    @Published var password: String = ""
}

import SwiftUI
import Zxcvbn

struct SecurityPasswordView: View {
    @ObservedObject private var viewModel = SecurityPasswordViewModel()
    
    @State private var isBlankPassword: Bool = true
    
    private let passwordPlaceholder: String = "パスワード"
    
    var body: some View {
        ZStack {
            VStack(alignment: .leading) {
                Text("パスワード")
                HStack {
                    if isBlankPassword {
                        SecureField(passwordPlaceholder, text: $viewModel.password)
                            .textFieldStyle(.roundedBorder)
                            .keyboardType(.asciiCapable)
                            .overlay(ResultView(viewModel.password), alignment: .trailing)
                    } else {
                        TextField(passwordPlaceholder, text: $viewModel.password)
                            .textFieldStyle(.roundedBorder)
                            .keyboardType(.asciiCapable)
                            .overlay(ResultView(viewModel.password), alignment: .trailing)
                    }
                    Toggle(isOn: $isBlankPassword) {
                        Image(systemName: isBlankPassword ? "eye.slash.fill" : "eye.fill")
                    }
                    .toggleStyle(.button)
                }
            }
            .padding()
        }
    }
}

デモ動画

詳細

ここはライブラリの例に則って書いたからとても簡単だ!
TextFieldの右端にタイルを表示して、パスワードの強度が高くなるにつれてタイルに色がついていくというもの。

しかし、これでは少々不親切だし、少し味気ない感じがある。
次回はもっとこのタイルの部分をカスタマイズしていこう。
例えば、メーターのように表示したり、パスワード強度に応じて表示するメッセージを変えたり。

参考ページ