CKAN - использовать API с curl и базовой аутентификацией Apache - PullRequest
0 голосов
/ 20 сентября 2018

Я создаю ресурсы в Ckan, используя curl, и все работает:

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 с basic-auth (поэтому, когда я пытаюсь войти вв веб-интерфейсе появляется всплывающее окно с запросом имени пользователя и пароля) curl перестает работать.Я добавляю опцию -u к команде curl, чтобы передать имя пользователя и пароль на веб-сервер, но я всегда получаю «Несанкционированный» ответ от Apache;Я также попытался передать имя пользователя и пароль с http://username:password@ckan.site.com или с -n и .netrc файлом, но мне не повезло.

Я подозреваю, что Apache связывается с заголовком «Авторизация»: одинпередается с параметром curl и -H, и другим, потому что в Apache настроена базовая аутентификация ( документация здесь ) ... возможно, они смешиваются?Если я попытаюсь просто curl -n https://ckan.site.com/, я смогу загрузить домашнюю страницу Ckan.

Вот базовая конфигурация аутентификации Apache:

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

А вот ошибка auth_basic, которую я вижу в журналах Apache:

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

1 Ответ

0 голосов
/ 21 сентября 2018

HTTP Basic Auth, как и многие другие схемы аутентификации HTTP, использует заголовок Authorization для передачи учетных данных от клиента к серверу.Это противоречит требованию CKAN об использовании заголовка Authorization для передачи ключа API.

Когда вы вручную устанавливаете заголовок Authorization в curl, вы переопределяете значение, которое будет установлено для Basic Auth.Вы можете проверить это самостоятельно, например, netcat.Вот запрос GET curl для Basic Auth:

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

Вывод из netcat -l 8080:

GET / HTTP/1.1
Host: localhost:8080
Authorization: Basic dXNlcjpwYXNz
User-Agent: curl/7.58.0
Accept: */*

Как видите, curl заполнил заголовок Authorizationзакодированные учетные данные для пользователя user и пароля 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 вызывает ошибку, которую вы видели (client used wrong authentication scheme).

Чтобы избежать этой проблемы, CKAN также принимает ключи API в заголовке X-CKAN-API-Key.Вы даже можете установить собственное имя для заголовка, используя конфигурационную опцию CKAN api_key_header_name.

...