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帮助。