将身份验证添加到 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#)

    在服务器项目中,导航至 Controllers>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 更改为 microsoftaccounttwitterfacebookwindowsazureactivedirectory。 如果使用 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> 。 将 appname 字符串( 在 CFBundleURLSchemes 的数组中)替换为在步骤 1 中选择的应用名称。 还可以在 plist 编辑器中进行更改 - 单击 AppName-Info.plist XCode 中的文件以打开 plist 编辑器。

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

  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 更改为 microsoftaccounttwitterfacebookwindowsazureactivedirectory 。 如果使用 Facebook,则必须在应用中 将 Facebook 域加入白名单

    urlScheme 替换为应用程序的唯一名称。 urlScheme 应与在 Azure 门户的 “允许的外部重定向 URL” 字段中指定的 URL 方案协议相同。 身份验证回调使用 urlScheme 在身份验证请求完成后切换回应用程序。

  2. 删除viewDidLoad()中的self.refreshControl?.beginRefreshing()self.onRefresh(self.refreshControl)行,并在ToDoTableViewController.swift的末尾。 将调用添加到 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>元素内。 将 appname 字符串( 在 CFBundleURLSchemes 的数组中)替换为在步骤 1 中选择的应用名称。 还可以在 plist 编辑器中进行更改 - 单击 AppName-Info.plist XCode 中的文件以打开 plist 编辑器。

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

  5. “运行” 启动应用,然后登录。 登录后,应能够查看待办事项列表并进行更新。

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