在本教程中,将使用支持的标识提供者向 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#):
在服务器项目中,导航至 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:
在 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>
。 将 appname 字符串( 在 CFBundleURLSchemes 的数组中)替换为在步骤 1 中选择的应用名称。 还可以在 plist 编辑器中进行更改 - 单击AppName-Info.plist
XCode 中的文件以打开 plist 编辑器。将
com.microsoft.azure.zumo
字符串替换为 CFBundleURLName 的 Apple 捆绑标识符。按 “运行” 启动应用,然后登录。 登录后,应能够查看待办事项列表并进行更新。
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 在身份验证请求完成后切换回应用程序。
删除
viewDidLoad()
中的self.refreshControl?.beginRefreshing()
和self.onRefresh(self.refreshControl)
行,并在ToDoTableViewController.swift的末尾。 将调用添加到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>
元素内。 将 appname 字符串( 在 CFBundleURLSchemes 的数组中)替换为在步骤 1 中选择的应用名称。 还可以在 plist 编辑器中进行更改 - 单击AppName-Info.plist
XCode 中的文件以打开 plist 编辑器。将 CFBundleURLName 中的
com.microsoft.azure.zumo
字符串替换为您的 Apple 捆绑标识符。按 “运行” 启动应用,然后登录。 登录后,应能够查看待办事项列表并进行更新。
应用服务身份验证使用 Apple Inter-App 通信。 有关此主题的更多详细信息,请参阅 Apple 文档