Add authentication to your iOS app(将身份验证添加到 iOS 应用)

本教程介绍如何使用支持的标识提供者向 iOS 快速入门项目添加身份验证。 本教程基于 iOS 快速入门教程,这是必须首先完成的教程。

注册应用以进行身份验证并配置应用服务

首先,需要在标识提供者站点上注册应用,然后在移动应用后端设置提供者生成的凭据。

  1. 请按照以下提供者特定的说明来配置首选标识提供者:

  2. 为要在应用中支持的各提供者重复上述步骤。

将应用添加到允许的外部重定向 URL

安全身份验证要求为应用定义新的 URL 方案。 这允许身份验证系统在身份验证过程完成后,重定向回应用。 在本教程中,我们将通篇使用 URL 方案 appname。 但是,可以使用所选择的任何 URL 方案。 对于移动应用程序而言,它应是唯一的。 在服务器端启用重定向:

  1. Azure 门户中,选择应用服务。

  2. 单击“身份验证/授权”菜单选项。

  3. 单击“身份验证提供程序”部分下的“Azure Active Directory”

  4. 将“管理模式”设置为“高级”

  5. 在“允许的外部重定向 URL”中,输入 appname://easyauth.callback。 此字符串中的 appname 是移动应用程序的 URL 方案。 它应该遵循协议的正常 URL 规范(仅使用字母和数字,并以字母开头)。 请记下所选的字符串,你将需要在几个地方使用 URL 方案调整移动应用程序代码。

  6. 单击 “确定”

  7. 单击“保存” 。

将权限限制给已经过身份验证的用户

默认情况下,可匿名调用移动应用后端中的 API。 接下来,需限制为仅可访问已验证的客户端。

  • Node.js 后端(通过 Azure 门户)

    在移动应用设置中,单击“简易表”并选择相应的表。 单击“更改权限”,为所有权限选择“仅限已验证的访问”,并单击“保存”

  • .NET 后端 (C#):

    在服务器项目中,导航到“控制器”>“TodoItemController.cs”。 将 [Authorize] 属性添加到“TodoItemController”类,如下所示。 若要限制为仅可访问特定方法,还可只向这些方法应用此属性(而非类)。 重新发布服务器项目。

      [Authorize]
      public class TodoItemController : TableController<TodoItem>
    
  • Node.js 后端(通过 Node.js 代码)

    若要访问表时需验证身份,请向 Node.js 服务器脚本添加以下行:

      table.access = 'authenticated';
    

    有关更多详细信息,请参阅如何:要求在访问表时进行身份验证。 若要了解如何从网站下载快速入门代码项目,请参阅如何:使用 Git 下载 Node.js 后端快速入门代码项目

在 Xcode 中,按“运行”启动应用。 这样将引发异常,因为应用尝试以未经身份验证的用户身份访问后端,但 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.m 中 viewDidLoad[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 编辑器。

    将 CFBundleURLName 的 com.microsoft.azure.zumo 字符串替换为 Apple 捆绑包标识符。

  6. 按“运行”启动应用,然后登录。 登录时,应能够查看 Todo 列表并进行更新。

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.swift 中 viewDidLoad() 末尾的 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 编辑器。

    将 CFBundleURLName 的 com.microsoft.azure.zumo 字符串替换为 Apple 捆绑包标识符。

  5. 按“运行”启动应用,然后登录。 登录时,应能够查看 Todo 列表并进行更新。

应用服务身份验证使用 Apple 应用间通信。 有关此主题的详细信息,请参阅 Apple 文档