iOS 8 中如何整合 Touch ID 功能

51CTO發表於2014-11-23

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類允許使用者在無法直接嚮應用程式本身提供任何敏感資料的前提下完成識別工作。

 

 

 

相關文章