將驗證新增至您的 iOS 應用程式

在本教學課程中,您可以使用支援的身分識別提供者,將驗證加入 iOS 快速入門 專案。 本教學課程以 iOS 快速入門 教學課程為基礎,您必須先完成該教學課程。

註冊應用程式進行驗證,並設定應用程式服務

首先,您必須在身分識別提供者網站中註冊您的應用程式,然後在 Mobile Apps 後端中設定提供者產生的認證。

  1. 依照提供者特定的指示設定您偏好的身分識別提供者:

  2. 針對您要在應用程式中支援的每個提供者重複上述步驟。

將您的應用程式新增至允許的外部重新導向 URL

安全的驗證會要求您為應用程式定義新的 URL 配置。 這讓驗證系統能夠在驗證程序完成之後,重新導向回到您的應用程式。 我們會在這整個教學課程中使用 URL 配置 appname。 不過,您可以使用任何您選擇的 URL 結構描述。 它對於您的行動應用程式而言應該是唯一的。 若要在伺服器端啟用重新導向:

  1. Azure 入口網站 中,選取您的 App Service。

  2. 按一下 [驗證/授權] 功能表選項。

  3. 按一下 [驗證提供者] 區段下方的 [Azure Active Directory]

  4. 將 [管理模式] 設定為 [進階]

  5. 在 [允許的外部重新導向 URL] 中,輸入 appname://easyauth.callback。 此字串中的 appname 是您行動應用程式的 URL 配置。 它必須遵循通訊協定的標準 URL 規格 (只使用字母和數字,並以字母為開頭)。 請記下您選擇的字串,因為您將需要在數個位置中使用該 URL 配置來調整您的行動應用程式程式碼。

  6. 按一下 [確定]。

  7. 按一下 [儲存]。

限制只有通過驗證的使用者具有權限

