AlfrescoAuth 0.2.2

AlfrescoAuth 0.2.2

Vinay PiplaniLovekesh Saxena 维护。



 
依赖项
AlfrescoCore>= 0
AppAuth>= 0
Auth0>= 0
 

  • Alfresco

Alfresco iOS Swift API

支持库,便于开发与 Alfresco 产品协同工作的 iOS 应用。

安装

这些库可以作为通过 Cocoapods 提供的独立框架来获取。

转到项目文件夹,在终端中输入 pod init 创建一个 pod 文件,编辑它并添加以下内容

source 'https://cdn.cocoapods.org/'

然后添加您需要的 pod 配置。例如: pod 'AlfrescoAuth' pod 'AlfrescoContent'

有关如何设置 Cocoapods 的更多信息,请参阅 官方文档

我们在发布库时使用语义版本。更多关于它的信息请查看 这里

库需要 iOS 12 + 和 Swift 5 +。

入门

最简单的方法是查看包含的 示例应用

这个示例展示了如何通过身份验证服务实现身份验证,以及如何与 API 绑定集成以发起第一个请求。

应用应该与您安装的身份验证服务一起正常工作,但如果遇到任何问题,请编辑 AuthenticationParameters.swift

身份验证

auth 模块提供了几个抽象的接口来与 Alfresco 身份服务和工作基础认证进行交互。

基本认证

对于基本认证,你需要构建自己的用户界面来收集凭据。提供给库的信息并不多,但你可以利用我们在 示例应用 中使用的一些构造函数。

单点登录认证

对于单点登录,你的活动必须向用户展示一个WebView,让他们在其中登录,并在最后收集令牌。

需要几个步骤来使其工作。

在 Keycloak 中注册移动客户端ID

请注意,这一步是可选的,因为这可能已经被您的管理员处理了。

首先,您需要在身份服务中定义一个客户端,该客户端将服务于移动应用程序。访问 Keycloak 管理界面,并导航到客户端页面。添加一个新的客户端条目,并记录下客户端ID值。保存条目,然后在下一页中,搜索 有效的重定向URI 字段。此特定字段的值应该采用以下格式 clientID://自定义域名名称/auth

在您的移动应用中注册重定向URI

确保设置的后续URI在移动客户端的设置中也进行了镜像是很重要的。为此,打开您项目的Info.plist文件,并添加以下结构

  • 添加一个数组类型的'URL types'键
  • 作为'URL types'的子依赖,添加一个字典类型的新的键
  • 作为前面项的子依赖,添加一个字符串类型的'URL Schemes'键,其值为之前设置的后续URI。

更多信息,请参阅我们的示例应用

调用AlfrescoAuth API

首先,您的视图模型必须使用您的配置初始化身份验证模块,并调用身份验证方法。配置对象需要与身份服务中的配置匹配。

class MyLoginViewModel {
  init() {
    alfrescoAuth = AlfrescoAuth.init(configuration: authConfig)
  }
  ...
}

接下来,在身份验证模块上调用传入您要显示SSO Webview的视图控制器和接收更新的代理类的pkceAuth方法。

class  MyLoginViewModel {
  func login(in viewController: UIViewController) {
    alfrescoAuth.pkceAuth(onViewController: viewController, delegate: self)
  }
}

extension MyLoginViewModel: AlfrescoAuthDelegate {
  func didReceive(result: Result<AlfrescoCredential, APIError>, session: AlfrescoAuthSession?) {
    switch result {
      case.success(let credential):
        // Store credential and session object
  ...
      case .failure(let error):
        ...
    }
}

登录成功后,服务器将使用您的Info.plist中的回调URI回调您的令牌。

授权响应URL通过- (**BOOL**)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, **id**> *)options app委托方法返回给应用,因此您需要将此通过当前的授权会话传递。

AlfrescoSession对象上调用resumeExternalUserAgentFlow方法,并将openURL方法提供的URL传递。

您可以通过查看我们的示例应用来了解处理此情况的途径

身份验证后

由于身份验证是一个独立的步骤,我们强烈建议您在didReceive之后执行额外的验证,然后再让用户进入应用程序。

在此期间您可以检查的项,可能是配置文件信息或权限,这可能需要调用Alfresco服务,从而验证您的身份验证会话是否运行正确。

保持会话对象存活

根据期望的认证模式,会话对象可能需要在对象图中保持活跃。这适用于认证的PKCE模式。

登录后,AlfrescoAuth模块将提供AlfrescoSession对象,该对象应在其会话期间保持引用。这是您需要序列化以保留授权状态的唯一对象。

注销

通常来说,您可以简单地销毁持久化的凭证,但在单点登录的情况下,需要使会话无效,否则用户将在没有凭证提示的情况下再次登录。

为此,只需在AlfrescoAuth模块上调用注销方法,并提供您为用户设置的最后一组凭证。

class  MyLoginViewModel {
  func logOut(onViewController viewController: UIViewController, lastKnownCredential: AlfrescoCredential, delegate: AlfrescoAuthDelegate) {
    alfrescoAuth.logout(onViewController: viewController, delegate: self, forCredential: lastKnownCredential)
  }
}

extension MyLoginViewModel: AlfrescoAuthDelegate {
  func didLogOut(result: Result<Int, APIError>) {
    ...
  }
}

重新认证

在单点登录的情况下,刷新令牌可能会过期,或者远程操作员可能会在身份服务中使用户的会话无效。

即使在基本认证场景中,如果密码被更改,这也可能发生。

当这种情况发生时,我们建议您提示用户他需要重新登录。

对于基本认证来说,您需要自己确定集成方式,但对于单点登录,存在一个特殊的重新认证流程。

class  MyLoginViewModel {
  func refreshSession(delegate: AlfrescoAuthDelegate) {
    // The session object is the same one provided after the successfull log in
    if let session = self.session {  
      alfrescoAuth.pkceRefresh(session: session, delegate: self)
    }
  }
}

认证成功后,新的会话将通过didReceive(result:, session:)再次返回,并在更新存储的凭证后,您可以允许用户继续他们的活动。

内容服务API

content模块提供了与Alfresco内容服务一起使用的API绑定。

该模块包括对搜索核心的绑定,以便更容易集成到大多数应用程序中。

要开始使用此模块,您首先需要在业务逻辑层中导入它,然后将basePath静态属性设置为指向Alfresco的正确实例。

此外,您应提供一个凭证集,您可以将它附加到customHeaders属性中,或者使用credential: URLCredential?属性。

现在只需要获取一个服务并发出请求

class RecentsViewModel {
  func fetchRecentsList() {
    AlfrescoContentAPI.customHeaders = ["Authorization": authorizationHeaderValue()]
    SearchAPI.search(queryBody:"my querry", ...) {
      if let entries = result?.list?.entries {
        // handle results
      }
    }
  }
}

有关API的更多信息,请参阅我们的文档

开发

我们非常愿意接受您对这个项目的补丁和贡献。

代码审查

所有外部提交都需要正式审查。我们使用GitHub的拉取请求来解决这个问题。有关如何使用拉取请求的更多信息,请参阅GitHub帮助