为什么 libgit2 将 GIT_CREDENTIAL_DEFAULT 作为凭证​​类型公开给凭证回调?

Why does libgit2 expose GIT_CREDENTIAL_DEFAULT as a credential type to the credential callback?

我有一个关于 GIT_CREDENTIAL_DEFAULT 的幼稚问题。为什么它暴露给客户必须实施的凭据回调?传输不仅可以为调用者处理这个问题吗?

服务器响应同时提供了 GIT_HTTP_AUTH_NEGOTIATE 和 GIT_HTTP_AUTH_NTLM,因此允许的 GIT_CREDENTIAL_DEFAULT 和 GIT_CREDENTIAL_USERPASS_PLAINTEXT 凭据类型被发送到回调。不幸的是,我在 GIT_CREDENTIAL_DEFAULT 之前检查了 GIT_CREDENTIAL_USERPASS_PLAINTEXT。我是否应该始终先检查 GIT_CREDENTIAL_DEFAULT 是否是允许的类型,然后再尝试其他凭证类型?

Should I just always be checking if GIT_CREDENTIAL_DEFAULT is an allowed type first and trying that before other credential types?

可能吧?这实际上取决于您想要支持的用户体验,但我认为这是大多数用户所期望的。

如果您处于基于 Kerberos 的环境中,那么作为用户,您可能只希望发生单点登录。

不过,您可能需要在此处保留一些状态,以防万一您在回调中提供 GIT_CREDENTIAL_DEFAULT,然后身份验证 失败 。在这种情况下,您可能想先尝试 GIT_CREDENTIAL_DEFAULT,如果失败则提示输入 username/password。 (不要陷入无限循环,而只是在回调中盲目地尝试 GIT_CREDENTIAL_DEFAULT。您可以使用选项结构上的有效负载来保持此状态。)

Why is it exposed to the credential callback that the clients have to implement? Can the transports not just handle this for the caller?

这是一个哲学问题。

这里libgit2的思想是我们不应该决定如何为你这个应用程序进行身份验证。您可以想象 Git GUI 可能会尝试连接到服务器,然后弹出一个对话框询问您如何进行身份验证。也许您想 select 当前登录的用户 用自定义 username/password.

覆盖它

如果您不想支持单点登录,那么要么我们需要给您一个表明您不想要它的选项,要么我们需要在凭据回调中为您提供数据,以便您可以选择对其进行操作。诚然,这是一个判断电话,但后者似乎更符合图书馆的工作方式。