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身份服务进行工作以及进行基本身份验证。
基本身份验证
对于基本身份验证,您需要自行构建UI来收集凭据。库中提供的内容不多,但您可以利用我们在示例应用中使用的一些结构。
SSO身份验证
对于单点登录(SSO),您的活动必须为用户提供一个WebView以登录,然后在结束时收集令牌。
实现这一功能需要多个步骤。
在Keycloak中注册移动客户端ID
请注意,此步骤是可选的,因为这可能已经被您的管理员处理。
首先,您需要在身份服务中定义一个将服务于移动应用的客户端。访问Keycloak管理界面并导航到客户端页面。添加一个新的客户端条目,并记下客户端ID值。保存条目后,在下一页上,搜索“有效重定向URI”字段。此特定字段的值应该是以下格式 clientID://自定义域名/auth
。
在您的移动应用中注册重定向URI
确保已设置的重定向URI也反映在移动客户端的设置中。为此,打开您的项目的Info.plist
文件,并添加以下结构
- 添加一个“URL types”键,其类型为数组
- 将“URL types”作为一个子依赖项,添加一个新的键,其类型为字典
- 在前面项目的子依赖项中,添加一个“URL Schemes”键,其类型为String,其值为先前设置的重定向URI。
有关更多信息,请参阅我们的示例应用。
调用AlfrescoAuth API
首先,您的视图模型将需要使用您的配置初始化认证模块,并调用认证方法。配置对象需要与身份服务中的配置匹配。
class MyLoginViewModel {
init() {
alfrescoAuth = AlfrescoAuth.init(configuration: authConfig)
}
...
}
接下来,在认证模块上调用pkceAuth
方法,传入您想要显示SSO Webview的视图控制器和用于接收更新的委托类。
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
应用程序委托方法返回给应用,因此您需要将其通过当前授权会话传递。
在 AlfrescoSession
对象上调用 resumeExternalUserAgentFlow
方法,并转发由 openURL 方法提供的 URL。
您可以通过查看我们的示例应用来了解 如何处理此问题。
认证之后
因为认证是一个独立的步骤,所以我们强烈建议您在 didReceive 之前进行额外的验证,然后再让用户进入应用程序。
您可以在此时检查一些内容,例如配置文件信息或权限,这可能需要调用 Alfresco 服务,从而验证认证会话是否正常工作。
保持会话对象存活
根据所期望的认证模式,会话对象可能需要在对象图中保持存活。这适用于 PKCE 认证模式。
认证成功后,AlfrescoAuth 模块将提供一个应在其会话存活期间引用的 AlfrescoSession
对象。这是您需要序列化的唯一对象,以保留授权状态。
登出
通常情况下,您可以直接销毁持久化的凭据,但在 SSO 情况下,需要使会话失效,否则用户将不会弹出凭据提示重新登录。
为此,只需在 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>) {
...
}
}
重新认证
在SSO的情况下,刷新令牌可能会过期或远程操作者可能会使用户的会话在身份服务中失效。
即使在基本认证场景中,如果密码被更改,也可能发生这种情况。
当这种情况发生时,我们建议您提示用户他将必须重新登录。
对于基本认证,您需要自己了解如何整合,而对于SSO,存在一个特别的重新认证流程。
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
内容模块提供了用于与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 pull requests(Pull请求)来进行这一目的。有关使用Pull请求的更多信息,请参阅GitHub帮助。