Add authentication to your iOS app(将身份验证添加到 iOS 应用)
本教程介绍如何使用支持的标识提供者向 iOS 快速入门项目添加身份验证。 本教程基于 iOS 快速入门教程,这是必须首先完成的教程。
注册应用以进行身份验证并配置应用服务
首先,需要在标识提供者站点上注册应用,然后在移动应用后端设置提供者生成的凭据。
请按照以下提供者特定的说明来配置首选标识提供者:
为要在应用中支持的各提供者重复上述步骤。
将应用添加到允许的外部重定向 URL
安全身份验证要求为应用定义新的 URL 方案。 这允许身份验证系统在身份验证过程完成后,重定向回应用。 在本教程中,我们将通篇使用 URL 方案 appname。 但是,可以使用所选择的任何 URL 方案。 对于移动应用程序而言,它应是唯一的。 在服务器端启用重定向:
在 Azure 门户中,选择应用服务。
单击“身份验证/授权”菜单选项。
单击“身份验证提供程序”部分下的“Azure Active Directory”。
将“管理模式”设置为“高级”。
在“允许的外部重定向 URL”中,输入
appname://easyauth.callback
。 此字符串中的 appname 是移动应用程序的 URL 方案。 它应该遵循协议的正常 URL 规范(仅使用字母和数字,并以字母开头)。 请记下所选的字符串,你将需要在几个地方使用 URL 方案调整移动应用程序代码。单击 “确定” 。
单击“保存” 。
将权限限制给已经过身份验证的用户
默认情况下,可匿名调用移动应用后端中的 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:
在 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 切回应用程序。
将 QSTodoListViewController.m 中
viewDidLoad
的[self refresh]
替换为以下代码:[self loginAndGetData];
打开
QSAppDelegate.h
文件,并添加以下代码:#import "QSTodoService.h" @property (strong, nonatomic) QSTodoService *qsTodoService;
打开
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 值。打开
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 捆绑包标识符。按“运行”启动应用,然后登录。 登录时,应能够查看 Todo 列表并进行更新。
Swift:
在 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 切回应用程序。
删除 ToDoTableViewController.swift 中
viewDidLoad()
末尾的self.refreshControl?.beginRefreshing()
和self.onRefresh(self.refreshControl)
行。 在其位置上添加对loginAndGetData()
的调用:loginAndGetData()
打开
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 值。
打开
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 捆绑包标识符。按“运行”启动应用,然后登录。 登录时,应能够查看 Todo 列表并进行更新。
应用服务身份验证使用 Apple 应用间通信。 有关此主题的详细信息,请参阅 Apple 文档