CKAN-使用具有curl和Apache基本身份验证的API

时间:2018-09-20 10:41:30

标签: apache ckan

我使用curl在Ckan中创建资源,并且一切正常:

curl -H'Authorization: zzzzzz-zzzzz-zzzzz-zzzzz-zzzzzz' 'https://ckan.site.com/api/action/resource_create' --form upload=@/home/file.csv --form package_id=test-upload-file --form url='' --form name='test 12' --form format='csv'

但是,如果Ckan在具有基本身份验证的Apache Web服务器上(因此,当我尝试登录Web界面时,会弹出一个询问用户名和密码的弹出窗口),curl停止工作。我在curl命令中添加了-u选项,以将用户名和密码传递到Web服务器,但是我总是收到来自Apache的“未经授权”答复;我还尝试通过http://username:password@ckan.site.com或-n和.netrc文件传递用户名和密码,但是我没有运气。

我怀疑Apache搞砸了“ Authorization”标头:一个是通过curl和-H选项传递的,另一个是因为在Apache(documentation here)中配置了基本身份验证...也许它们混淆了? 如果我尝试简单地curl -n https://ckan.site.com/可以下载Ckan主页。

这是Apache基本身份验证配置:

<Location />
AuthType Basic
AuthName "ckan login"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Location>

这是我在Apache日志中看到的auth_basic错误:

client used wrong authentication scheme: /api/action/resource_create

1 个答案:

答案 0 :(得分:2)

HTTP基本身份验证与许多其他HTTP身份验证方案一样,使用Authorization标头将凭据从客户端传递到服务器。这与CKAN使用object标头传递API密钥的要求相冲突。

在curl中手动设置 // You don't want any formatting but a simple constructor var dateFrom = new DateTime(dateProperty.Value.Year - 1, 4, 1); // object.nullablebool == true - if object.nullablebool has value and the value is true if (object.nullablebool == true && (string == "V" || string == "N")) { // if someDate.Value is null the result will be false // All we have to do is to propagate the null: ?. in someDate?.Date if (someDate?.Date > dateFrom.Date && object.SomeOtherDate.HasValue) { // Code } else { // Code } } 标头时,将覆盖将为基本身份验证设置的值。您可以使用Authorization等进行测试。这是curl为基本身份验证产生的Authorization请求:

netcat

GET的输出:

curl 'http://user:pass@localhost:8080'

如您所见,curl用用户netcat -l 8080和密码GET / HTTP/1.1 Host: localhost:8080 Authorization: Basic dXNlcjpwYXNz User-Agent: curl/7.58.0 Accept: */* 的编码凭据填充了Authorization头。

现在让我们尝试一下,并手动为user指定一个值:

pass

Authorization的输出:

curl -H'Authorization: Foo' 'http://user:pass@localhost:8080'

我们的自定义值已覆盖基本身份验证的值。现在,Apache会将netcat(或您的API密钥)解释为HTTP身份验证方案的名称(例如之前的GET / HTTP/1.1 Host: localhost:8080 User-Agent: curl/7.58.0 Accept: */* Authorization: Foo ),因为它不适合您所使用的方案“用于保护URL的Apache会引发您所看到的错误(Foo)。

为避免此问题,CKAN还接受Basic标头中的API密钥。您甚至可以使用CKAN的api_key_header_name配置选项为标题设置自己的名称。