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
.