使用 fastlane 的两因素身份验证

Posted

技术标签:

【中文标题】使用 fastlane 的两因素身份验证【英文标题】:Two-factor Authentication With fastlane 【发布时间】:2020-12-09 23:15:59 【问题描述】:

我在使用 CI 机器时将我的应用程序发布到 Firebase 分发抛出 Fastlane。 我面临 2FA 的问题。

我正在使用 Match 来检索我的证书。 这就是我在“Appfile”下的内容

app_identifier "com.example.example" # the bundle 
apple_id "appleAcount@gmail.com" # Your Apple
team_id "abcd..."  # Developer Portal Team ID
ENV["FASTLANE_USER"] = "appleAcount@gmail.com"
ENV["MATCH_PASSWORD"] = ""
ENV["FASTLANE_PASSWORD"] = ""
ENV["FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"] = ""

这是我收到的错误:

为帐户启用了双因素身份验证(6 位代码) 'appleAcount@gmail.com' 有关二因素的更多信息 认证:https://support.apple.com/en-us/HT204915

如果您在非交互式会话(例如服务器或 CI) 退房 https://github.com/fastlane/fastlane/tree/master/spaceship#2-step-verification

(输入sms 退出此提示并选择受信任的电话号码 以短信形式发送代码)

(也可以设置环境变量 SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER 自动执行此操作)(阅读更多 在: https://github.com/fastlane/fastlane/blob/master/spaceship/docs/Authentication.md#auto-select-sms-via-spaceship_2fa_sms_default_phone_number)

请输入6位密码:

我已阅读此“https://docs.fastlane.tools/best-practices/continuous-integration/”但没有运气。谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

fastlane 团队在最近的版本中(从 2.157.0 到 2.163.0 到目前为止)做得很好❤,以支持在许多操作中使用 API key for App Store Connect API(pilotdelivermatch等 - 每个工具的状态为available here)。

使用 API 密钥无需提供 Apple 帐户来验证和授权 fastlane 操作以在 App Store Connect 上执行操作,这也意味着您将不再在 CI 机器上遇到 2 因素问题或当会话失效时,必须通过fastlane spaceauth 手动重新生成会话。

来自App Store Connect API Key page:

生成 API 密钥允许您为该密钥配置、验证和使用一项或多项 Apple 服务。密钥不会过期,但一旦创建就无法修改以访问更多服务。一次最多可以有 50 个活动键

使用 API 密钥还有其他好处,这是推荐的解决方案,如 fastlane documentation 中所述:

fastlane 历来使用带有用户名和密码的 Apple ID 使用基于 cookie 的 Web 会话进行身份验证。快车道将继续 使用相同的基于 cookie 的 Web 会话进行身份验证 App Store Connect API 的非官方版本。

但是,建议在您使用 API Key 身份验证时 能够。好处包括:

无需 2FA 更好的性能 文档化 API 提高可靠性

我不会在这里详细说明设置和使用 API 密钥的步骤,因为它已经在 the documentation 中进行了很好的解释,但这里是主要步骤:

    从 App Store Connect 创建一个新的 API 密钥(您必须具有“帐户持有人”角色才能创建一个)并为其分配“应用程序管理员”角色(参见 Role permissions documentation), 将密钥及其信息存储在您的 CI 中, 在您的 Fastfile 中,使用存储在 2 中的值调用 app_store_connect_api_key 操作。 在调用动作时将 3. 返回的值作为api_key 参数传递,或者让动作自己从车道上下文中检索其值(如果支持的话)。

由于会话无效导致的 2FA 问题:

应该消失 :)

【讨论】:

这个方法很棒,但它有一个问题......它在大多数 CI 中不起作用,比如 Bitrise 和其他。在那里,仍然需要使用有效期为 30 天的基于会话的身份验证。 devcenter.bitrise.io/getting-started/… 我从未使用过 Bitrise,但确实太糟糕了,他们不提供此选项(我的屏幕截图在 Github Actions 上),但这是 CI 的限制,而不是 fastlane。这可能会在未来发生变化,因为 Bitrise 已经弃用了旧的基于会话的 ios Auto Provision 自动代码签名授权(但不支持 fastlane):blog.bitrise.io/app-store-connect-api-on-bitrise @Vizllx 我们让它为 Bitrise 工作。我们刚刚将应用商店连接 api 密钥添加到机密中。 download_metadata 不接受 api_key 值,因此我无法使其工作。和想法? 创建 API 密钥时,请确保为其赋予“应用程序管理员”角色。【参考方案2】:

您需要设置一个环境变量 'FASTLANE_SESSION'='---\n....\n' 令牌。

要获取此令牌,您需要使用以下命令手动进行身份验证:

fastlane spaceauth -u YOUR_APP_STORE_EMAIL

示例 fastlane spaceauth -u joe@test.com.

您需要每 2-3 周(例如 30 天)重新验证您的会话。这个过程现在有点痛苦。

【讨论】:

我们的会话每 8 小时到期一次......这根本不是一个好的解决方案:/ 但至少它利用了我们的帐户被多个其他帐户邀请的事实。使用 API 密钥,我们必须要求每个客户端创建一个 API 密钥才能使自动化工作。 在使用 fastlane spaceauth -u YOUR_APP_STORE_EMAIL 请求网络会话时出现错误“无法登录 App Store Connect”。但它通过使用 sudo (sudo fastlane spaceauth -u YOUR_APP_STORE_EMAIL) 调用它来修复。可能对任何人都有用。【参考方案3】:

    在Users page 中创建一个新的 App Store Connect API 密钥

    欲了解更多信息,请转至App Store Connect API Docs

    为您的 API 密钥分配适合手头任务的角色。你可以在Permissions in App Store Connect阅读更多关于角色的信息

    下载新创建的 API Key 文件 (.p8) 页面刷新后无法再次下载此文件

    在您的项目中添加密钥

lane :release do
  api_key = app_store_connect_api_key(
    key_id: "D383SF739",
    issuer_id: "6053b7fe-68a8-4acb-89be-165aa6465141",
    key_filepath: "./AuthKey_D383SF739.p8",
    duration: 1200, # optional (maximum 1200)
    in_house: false # optional but may be required if using match/sigh
  )

  pilot(api_key: api_key)
end

more details

【讨论】:

或者只是pilot在最后。

以上是关于使用 fastlane 的两因素身份验证的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 中的两因素身份验证 - 如何验证令牌

带有 Spring Security 的 Spring Boot - 使用 SMS/PIN/TOTP 的两因素身份验证

两因素 Google 身份验证与服务器上的代码不匹配 - ASP.Net MVC

Node.js 双重身份验证

Shiro,多因素身份验证

在 2 因素身份验证中使用啥 HTTP 状态