快速入门:在 iOS 或 macOS 应用中登录用户并调用 Microsoft Graph API

欢迎! 这可能不是你期望看到的页面。 在修复时,此链接应会将你转至正确的文章:

快速入门:从 iOS 或 macOS 应用将用户登录并调用 Microsoft Graph

对此造成你的不便,我们深表歉意;感谢你的耐心等待,我们正在努力解决此问题。

在本快速入门中,你将下载并运行代码示例,该示例演示本机 iOS 或 macOS 应用程序如何登录用户并获取访问令牌来调用 Microsoft 图形 API。

本快速入门适用于 iOS 和 macOS 应用。 某些步骤仅适用于 iOS 应用,并会指示为此类步骤。

先决条件

  • 具有活动订阅的 Azure 帐户。 免费创建帐户
  • XCode 10+
  • iOS 10+
  • macOS 10.12+

示例的工作原理

显示本快速入门生成的示例应用的工作原理

步骤 1:配置应用程序

为使此快速入门的代码示例正常运行,请添加与身份验证代理兼容的重定向 URI。

已配置 应用程序已使用这些属性进行配置

步骤 2:下载示例项目

下载适用于 iOS 的代码示例

下载 macOS 代码示例

步骤 3:安装依赖项

  1. 提取 zip 文件。
  2. 在终端窗口中,使用下载的代码示例导航到文件夹,并运行 pod install 以安装最新的 MSAL 库。

步骤 4:应用已配置并可以运行

我们已经为项目配置了应用属性的值,并且该项目已准备好运行。

注释

Enter_the_Supported_Account_Info_Here

  1. 如果正在为 Microsoft Entra 国家云生成应用,请将以“let kGraphEndpoint”和“let kAuthority”开头的行替换为正确的终结点。 对于全局访问,请使用默认值:

    let kGraphEndpoint = "https://graph.microsoft.com/"
    let kAuthority = "https://login.microsoftonline.com/common"
    
  2. 此处阐述了其他终结点。 例如,若要使用 Microsoft Entra 德国云运行本快速入门,请使用以下代码:

    let kGraphEndpoint = "https://graph.microsoft.de/"
    let kAuthority = "https://login.microsoftonline.de/common"
    
  3. 打开项目设置。 在“标识”部分,输入以前在门户中输入的捆绑标识符。

  4. 右键单击Info.plist,然后选择打开为>源代码

  5. 在 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>
    
  6. 生成并运行应用!

详细信息

阅读这些部分,了解有关本快速入门的详细信息。

获取 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)
地点: DESCRIPTION
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)
}

最后,你的应用必须在 LSApplicationQueriesSchemes 以及 中具有 CFBundleURLTypes 条目。 此示例附带了此内容。

<key>LSApplicationQueriesSchemes</key>
<array>
   <string>msauthv2</string>
   <string>msauthv3</string>
</array>

登录用户与请求令牌

MSAL 有两种方法用于获取令牌:acquireTokenacquireTokenSilent

acquireToken:以交互方式获取令牌

在某些情况下,用户需要与Microsoft标识平台进行交互。 在这些情况下,最终用户可能需要选择其帐户、输入其凭据或同意应用的权限。 例如,

  • 用户首次登录应用程序时
  • 如果用户重置其密码,则需要输入其凭据
  • 应用程序首次请求访问资源时
  • 需要 MFA 或其他条件访问策略时
let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
self.applicationContext!.acquireToken(with: parameters) { (result, error) in /* Add your handling logic */}
地点: DESCRIPTION
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 */}
}
地点: DESCRIPTION
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