htaccess excluye una URL de la autenticación básica

79

Necesito excluir una URL (o incluso mejor un prefijo) de la protección normal de autenticación básica de htaccess. Algo como /callbacks/myBanko /callbacks/.* ¿Tienes alguna pista de cómo hacerlo?

Lo que no estoy buscando es cómo excluir un archivo. Esta tiene que ser una URL (ya que esta es una solución basada en el marco PHP, y todas las URL se redirigen con mod_rewritea index.php). Entonces no hay ningún archivo bajo esta URL. Nada.

Algunas de esas URL son solo devoluciones de llamada de otros servicios (no se conoce ninguna IP, por lo que no puedo excluir según la IP) y no pueden solicitar Usuario / Contraseña.

La definición actual es tan simple como:

AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
require valid-user 
KrzysDan
fuente

Respuestas:

59

Si está utilizando Apache 2.4 SetEnvIfy las soluciones mod_rewrite ya no son necesarias ya que la Requiredirectiva puede interpretar expresiones directamente:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require valid-user

Apache 2.4 trata las Requiredirectivas que no están agrupadas por <RequireAll>como si estuvieran en una <RequireAny>, que se comporta como una declaración "o". Aquí hay un ejemplo más complicado que demuestra hacer coincidir tanto el URI de solicitud como la cadena de consulta, y recurrir a la necesidad de un usuario válido:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

<RequireAny>
    <RequireAll>
        # I'm using the alternate matching form here so I don't have
        # to escape the /'s in the URL.
        Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#

        # You can also match on the query string, which is more
        # convenient than SetEnvIf.
        #Require expr %{QUERY_STRING} = 'secret_var=42'
    </RequireAll>

    Require valid-user
</RequireAny>

Este ejemplo permitiría el acceso /callbacks/foo?secret_var=42pero requeriría un nombre de usuario y una contraseña para /callbacks/foo.

Recuerde que, a menos que lo utilice <RequireAll>, Apache intentará hacer coincidir cada uno Require de ellos en orden, así que piense primero qué condiciones desea permitir.

La referencia de la Requiredirectiva está aquí: https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

Y la exprreferencia de la esión está aquí: https://httpd.apache.org/docs/2.4/expr.html

beporter
fuente
3
Tuve que eliminar las comillas dobles alrededor de Require expr para que funcione en apache 2.4.7. Aparte de eso, funcionó perfectamente.
Scott Smith
Yo también tuve que eliminar las comillas dobles, pero funcionó perfectamente.
TMPilot
1
No funciona en mi instalación de Apache 2.4.10 / cakephp 3. Quiero excluir / descansar, que es una ruta virtual (regla de reescritura). No puedo entender por qué no funciona.
Stephan Richter
3
@ stephan-richter sospecho porque el %{REQUEST_URI}valor es la cadena reescrita. Para Cake 3, eso termina siendo casi siempre /webroot/index.php. Es posible que deba idear un enfoque alternativo, como usar Cake para manejar la autenticación de rutas.
beporter
Tienes razón. Publiqué una pregunta sobre este problema y encontré la respuesta yo mismo: stackoverflow.com/questions/41077895/…
Stephan Richter
85

Usando SetEnvIf , puede crear una variable cuando la solicitud comience con alguna ruta, luego use la Satisfy Anydirectiva para evitar tener que iniciar sesión.

# set an environtment variable "noauth" if the request starts with "/callbacks/"
SetEnvIf Request_URI ^/callbacks/ noauth=1

# the auth block
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd

# Here is where we allow/deny
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth

El grupo de directivas permitir / denegar dice que niega el acceso a TODOS , excepto cuando hay un usuario válido (inicio de sesión de autenticación BÁSICO exitoso) o si la noauthvariable está configurada.