根據預設,可以匿名方式叫用 Mobile Apps 後端中的 API。 接下來,您必須限制只有經過驗證的用戶端才有存取權。

  • Node.js 後端 (透過 Azure 入口網站)

    在 Mobile Apps 設定中,按一下 [簡單資料表 ],然後選取您的資料表。 按一下 [變更權限],選取所有權限的 [僅驗證存取],然後按一下 [儲存]

  • .NET 後端 (C#)

    在伺服器專案中,流覽至Controllers>TodoItemController.cs。 將 [Authorize] 屬性加入 TodoItemController 類別,如下所示。 若要限制只有特定方法才能存取,也可以將此屬性套用至這些方法,而不是類別。 發佈伺服器專案。

      [Authorize]
      public class TodoItemController : TableController<TodoItem>
    
  • Node.js 後端 (透過 Node.js 程式碼)

    如需要求資料表存取驗證,請將下行加入 Node.js 伺服器指令碼:

      table.access = 'authenticated';
    

    如需詳細資訊,請參閱 做法:存取資料表所需的驗證。 若要了解如何從您的網站下載快速入門程式碼專案,請參閱 做法:使用 Git 下載 Node.js 後端快速入門程式碼專案

在 Xcode 中,按下 [Run] 以啟動應用程式。 因為應用程式會嘗試以未經驗證的使用者身分來存取後端,但 TodoItem 資料表現在需要驗證,所以會引發例外狀況。

將驗證加入應用程式

Objective-C

  1. 在 Mac 上,開啟 Xcode 中的 QSTodoListViewController.m,並新增下列方法:

    - (void)loginAndGetData
    {
        QSAppDelegate *appDelegate = (QSAppDelegate *)[UIApplication sharedApplication].delegate;
        appDelegate.qsTodoService = self.todoService;
    
        [self.todoService.client loginWithProvider:@"google" urlScheme:@"appname" controller:self animated:YES completion:^(MSUser * _Nullable user, NSError * _Nullable error) {
            if (error) {
                NSLog(@"Login failed with error: %@, %@", error, [error userInfo]);
            }
            else {
                self.todoService.client.currentUser = user;
                NSLog(@"User logged in: %@", user.userId);
    
                [self refresh];
            }
        }];
    }
    

    如果您不使用 Google 作為識別提供者,請將 google 變更為 microsoftaccount、twitter、facebook 或 windowsazureactivedirectory。 如果您使用 Facebook,則必須 在應用程式中允許列出 Facebook 網域

    使用您應用程式的唯一名稱來取代 urlScheme。 urlScheme 必須與您在 Azure 入口網站中的 [允許的外部重新導向 URL] 欄位中指定的 URL 配置通訊協定相同。 urlScheme 可在完成驗證要求之後,供驗證回呼用來切換回您的應用程式。

  2. 使用以下程式碼來取代 QSTodoListViewController.mviewDidLoad 中的 [self refresh]

    [self loginAndGetData];
    
  3. 開啟 QSAppDelegate.h 檔案並新增下列程式碼:

    #import "QSTodoService.h"
    
    @property (strong, nonatomic) QSTodoService *qsTodoService;
    
  4. 開啟 QSAppDelegate.m 檔案並新增下列程式碼:

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
    {
        if ([[url.scheme lowercaseString] isEqualToString:@"appname"]) {
            // Resume login flow
            return [self.qsTodoService.client resumeWithURL:url];
        }
        else {
            return NO;
        }
    }
    

    將下列程式碼新增於 #pragma mark - Core Data stack 行的正前方。 將 appname 取代為您在步驟 1 中使用的 urlScheme 值。

  5. 開啟 AppName-Info.plist 檔案 (使用您的應用程式名稱來取代 AppName),並新增下列程式碼:

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>com.microsoft.azure.zumo</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>appname</string>
            </array>
        </dict>
    </array>
    

    此程式碼應該置於 <dict> 元素內部。 使用您在步驟 1 中選擇應的用程式名稱來取代 appname 字串 (在 CFBundleURLSchemes 的陣列內)。 您也可以在 plist 編輯器中進行這些變更 - 按一下 XCode 中的 AppName-Info.plist 檔案以開啟 plist 編輯器。

    使用您的 Apple 套件組合識別碼,來取代 CFBundleURLNamecom.microsoft.azure.zumo 字串。

  6. [執行 ] 以啟動應用程式,然後登入。 當您登入時,應該能夠檢視待辦事項清單並進行更新。

Swift

  1. 在 Mac 上,開啟 Xcode 中的 ToDoTableViewController.swift,並新增下列方法:

    func loginAndGetData() {
    
        guard let client = self.table?.client, client.currentUser == nil else {
            return
        }
    
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.todoTableViewController = self
    
        let loginBlock: MSClientLoginBlock = {(user, error) -> Void in
            if (error != nil) {
                print("Error: \(error?.localizedDescription)")
            }
            else {
                client.currentUser = user
                print("User logged in: \(user?.userId)")
            }
        }
    
        client.login(withProvider:"google", urlScheme: "appname", controller: self, animated: true, completion: loginBlock)
    
    }
    

    如果您不使用 Google 作為識別提供者,請將 google 變更為 microsoftaccount、twitter、facebook 或 windowsazureactivedirectory。 如果您使用 Facebook,則必須在應用程式中將 Facebook 網域列入白名單

    使用您應用程式的唯一名稱來取代 urlScheme。 urlScheme 必須與您在 Azure 入口網站中的 [允許的外部重新導向 URL] 欄位中指定的 URL 配置通訊協定相同。 urlScheme 可在完成驗證要求之後,供驗證回呼用來切換回您的應用程式。

  2. 移除 ToDoTableViewController.swiftviewDidLoad() 結尾處的 self.refreshControl?.beginRefreshing()self.onRefresh(self.refreshControl) 行。 在其位置新增呼叫至 loginAndGetData()

    loginAndGetData()
    
  3. 開啟 AppDelegate.swift 檔案,並將下列程式碼行新增至 AppDelegate 類別:

    var todoTableViewController: ToDoTableViewController?
    
    func application(_ application: UIApplication, openURL url: NSURL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.scheme?.lowercased() == "appname" {
            return (todoTableViewController!.table?.client.resume(with: url as URL))!
        }
        else {
            return false
        }
    }
    

    appname 取代為您在步驟 1 中使用的 urlScheme 值。

  4. 開啟 AppName-Info.plist 檔案 (使用您的應用程式名稱來取代 AppName),並新增下列程式碼:

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>com.microsoft.azure.zumo</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>appname</string>
            </array>
        </dict>
    </array>
    

    此程式碼應該置於 <dict> 元素內部。 使用您在步驟 1 中選擇應的用程式名稱來取代 appname 字串 (在 CFBundleURLSchemes 的陣列內)。 您也可以在 plist 編輯器中進行這些變更 - 按一下 XCode 中的 AppName-Info.plist 檔案以開啟 plist 編輯器。

    使用您的 Apple 套件組合識別碼,來取代 CFBundleURLNamecom.microsoft.azure.zumo 字串。

  5. [執行 ] 以啟動應用程式,然後登入。 當您登入時,應該能夠檢視待辦事項清單並進行更新。

App Service 驗證會使用 Apples Inter-App Communication。 如需有關這個主題的詳細資訊,請參閱 Apple 文件