快速入门:从 iOS 或 macOS 应用登录用户并调用 Microsoft Graph
在本快速入门中,你将下载并运行代码示例,该示例演示本机 iOS 或 macOS 应用程序如何登录用户并获取访问令牌来调用 Microsoft 图形 API。
本快速入门适用于 iOS 和 macOS 应用。 某些步骤仅适用于 iOS 应用,并会指示为此类步骤。
先决条件
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- XCode 10+
- iOS 10+
- macOS 10.12+
示例的工作原理
注册快速启动应用程序
若要注册应用程序并将应用的注册信息手动添加到解决方案,请执行以下步骤:
- 至少以应用程序开发人员的身份登录到 Microsoft Entra 管理中心。
- 如果您有权访问多个租户,请使用顶部菜单中的 设置 图标
,在 目录 + 订阅 菜单中切换到您想要注册应用程序的租户。
- 浏览到“标识”>“应用程序”>“应用注册”。
- 选择“新注册”。
- 输入应用程序的“名称”。 应用的用户可能会看到此名称,稍后可以对其进行更改。
- 选择“注册”。
- 在“管理”下,选择“身份验证>添加平台>iOS。
- 输入应用程序的“捆绑标识符”。 捆绑标识符是唯一标识应用程序的唯一字符串,例如
com.<yourname>.identitysample.MSALMacOS
。 记下所用的值。 请注意,iOS 配置也适用于 macOS 应用程序。 - 选择“配置”,并保存 MSAL 配置 的详细信息,以便在本快速入门中稍后使用。
- 选择“完成”。
步骤 2:下载示例项目
步骤 3:安装依赖项
- 提取 zip 文件。
- 在终端窗口中,使用下载的代码示例导航到文件夹,并运行
pod install
以安装最新的 MSAL 库。
步骤 4:配置项目
如果选择了上面的选项 1,则可以跳过这些步骤。
在 XCode 中打开项目。
编辑 ViewController.swift,并将以“let kClientID”开头的行替换为以下代码片段。 请记得将
kClientID
的值更新为客户端 ID,该 ID 是你在本快速入门的前面部分注册应用时保存的:let kClientID = "Enter_the_Application_Id_Here"
如果为 Microsoft Entra 国家云生成应用,请将以“let kGraphEndpoint”和“let kAuthority”开头的行替换为正确的终结点。 对于全局访问,请使用默认值:
let kGraphEndpoint = "https://graph.microsoft.com/" let kAuthority = "https://login.microsoftonline.com/common"
此处阐述了其他终结点。 例如,若要在 Microsoft Entra 德国运行本快速入门,请使用以下命令:
let kGraphEndpoint = "https://graph.microsoft.de/" let kAuthority = "https://login.microsoftonline.de/common"
打开项目设置。 在“标识”部分输入“捆绑标识符”。
右键单击“Info.plist”,然后选择“打开为”>“源代码”。
在 dict 根节点下,将
Enter_the_bundle_Id_Here
替换为你在门户中使用的捆绑 ID。 请注意字符串中的msauth.
前缀。<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>msauth.Enter_the_Bundle_Id_Here</string> </array> </dict> </array>
生成并运行应用!
详细信息
阅读这些部分,了解有关本快速入门的详细信息。
获取 MSAL
MSAL(MSAL.framework)是用于登录用户和请求令牌的库,用于访问受Microsoft标识平台保护的 API。 可以使用以下过程将 MSAL 添加到应用程序:
$ vi Podfile
将以下内容添加到此 podfile(包含项目的目标):
use_frameworks!
target 'MSALiOS' do
pod 'MSAL'
end
运行 CocoaPods 安装命令:
pod install
初始化 MSAL
可以通过添加以下代码来添加 MSAL 的引用:
import MSAL
然后,使用以下代码初始化 MSAL:
let authority = try MSALAADAuthority(url: URL(string: kAuthority)!)
let msalConfiguration = MSALPublicClientApplicationConfig(clientId: kClientID, redirectUri: nil, authority: authority)
self.applicationContext = try MSALPublicClientApplication(configuration: msalConfiguration)
哪里: | 描述 |
---|---|
clientId |
在 portal.azure.com 中注册的应用程序的应用程序 ID |
authority |
Microsoft标识平台。 在大多数的情况下,这将是 https://login.microsoftonline.com/common |
redirectUri |
应用程序的重定向 URI。 可以传递“nil”以使用默认值或自定义重定向 URI。 |
仅适用于 iOS,其他应用要求
应用还必须在 AppDelegate
中有以下内容。 这样,MSAL SDK 就可以在进行身份验证时处理来自身份验证代理应用的令牌响应。
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
return MSALPublicClientApplication.handleMSALResponse(url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String)
}
注意
在 iOS 13+ 上,如果你采用 UISceneDelegate
而不是 UIApplicationDelegate
,请将此代码放入 scene:openURLContexts:
回调中(请参阅 Apple 的文档)。
如果支持兼容旧版 iOS 的 UISceneDelegate 和 UIApplicationDelegate,则需将 MSAL 回调置于两个位置。
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let urlContext = URLContexts.first else {
return
}
let url = urlContext.url
let sourceApp = urlContext.options.sourceApplication
MSALPublicClientApplication.handleMSALResponse(url, sourceApplication: sourceApp)
}
最后,你的应用必须在 Info.plist 以及 CFBundleURLTypes
中具有 LSApplicationQueriesSchemes
条目。 此示例附带了此内容。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>msauthv2</string>
<string>msauthv3</string>
</array>
登录用户与请求令牌
MSAL 有两种方法用于获取令牌:acquireToken
和 acquireTokenSilent
。
acquireToken:以交互方式获取令牌
在某些情况下,用户需要与Microsoft标识平台进行交互。 在这些情况下,最终用户可能需要选择其帐户、输入其凭据或同意应用的权限。 例如
- 用户首次登录应用程序时
- 如果用户重置其密码,则需要输入其凭据
- 应用程序首次请求访问资源时
- 需要 MFA 或其他条件访问策略时
let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParamaters!)
self.applicationContext!.acquireToken(with: parameters) { (result, error) in /* Add your handling logic */}
哪里: | 描述 |
---|---|
scopes |
包含所请求的范围(即Microsoft Graph 的 [ "user.read" ] 或自定义 Web API 的 [ "<Application ID URL>/scope" ] (api://<Application ID>/access_as_user )) |
acquireTokenSilent:以无提示方式获取访问令牌
应用不应要求用户在每次请求令牌时登录。 如果用户已登录,此方法允许应用以无提示方式请求令牌。
self.applicationContext!.getCurrentAccount(with: nil) { (currentAccount, previousAccount, error) in
guard let account = currentAccount else {
return
}
let silentParams = MSALSilentTokenParameters(scopes: self.kScopes, account: account)
self.applicationContext!.acquireTokenSilent(with: silentParams) { (result, error) in /* Add your handling logic */}
}
哪里: | 描述 |
---|---|
scopes |
包含所请求的范围(即Microsoft Graph 的 [ "user.read" ] 或自定义 Web API 的 [ "<Application ID URL>/scope" ] (api://<Application ID>/access_as_user )) |
account |
请求令牌时对应的帐户。 本快速入门介绍单帐户应用程序。 如果要构建多帐户应用,则需要定义相关逻辑,以使用 accountsFromDeviceForParameters:completionBlock: 并传递正确的 accountIdentifier 来标识用于令牌请求的帐户 |
帮助和支持
如果需要帮助、想要报告问题或想要了解支持选项,请参阅 帮助和支持开发人员。
后续步骤
继续进入分步教程,在该教程中,您将构建一个 iOS 或 macOS 应用程序,该应用程序从 Microsoft 身份平台获取访问令牌,并使用该令牌调用 Microsoft Graph API。
教程:从 iOS 或 macOS 应用 登录用户并调用 Microsoft Graph