我使用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
答案 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
配置选项为标题设置自己的名称。