将 CloudKit Web Services 的身份验证流程与 Zapier 结合使用
Posted
技术标签:
【中文标题】将 CloudKit Web Services 的身份验证流程与 Zapier 结合使用【英文标题】:Use CloudKit Web Services' authentication flow in combination with Zapier 【发布时间】:2021-03-23 20:00:47 【问题描述】:我正在开发一个使用 CloudKit 作为其后端的Mac app。我的一些用户要求能够通过自动化/集成服务(例如 Zapier)摄取和提取数据。为此,我需要引入一个 Web API。
我打算使用CloudKit Web Services 来访问应用程序的数据。此数据是特定于用户的,因此驻留在私有数据库中。因此,CloudKit 需要用户身份验证,如 here 所述。
本质上,用户需要被重定向到 Apple 托管的身份验证页面。认证成功后,会提供一个认证令牌,可用于数据操作。类似于 OAuth2 的工作方式,但不同之处足以不能与 Zapier(或可能任何其他类似服务)supported authentication schemes 一起使用。
谁做过类似的事情?我有哪些选择?我想让事情尽可能简单,并使我的 Web API 的实现尽可能精简。
谢谢。
尼尔斯
【问题讨论】:
【参考方案1】:这绝对是可行的,并且您的想法已经步入正轨。这是我设想的工作方式:
-
您可以使用前端 Web 应用程序完成所有这些操作(无需服务器端应用程序)。我个人更喜欢Vue.js,但你可能已经想到了什么。
您的应用程序将需要使用您提到的流程向 CloudKit 验证用户。我强烈建议您使用Web Services API,而不是试图与 Apple 被忽视的 CloudKit JS API 抗争。为此,您需要在 CloudKit 仪表板中生成 API 令牌。
然后您的应用会提示用户向 Zapier 进行身份验证。
您现在应该在用户的浏览器缓存中拥有 CloudKit 和 Zapier 的用户凭据(例如,您可以将 CloudKit 令牌保存到
sessionStorage
,同样使用 Zapier)。
对 Zapier 进行 API 调用,下拉数据,然后将其保存到 CloudKit 中,所有这些都在您的 JS 应用程序中。此时都是 API 事务。我是Axios 的粉丝,因为我提出了 HTTP 请求。
如果您正在下载文件、处理大量数据或处理处理器密集型工作,您可能会考虑使用服务器来完成这项工作。但是,如果您只需要一个地方来拉取和推送合理的数据块,我认为您没有理由不能在前端应用程序中完成这一切。
或者,如果您根本不想要 Web 应用程序,而只想让用户在 Mac 应用程序中工作,也可以这样做。只需从您的 Cocoa 应用程序中直接对 Zapier 进行 API 调用。这是否可行取决于您希望它如何工作。
如果您有更具体的问题或在任何实施细节方面需要帮助,请随时添加后续评论或提出新问题。
祝你好运!
【讨论】:
非常感谢您的详细回答。理想情况下,我想直接从应用程序推送到 Zapier。但我不知道 Zapier 支持这个?他们不需要我端的 Web API 来访问数据吗? Zapier 使用身份验证(让 Zapier 代表用户对我的 API 进行身份验证)、触发器(根据从我的 API 获得的数据启动工作流)和操作(从我的 API 访问和更改数据)等概念。当我没有 API 而是仅依赖于将数据从我的应用程序直接发布到 Zapier 时,这些概念将如何运作? 我没有这方面的丰富经验,但是您应该能够使用URLSession
:developer.apple.com/documentation/foundation/urlsession 从您的 Mac 应用程序与 Zapier 的 Web API 进行交互...我已经完成了 OAuth之前在 Mac 应用程序中进行身份验证。您通常可以设置一个回调 URL 并指定一个将打开您的本机应用程序的 URL。例如:yourApp://callback?data1=abc&value2=xyz
但是 Zapier 的身份验证部分不是针对 Zapier 进行身份验证,而是让 Zapier 针对我的 API 进行身份验证,对吗?您能否指出我如何与他们的 API 交互的 (API) 文档?【参考方案2】:
我认为另一个答案大部分是正确的。我对 CloudKit 了解不多,但我们可以讨论您需要什么才能使其工作。
假设您有一个简单的 iOS 应用来存储联系人。在 iOS 端,Apple 大概抽象了上传和下载操作。
如果您想使用 CloudKit 为同步的联系人创建一个 Web 查看器,您需要一个端点来获取属于经过身份验证的用户的所有行(每个行都有一个 UUID、姓名和电话号码)。我相信 Apple 提供的 CloudKit 代码可以做到这一点(但如果我不在基地,请告诉我)。
现在,我们想与 Zapier 集成。比如说,“新联系人”触发器。您代表经过身份验证的用户从 Zapier 向 Apple 发出某种经过身份验证的 HTTP 请求。它会返回一个联系人列表,Zapier 可以触发它以前从未见过的联系人。为此,Zapier 需要某种用户令牌。
这就是其他回答者提到的小前端页面发挥作用的地方。如果您有一个可以向他们展示用户令牌的网页,他们可以将其粘贴到 Zapier 中,以上所有这些都成为可能。我不确定令牌的寿命是多少,但希望它可以根据需要自动刷新(而不是用户需要采取任何手动操作)。
我不确定我所描述的是否可行,但请告诉我是否可行。如果可以将 Zapier 和 iOS 生态系统整合起来,那将是巨大的!
编辑以响应 cmets:
Zapier 无法以对我来说足够的方式与 CloudKit 交互(需要一些小的业务逻辑)
我不确定这对您来说意味着什么,但通常将逻辑放入 Zapier 集成中以按照 Zapier 期望的方式构建数据。有一个完整的 Node.js 执行环境,所以这里没有限制。
我认为 Zapier 不能针对 CloudKit 进行身份验证,因为它使用非标准身份验证方案
一旦您获得了用户的令牌(如上所述,这是不寻常的),您几乎肯定可以在对 cloudkit 的请求中使用它。 Zapier 提供了一个“自定义”身份验证方案,基本上可以让您做任何您想做的事情。因此,除非 Apple 使用 fetch
无法处理的东西(不太可能),否则应该没问题(一旦您获得令牌)。
我想将数据直接从我的应用推送到 Zapier 并让它完成用户配置的任何魔法
这也是可能的。 Zapier 通过两种方式摄取数据:
轮询,Zapier 经常发出 Web 请求,存储我们以前见过的项目的 ID,然后对新的项目采取行动。您可以阅读更多关于 here 的信息。假设您可以将您的业务逻辑融入到集成中,这不需要 Apple 之外的外部服务器 webhooks,Zapier 在其中向您注册订阅,然后您根据需要向该地址发送新数据。这可能需要您端的网络服务器来处理。但它是可选的 - 您可以改为进行轮询。希望这能澄清一点。请随时联系partners@zapier.com 并参考此问题以进行更多讨论。
【讨论】:
这仍然很可能需要我的 Web API,因为 Zapier 无法以对我来说足够的方式与 CloudKit 交互(需要一些小的业务逻辑)。但即使可以直接完成,我认为 Zapier 也无法针对 CloudKit 进行身份验证,因为它使用非标准身份验证方案。理想情况下,我想将数据直接从我的应用程序推送到 Zapier 并让它完成用户配置的任何魔法。但根据我目前的经验,这不是 Zapier 支持/所做的。我想我需要介绍我自己的带有自定义身份验证的 Web API。 @NielsMouthaan 我已经编辑了我的答案以回答其中一些问题 - 我仍然大部分时间都在黑暗中拍摄,但绝对有可能! 谢谢。一旦我开始进行这种集成,就会考虑它们。在阅读您的文章时,我想到了一些 cmets: 我不确定您的 cmets 是否已发布 - 所以 cmets 不是多行的 显然他们没有?。您的投票和 webhook 建议仍然需要我的 web API,这是我希望避免的。我希望直接从我的应用程序(因此,发布)将数据推送到 Zapier。然后,这将根据用户配置集成的方式触发某种操作。但我不认为 Zapier 会做这种事情。以上是关于将 CloudKit Web Services 的身份验证流程与 Zapier 结合使用的主要内容,如果未能解决你的问题,请参考以下文章
在 Google Apps 脚本中使用 CloudKit Web 服务 API 查询 CloudKit 公共数据库时的 AUTHENTICATION_FAILED
将python web services 部署到tomcat上
使用 Exchange Web Services 2007 将电子邮件标记为已读