CKAN-将API与curl和Apache基本身份验证一起使用
我使用curl在Ckan中创建资源,一切正常: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-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已经用useruser
和passwordpass
的编码凭证填充了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选项为标题设置自己的名称