標籤:
iOS 8 中如何整合 Touch ID 功能
2013年9月,蘋果為當時發布的最新iPhone產品配備了一系列硬體升級方案。在iPhone 5s當中,最具創新特性的機制無疑要數圍繞Home按鈕設計的超薄金屬圈,也就是被稱為Touch ID的指紋感應器。開發人員隨後開始紛紛將其API作為突破口,希望能在自己的應用程式中引入這一最新功能。如今一年已經過去,iOS 8提供的新型架構則讓開發人員能夠更加得心應手地使用這套指紋感測裝置。
這套Local Authentication架構能夠輕鬆實現使用者身分識別驗證,大家可以利用它來完成應用程式的登入機制或者通過它保護應用程式當中的敏感性資料。在今天的教程中,我們將共同瞭解如何將整套選項應用在自己的設計成果當中、我們能夠從裝置中擷取哪些資料並一步步引導各位構建起一款應用程式範例。
要完成本教程,大家需要安裝Xcode 6以建立新項目,此外各位還需要一台配備Touch ID的裝置來對自己建立完成的樣本應用進行測試。
1. Touch ID
Touch ID指的是被安裝在iPhone 5s Home按鈕當中的指紋感測裝置。它的出現旨在協助使用者更為輕鬆地完成身份識別流程,從而鼓勵使用者儘可能多地使用保護機制。大家在每台裝置上最多能夠配置五種指紋識別資訊。到目前為止,Touch ID已經能夠被用於完成裝置解鎖並完成在iTunes Store、App Store以及iBooks Store當中的購買操作。在進一步探討如何將其引入大家自己的應用程式之前,我們首先需要對這款感應器本身進行一番瞭解。
Touch ID感應器能夠以每英寸500像素的解析度對使用者指紋進行掃描,並將指紋圖案劃歸為三種類型之一:拱型、旋渦型以及環型。這款感應器在設計上充分考慮到了便捷性需求,大家可以從任何角度對手指進行掃描、而且當前掃描結果能夠與任何方向的原有指紋記錄進行正確匹配。
蘋果公司宣稱,對於任何一個給定指紋圖案、Touch ID發生識別錯誤的機率僅為五萬分之一,這樣的保護效果明顯優於原本的四位元數字 PIN 碼機制——畢竟其內容只能在0001到9999之間提供一萬種可能性組合。不過蘋果沒有明顯指出的是,在某些情況下我們可能無法使用自己的指紋順利實現解鎖操作,例如在遊泳之後手指紋理褶皺發生變化時。
如果大家打算使用Touch ID,那麼最重要的一點就是首先考慮到那些使用者可能無法使用手指進行驗證的使用情境。由於蘋果不再允許我們使用裝置內內建的數字 PIN 碼驗證機制,因此如果Touch ID無法正常起效、大家最好能在應用程式當中額外建立一套密碼匹配方案。
2. 安全注意事項
指令感應器帶來的最大問題在於,使用者的隱私會從根本上受到侵犯。如果大家的密碼內容被泄露出去,那麼各位完全可以通過修改及時挽救、惡意人士根本無法繼續利用其訪問使用者的敏感性資料。然而如果大家的指紋資訊,或者是蘋果的指紋內容演算法遭到外泄,我們明顯沒辦法快速對其進行變更。
Local Authentication架構負責處理所有使用者身分識別驗證的重任。當與Touch ID結合起效時,最重要的就是要確保該架構不會透露任何與使用者有關的細節、而且不會有資料從裝置中被傳輸出去。然而,開發人員可以利用這套架構來檢查特定使用者是否被允許使用對應應用程式。
如果大家已經比較熟悉OAuth規範,就會發現這兩種驗證處理方式其實頗為相似。我們要求第三方對使用者身份進行審核,如果我們對第三方充分信任,則可以根據其反饋直接向該使用者提供認證憑證。
3. LAContext
Local Authentication架構的核心就是LAContext類。開發人員可以利用LAContext執行個體來對安全性原則加以評估。截至本文發稿時,這也是惟一可資使用的管理原則。它會利用Touch ID感應器來檢查使用者的身份是否正是裝置持有人。未來其它安全管理原則可能將陸續推出。舉例來說,蘋果公司可能會引入一類無許可權角色、只允許他們對特定資源加以訪問。
如果這套架構無法完成驗證,則會提供錯誤提示資訊。裝置無法完成驗證的理由可能包括以下幾種:
- LAErrorTouchIDNotAvailable 裝置本身並不具備指紋感測裝置。
- LAErrorPasscodeNotSet 裝置上並不具備密碼設定資訊,也就是說Touch ID功能處於被禁用狀態。
- LAErrorTouchIDNotEnrolled 已經設定有密碼機制,但裝置配置當中還沒有儲存過任何指紋內容。
如果遇到了包含上述錯誤碼的錯誤提示資訊,大家就需要利用其它一些方法來完成對使用者的身分識別驗證。在這種情況下,各位已經不能單單依賴Touch ID來完成保護工作了。
下面讓我們一起建立一款應用程式範例,共同瞭解如何對Local Authentication架構加以使用。
4. 項目設定第一步
開啟Xcode並在File菜單內選擇New > Project…。接下來在iOS Application模板列表中選擇Single View Application單視圖應用程式)並點擊Next。
第二步
為我們的項目輸入一個名稱,我叫自己的應用命名為Auth。接下來輸入組織名稱、公司標識以及類首碼。在Devices列表中選擇iPhone,然後點擊Next,接下來為項目選擇一個檔案儲存位置。
第三步
點擊ViewController.h並定義一種新操作,authenticateButtonTapped,它會觸發整個驗證流程。ViewController類的介面外觀應該如下所示:
- #import <UIKit/UIKit.h>
- @interface ViewController : UIViewController
- - (IBAction)authenticateButtonTapped:(id)sender;
- @end
第四步
開啟Main.storyboard並將一個Button拖拽到控制器的視圖當中。變更該按鈕的標籤以使其讀取為Authneticate。
第五步
右鍵點擊該按鈕以顯示Connections Inspector。點擊Touch Up Inside事件左側的加號並選擇用於容納該按鈕的視圖控制器。這時螢幕上會顯示出新的菜單,大家需要在這裡選擇我們之前已經設定完成的操作。
5. 對使用者身份進行驗證第一步
開啟ViewController.m以啟用authenticateButtonTapped方法。在檔案開頭位置添加以下面向Local Authentication架構的匯入語句。
- #import <LocalAuthentication/LocalAuthentication.h>
第二步
在authenticateButtonTapped方法當中,我們建立一套背景資訊並檢測該背景是否能夠對LAPolicyDeviceOwnerAuthenticationWithBiometrics策略加以評估,如果不同則顯示錯誤資訊。
- - (IBAction)authenticateButtonTapped:(id)sender {
- LAContext *context = [[LAContext alloc] init];
-
- NSError *error = nil;
-
- if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
-
- // Authenticate User
-
- } else {
-
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
- message:@"Your device cannot authenticate using TouchID."
- delegate:nil
- cancelButtonTitle:@"Ok"
- otherButtonTitles:nil];
- [alert show];
- }
- }
第三步
如果該LAContext對象能夠利用Touch ID進行身分識別驗證,那麼我們就可以對使用者身份加以審核了。如果沒有出現錯誤提示資訊,我們就能判斷目前使用者是否屬於裝置持有人。最後通過以下代碼實施authenticateButtonTapped方法。
- - (void)authenicateButtonTapped:(id)sender {
- LAContext *context = [[LAContext alloc] init];
- NSError *error = nil;
- if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
- [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
- localizedReason:@"Are you the device owner?"
- reply:^(BOOL success, NSError *error) {
- if (error) {
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
- message:@"There was a problem verifying your identity."
- delegate:nil
- cancelButtonTitle:@"Ok"
- otherButtonTitles:nil];
- [alert show];
- return;
- }
- if (success) {
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Success"
- message:@"You are the device owner!"
- delegate:nil
- cancelButtonTitle:@"Ok"
- otherButtonTitles:nil];
- [alert show];
- } else {
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
- message:@"You are not the device owner."
- delegate:nil
- cancelButtonTitle:@"Ok"
- otherButtonTitles:nil];
- [alert show];
- }
- }];
- } else {
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
- message:@"Your device cannot authenticate using TouchID."
- delegate:nil
- cancelButtonTitle:@"Ok"
- otherButtonTitles:nil];
- [alert show];
- }
- }
6. 構建並運行
下面我們需要在配備有指紋感應器的物理裝置上構建並運行這款應用程式,並通過點觸Home按鈕進行身分識別驗證。只要大家的裝置能夠切實支援Touch ID功能,應用程式中的驗證機制應該就能得到正確通過。當各位將手指放在感應器上時,應用程式就可以正確識別出使用者是否屬於該裝置的合法持有人。
總結
在今天的教程中,我們瞭解了iOS 8新近加入了Local Authentication架構。通過對使用者身份進行查驗,LAContext類允許使用者在無法直接嚮應用程式本身提供任何敏感性資料的前提下完成識別工作。
英文原文連結:iOS 8: Integrating Touch ID
iOS 8 中如何整合 Touch ID 功能