Como posso forçar o mod_rewrite a enviar o componente de informações do usuário de um URI?

1

Um colega recomendou que eu repasse isso do StackOverflow para o ServerFault:

Isso tem me deixado louco. Eu tenho um aplicativo da web que está sendo servido via Apache Web Server. O servidor de banco de dados que faz o backup do aplicativo é o Apache CouchDB, que expõe uma API HTTP para recuperar documentos e transmitir anexos.

Eu assegurei o banco de dados do CouchDB fornecendo um objeto de segurança, que permite que apenas determinados usuários acessem dados no banco de dados e retorne o 401 para solicitações anônimas para terminais HTTP.

Eu quero poder mapear URLs públicos para anexos de documentos armazenados nesse banco de dados. Então, eu tentei criar uma regra de reescrita dentro do meu arquivo .htaccess, que faz proxy das solicitações de certas URLs diretamente para o CouchDB, enquanto codifica as credenciais do usuário, assim:

## DOWNLOAD STREAM:
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule download/(.*) http://user:[email protected]:5984/database/$1 [P]

Em um mundo ideal, o exemplo acima levaria o seguinte URL:

http://example.com/download/UUID/attachment.ext

E use o proxy para:

http://user:[email protected]:5984/database/UUID/attachment.ext

Esse método, de fato, faz proxy da solicitação para o CouchDB, mas omite o componente userinfo do esquema de URI. Portanto, a solicitação é tratada como anônima e recebo um erro 401. O anexo só é transmitido se eu remover a segurança do banco de dados.

Eu passei algumas horas lendo a configuração do Apache e fazendo experiências sem sucesso. Pesquisas na Web são infrutíferas por causa de todas as consultas relacionadas com palavras-chave semelhantes.

Como posso garantir que o mod_rewrite inclua o nome de usuário e a senha fornecidos na regra de reescrita quando os proxies são enviados ao CouchDB?

    
por StickByAtlas 01.08.2015 / 18:34

1 resposta

1

Eu percebi isso! Em vez de incluir o nome de usuário: senha como parte do esquema de URI, o cabeçalho de Autorização precisa ser definido independentemente. A solução a seguir funciona completamente dentro de um arquivo .htaccess , o que é importante, já que o OS X periodicamente elimina as configurações dentro dos sites do VirtualHost:

SetEnvIf Request_URI ^/download/* ADD_COUCH_BASIC_AUTH
RequestHeader set Authorization "Basic XXXXXXXXXXXX" env=ADD_COUCH_BASIC_AUTH

## DOWNLOAD STREAM
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule download/(.*) http://127.0.0.1:5984/database/$1 [P]

A maneira como isso funciona: usamos SetEnvIf para verificar se o caminho da solicitação corresponde ao caminho que queremos para o proxy e, em caso afirmativo, defina uma variável de ambiente arbitrária ADD_COUCH_BASIC_AUTH

Na linha subsequente, adicionamos um cabeçalho de Autenticação básica à solicitação de saída, somente se a variável de ambiente que definimos existir. Portanto, o cabeçalho de autenticação básico só será adicionado ao solicitar um recurso por meio de /download/ , enviando assim credenciais de autenticação para o CouchDB.

Nota: você terá que codificar em Base64 seu nome de usuário: credenciais de senha e substituir XXXXXXXXXXX pelo valor codificado. Uma maneira fácil de fazer isso em um Mac:

echo -n 'user:pass' | openssl base64

Espero que isso ajude alguém além de mim!

    
por 01.08.2015 / 20:21