Jon Lin
fuente
Agregué esta sección en <VirtualHost *: 80> DocumentRoot / var / www / Symfony / web / <Directory / var / www // Symfony / web> pero no funciona.
vishal
¿Podría explicar por qué <Archivos> no funciona aquí?
asdmin
1
¡Gracias! Realmente me ayudó, ten cuidado con el caso, lo hice Order deny,allowy no funcionaría. ¡No hace falta decir que muy frustrante!
James F
2
puede requerir una Allow from env=REDIRECT_noauthURL reescrita. Podría haber sido el problema con @vishal. Eche un vistazo aquí: [ stackoverflow.com/a/41092497/1285585]
Stephan Richter
2
Necesito ambas líneas Allow from env=noauthy Allow from env=REDIRECT_noauthque funcione.
CDuv
6

Esta solución funciona bastante bien, solo necesita definir la lista blanca por la que desea pasar.

SetEnvIfNoCase Request_URI "^/status\.php" noauth

AuthType Basic
AuthName "Identify yourself"
AuthUserFile /path/to/.htpasswd
Require valid-user

Order Deny,Allow
Deny from all
Allow from env=noauth

Satisfy any
Nick Z
fuente
4

Probé las otras soluciones, pero esto es lo que funcionó para mí. Ojalá sea de ayuda para otros.

# Auth stuff
AuthName "Authorized personnel only."
AuthType Basic
AuthUserFile /path/to/your/htpasswd/file

SetEnvIf Request_URI "^/index.php/api/*" allow
Order allow,deny
Require valid-user
Allow from env=allow
Deny from env=!allow
Satisfy any

Esto permitirá que la URL de la API y cualquier cadena de URL posterior se /index.php/api/abran sin tener que iniciar sesión y se le pedirá que inicie sesión.

Ejemplo:

mywebsite.com/index.php/apise abrirá sin que se le solicite que inicie sesión mywebsite.com/index.php/api/soap/?wsdl=1se abrirá sin que se le solicite que inicie sesión mywebsite.comse le pedirá que inicie sesión primero

MagentoMan
fuente
1
<location />
        SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1

        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/passwords/passwords
        Order Deny,Allow
        Satisfy any
        Deny from all
        Allow from env=REDIRECT_noauth
        Require user yournickname
</location>
bluszcz
fuente
0

Otro enfoque funciona así, si el área que está protegiendo tiene un script PHP monolítico controlando todo, como Wordpress. Configure la autenticación en un directorio diferente. Coloque allí un index.php que establezca una cookie en la ruta '/'. Luego, en Wordpress (por ejemplo), verifique la cookie, pero omita la verificación si $ _SERVER ['REQUEST_URI'] es la URL excluida.

En mi plataforma de alojamiento compartido, RewriteRule no pudo establecer una variable de entorno que funcionara con "Satisfacer cualquiera".

Con cualquier enfoque, tenga cuidado de que la página que está protegiendo no incluya imágenes, hojas de estilo, etc., que desencadenan una solicitud de autenticación cuando la página en sí no lo hace.

Kitchin
fuente
0

Agregue el siguiente código a su archivo htaccess raíz y no olvide cambiar su URL de administrador, página de archivo .htpasswd.

<Files "admin.php">
        AuthName "Cron auth"
        AuthUserFile E:\wamp\www\mg\.htpasswd
        AuthType basic
        Require valid-user
    </Files>

Cree el archivo .htpasswd en su carpeta raíz y agregue el nombre de usuario y la contraseña a continuación (establezca el nombre de usuario predeterminado: admin y contraseña: admin123)

admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.

Por favor, avíseme si aún tiene algún problema.

Liendres
fuente
0

¿Por qué no utilizas la autenticación básica de la forma prevista?

user:[email protected]/callbacks/etc
ryaan_anthony
fuente
1
Bueno, porque a) nadie realmente quiere datos de autenticación ™ en la cadena URI, yb) porque es probable que OP no tenga la oportunidad de personalizar la llamada (dado que está hablando de devoluciones de llamada de un banco, supongo que no puede cambiar la comportamiento en el lado del cliente)
frank42