iOS 上针对 Azure Graph API 的非交互式登录(缓存凭据)

Non-interactive login (cached credentials) against Azure Graph API on iOS

我正在 iOS 上创建一个应用程序,它将 运行 处于 "kiosk" 模式。该应用程序的一部分要求用户能够搜索组织的目录。我想通过 Azure Graph API 支持 Azure AD 以提供此功能。

我不想在应用程序启动时要求交互式登录,也不想使用额外的网络服务;我希望 iOS 应用程序能够通过 REST 访问 Azure Graph API。

我知道与缓存凭据相关的风险,但是使用 "service accounts" 进行非交互式登录已经相当成熟,访问是只读的,凭据可以在 iOS钥匙扣。

我查看了许多 Azure 示例并阅读了文档,似乎提供我需要的方法 acquireToken(resource, credential) 在 iOS ADAL 库中不可用(并且是ClientCredential class).

澄清一下,这是我希望我的应用程序的工作方式:

  1. 用户从应用商店安装应用并且运行第一次安装
  2. 作为设置的一部分,他们通过提供租户、应用程序客户端 ID 和应用程序密钥向 Azure AD 进行身份验证。如果他们无法使用应用程序密钥进行身份验证,则可以接受用户 id/password,只要:
  3. 他们永远不会收到再次验证的提示

这里有解决方案还是我放弃 Azure AD?

这可以完成,但不能使用 ADALiOS 框架,因为它不会公开使其工作所需的 client_credentials 授权。

我能够使用 p2/OAuth. The sample app is here

构建一个工作演示

构建工作解决方案的步骤是:

  1. 登录旧版 Azure Management portal 和 select 您的 Azure AD 实例
  2. 在该 AD 实例中创建一个新应用程序
    1. Select "Add an application my organisation is developing"
    2. 给它起个名字然后select"Web application and/or Web API""Native Client Application"
    3. 输入登录 url 和应用 ID url 的值。这些需要是格式正确的 URL,但不需要可以访问
  3. 创建应用程序后select "Configure"。请注意 客户端 ID - 您将需要这个
  4. 在"Keys"selection中,select1或2年下拉,然后点击"Save"
  5. 显示密钥后,将其复制并保存在某处;无法再次显示
  6. 设置所需的 "Permissions to other applications" 以允许您的应用获得所需的访问权限
  7. 最后,在屏幕底部单击 "view endpoints" - 您需要复制 OAuth 2.0 令牌端点和 OAuth 2.0 授权端点
  8. 从 GitHub 下载演示代码
  9. 运行 pod install
  10. 将值插入 Settings.plist 文件
  11. 运行 应用

身份验证过程的核心是设置 OAuth2ClientCredentials -

的实例
let settings = [
        "client_id": appData.clientId!,
        "client_secret": appData.secret!,
        "authorize_uri": appData.authString!,
        "token_uri": appData.tokenString!,
        "keychain": true,
        "secret_in_body": true
        ] as OAuth2JSON

self.oauth2 = OAuth2ClientCredentials(settings: settings)

然后可以调用doAuthorize()获取token

self.oauth2.doAuthorize()