htaccess - basic authentication apache
htaccess excluye una URL de Basic Auth (8)
Necesito excluir una Url (o incluso mejor un prefijo) de la protección de autenticación básica de htaccess normal. Algo así como / devoluciones de llamada / myBank o / devoluciones de llamada /. * ¿Tiene alguna pista de cómo hacerlo?
Lo que no estoy buscando es cómo excluir un archivo. Esto tiene que ser url (ya que esta es una solución basada en el marco PHP, y todas las URL se redirigen con mod_rewrite a index.php). Por lo tanto, no hay ningún archivo debajo de 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 excluirlas en función de 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
¿Por qué no solo usas autenticación básica de la manera en que fue diseñada?
user:[email protected]/callbacks/etc
Agregue el código siguiente 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 debajo el nombre de usuario y la contraseña (configure el nombre de usuario predeterminado: admin y contraseña: admin123)
admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.
Por favor, avíseme si aún enfrenta algún problema.
Con SetEnvIf , puede crear una variable cuando la solicitud comienza con alguna ruta, luego use la directiva Satisfy Any
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 bloque permitir / denegar de las directivas indica que se niega el acceso a TODOS , excepto cuando hay un usuario válido (inicio de sesión de autenticación BASIC satisfactorio) o si se establece la variable noauth
.
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
Otro enfoque funciona así, si el área que está protegiendo tiene un script PHP monolítico que controla todo, como Wordpress. Configure Autenticación con 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 saltee 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 funcionó con "Satisfy any".
Con cualquier enfoque, tenga en cuenta que la página que está protegiendo no incluye imágenes, hojas de estilo, etc., que activan una solicitud de autenticación cuando la página no lo hace.
Probé las otras soluciones, pero esto es lo que funcionó para mí. Con suerte será 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 API y cualquier cadena de URL después de /index.php/api/
abra sin tener que iniciar sesión y se pedirá a cualquier otra cosa que inicie sesión.
Ejemplo:
mywebsite.com/index.php/api
se abrirá sin que se solicite el inicio de sesión mywebsite.com/index.php/api/soap/?wsdl=1
se abrirá sin que se solicite el inicio de sesión Se solicitará a mywebsite.com
que inicie sesión primero
Si está utilizando Apache 2.4, las soluciones temporales SetEnvIf y mod_rewrite ya no son necesarias ya que la directiva Require
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 directivas Require
que no están agrupadas por <RequireAll>
como si estuvieran en un <RequireAny>
, que se comporta como una instrucción "o". Aquí hay un ejemplo más complicado que demuestra que coinciden tanto el URI de solicitud como la cadena de consulta, y que se recurre 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 a /callbacks/foo?secret_var=42
pero requiere un nombre de usuario y contraseña para /callbacks/foo
.
Recuerde que a menos que use <RequireAll>
, Apache intentará hacer coincidir cada Require
en orden, así que piense primero en qué condiciones desea permitir.
La referencia para la directiva Require
está aquí: https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require
Y la referencia de exprés está aquí: https://httpd.apache.org/docs/2.4/expr.html
<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>