CKAN-将API与curl和Apache基本身份验证一起使用

CKAN-将API与curl和Apache基本身份验证一起使用,apache,ckan,Apache,Ckan,我使用curl在Ckan中创建资源,一切正常: curl-H'授权:zzzz-zzzzz-zzzzz-zzzzz-zzzzz''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位于带有basic a

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

curl-H'授权:zzzz-zzzzz-zzzzz-zzzzz-zzzzz''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位于带有basic auth的apacheweb服务器上(因此当我尝试登录到web界面时,会出现一个询问用户名和密码的弹出窗口),curl将停止工作。我在curl命令中添加了-u选项,以便将用户名和密码传递给web服务器,但我总是收到来自Apache的“未经授权”答案;我还尝试通过-n和.netrc文件传递用户名和密码,但没有成功

我怀疑Apache弄乱了“Authorization”头:一个是通过curl和-H选项传递的,另一个是因为Apache()中配置了基本身份验证。。。也许他们弄错了? 如果我尝试简单地
curl-nhttps://ckan.site.com/
我可以下载Ckan主页

以下是Apache基本身份验证配置:

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

AuthType Basic
AuthName“ckan登录”
AuthUserFile/etc/apache2/.htpasswd
需要有效用户
下面是我在Apache日志中看到的auth_基本错误:


客户端使用了错误的身份验证方案:/api/action/resource\u create

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

在curl中手动设置
授权
标题时,会覆盖将为基本授权设置的值。您可以自己使用,例如,
netcat
进行测试。下面是为基本身份验证生成的
GET
请求:

curl 'http://user:pass@localhost:8080'
netcat-L8080的输出:

GET / HTTP/1.1
Host: localhost:8080
Authorization: Basic dXNlcjpwYXNz
User-Agent: curl/7.58.0
Accept: */*
正如您所看到的,curl已经用user
user
和password
pass
的编码凭证填充了
Authorization
标题

现在,让我们尝试同样的方法,并手动为
授权指定一个值:

curl -H'Authorization: Foo' 'http://user:pass@localhost:8080'
来自netcat的输出

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

为了避免这个问题,CKAN还接受
X-CKAN-API-Key
头中的API键。您甚至可以使用CKAN的config选项为标题设置自己的名称