尝试从 Artifactory 虚拟存储库下载时,SBT 无法找到凭据

Posted

技术标签:

【中文标题】尝试从 Artifactory 虚拟存储库下载时,SBT 无法找到凭据【英文标题】:SBT is unable to find credentials when attempting to download from an Artifactory virtual repo 【发布时间】:2017-03-06 14:45:05 【问题描述】:

我正在尝试在公司防火墙后面运行 SBT。另一个团队配置了 Artifactory 代理。这个代理在开启匿名访问的情况下可以正常工作,但是当我们让它需要密码时就会开始出错。

当我在我的工作站上运行 SBT 时,我收到以下错误:

[error] Unable to find credentials for [Artifactory Realm @ coderepo.xxx.amrs.bigco.com]

这样做的结果是我无法引导 sbt:

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: org.scala-lang#scala-library;2.10.6: not found
[warn]  :: org.scala-sbt#sbt;0.13.12: not found
[warn]  :: org.scala-lang#scala-compiler;2.10.6: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

我尝试将 .credentials 文件放入 ~/.sbt 和 ~/.ivy2:我一直在测试以下变体,所有这些都不起作用:

realm=Artifactory Realm @ coderepo.xxx.amrs.bigco.com
host=coderepo.xxx.amrs.bigco.com
user=<username>
password=<pwd>

我猜这个错误意味着它无法找到与领域匹配的凭据定义,所以我在两个位置尝试了第一行的多个版本:

realm=Artifactory Realm
realm=[Artifactory Realm @ coderepo.xxx.amrs.bigco.com]
realm=coderepo.xxx.amrs.bigco.com

这些似乎都没有任何影响。

那么,允许 SBT 使用用户名和密码对受密码保护的 Artifactory 存储库进行身份验证的正确方法是什么?

UPDATE0:根据 Ivy 文档,最有可能的领域名称就是“Artifactory Realm”。根据 SBT 文档,凭据文件的正确默认位置应该是 %USERPROFILE%/.sbt/.credentials(是的,我使用的是 Windows)。即使删除了我的 .ivy2 目录中的 .credentials 文件,它仍然无法正常工作。

UPDATE1:相关但实际上没有帮助:

SBT not passing credentials when publishing to Artifactory Sbt can't authorize in Artifactory

UPDATE2:我开始怀疑这是 sbt 中的错误 - 我在这里添加了一个问题:https://github.com/sbt/sbt/issues/2817

【问题讨论】:

【参考方案1】:

有关如何配置全局凭据的详细信息,请参阅this question。

总结一下:

如果您需要从代理存储库启动 SBT,请将系统属性 sbt.boot.credentials 设置为指向您的凭据文件。您可以在 %CSIDL_PROGRAM_FILESX86%/sbt/conf/sbtconfig.txt 中执行此操作,例如:

-Dsbt.boot.credentials=/Users/my-user-name/.sbt/credentials

您也可以将SBT_CREDENTIALS 环境变量用于相同目的。

对于 Artifactory,credentials 文件中的领域应设置为:

realm=Artifactory Realm

为了验证依赖项工件检索,创建一个类似%USERPROFILE%/.sbt/0.13/plugins/my-credentials.sbt 的文件,并设置credentials。例如:

credentials += Credentials(Path.userHome / ".sbt" / "credentials")

【讨论】:

export SBT_CREDENTIALS=some_credentials; sbt publish 还不够。您需要的是 1) credentials += Credentials(file("some_credentials")) in build.sbt。或 2) credentials += Credentials(Path.userHome / ".sbt" / ".credentials") in ~/.sbt/1.0/plugins/credentials.sbt @prayagupd 哦,你真的救了我!所有的文档都是错误的。 @ViktorHedefalk 很高兴为您提供帮助。这也可能会有所帮助publish a scala app with credentials? 我遇到了同样的问题,并且在 1.0 文件夹中丢失了 credentials.sbt。【参考方案2】:

我认为这个文件的默认位置是$HOME/.sbt/&lt;sbt-version&gt;/.credentials;虽然我相信有关于此的已发布文档,但我通过单击代码确认了这一点。 @salim-fadhley,看起来您在路径中缺少 SBT 版本。

编辑:您需要将DefaultOptions.addCredentials 添加到您的build.sbt;然后,您可以使用show credentials 验证 SBT 接收到的内容。

撇开文件位置不谈,存储库名称(无意义)与安全领域(无意义)之间似乎存在混淆。

从存储库服务器返回的 auth-challenge 将包含 安全领域的名称;作为客户/开发人员,您无法控制它是什么,我猜它必须与您(客户/开发人员)在.credentials 文件中指定的领域匹配(无论是什么地方)。

同时,存储库名称(如 build.sbt 中的特色)实际上对相应项目开发之外的任何人都没有任何意义,例如存储库服务器管理员不在乎从一个项目到下一个项目。

【讨论】:

【参考方案3】:

关于环境的细节 -

Operating System - MacOS Catalina
    
exampleUser@exampleUser-mbp-2 plugins % sbt -version
sbt version in this project: 1.4.7
sbt script version: 1.4.7
    
exampleUser@exampleUser-mbp-2 plugins % scala -version
Scala code runner version 2.11.12 -- Copyright 2002-2017, LAMP/EPFL

用户HOME目录-

exampleUser@exampleUser-mbp-2 plugins % echo $HOME
/Users/exampleUser

credentials.sbt 文件的位置 - $HOME/.sbt/1.0/plugins

.credentials 文件存储username/password 组合,并由Artifactory 用于验证。 我们应该在credentials.sbt文件中输入.credentials文件的位置。

示例条目如下-

exampleUser-mbp-2:plugins exampleUser$ cat $HOME/.sbt/1.0/plugins/credentials.sbt 
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")

【讨论】:

以上是关于尝试从 Artifactory 虚拟存储库下载时,SBT 无法找到凭据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Artifactory 存储库下载最新的工件?

离线安装 Maven 存储库 - Artifactory

Artifactory 无法更新存储库 - 存储库聚合另一个具有不匹配包类型的存储库

Artifactory 中部署的工件未显示在虚拟存储库中

Artifactory - 通用回购:存档下载失败

如何从经过身份验证的私有 Artifactory PyPI 存储库中提取 Python 包?