web-dev-qa-db-fra.com

htaccess exclut une url de Basic Auth

Je dois exclure une URL (ou même un préfixe mieux) de la protection htaccess Basic Auth normale. Quelque chose comme /callbacks/myBank ou /callbacks/.* Avez-vous des conseils pour le faire?

Ce que je ne cherche pas, c'est comment exclure un fichier. Ce doit être une URL (car il s’agit d’une solution basée sur le framework PHP), et toutes les URL sont redirigées avec mod_rewrite à index.php). Donc, il n'y a pas de fichier sous cette URL. Rien.

Certaines de ces URL ne sont que des rappels provenant d'autres services (aucune adresse IP n'est connue, je ne peux donc pas exclure en fonction de l'adresse IP) et ils ne peuvent pas demander d'utilisateur/mot de passe.

La définition actuelle est aussi simple que:

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

Si vous utilisez Apache 2.4, les solutions de contournement SetEnvIf et mod_rewrite ne sont plus nécessaires, car la directive Require permet d'interpréter directement les expressions:

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

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

Apache 2.4 traite les directives Require qui sont pas regroupées par <RequireAll> comme s'ils étaient dans un <RequireAny>, qui se comporte comme une déclaration "ou". Voici un exemple plus compliqué qui illustre la mise en correspondance de l'URI de la demande et de la chaîne de requête, ainsi que le recours à un utilisateur valide:

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>

Cet exemple permettrait d’accéder à /callbacks/foo?secret_var=42 mais nécessite un nom d’utilisateur et un mot de passe pour /callbacks/foo.

Rappelez-vous que si vous utilisez <RequireAll>, Apache essaiera de faire correspondre chaque Require dans l’ordre . Réfléchissez donc aux conditions que vous souhaitez autoriser en premier.

La référence de la directive Require est la suivante: https://httpd.Apache.org/docs/2.4/mod/mod_authz_core.html#require

Et la référence expression est ici: https://httpd.Apache.org/docs/2.4/expr.html

46
beporter

En utilisant SetEnvIf , vous pouvez créer une variable lorsque la demande commence par un chemin, puis utilisez la méthode Satisfy Any directive pour éviter d'avoir à se connecter.

# 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

Le bloc de directives autoriser/refuser indique que refuser l'accès pour [~ # ~] à tout le monde [~ # ~] , sauf en cas de valid-user (connexion authentifiée BASIC réussie) ou si la variable noauth est définie.

81
Jon Lin

Cette solution fonctionne plutôt bien, il vous suffit de définir la liste blanche que vous souhaitez consulter.

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
6
Nick Z

J'ai essayé les autres solutions mais c'est ce qui a fonctionné pour moi. Espérons que cela aidera les autres.

# 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

Cela permettra à l’API d’URL et à toute chaîne d’URL après /index.php/api/ pour ouvrir sans avoir à se connecter et tout le reste sera invité à se connecter.

Exemple:

mywebsite.com/index.php/api s'ouvrira sans être invité à se connecter mywebsite.com/index.php/api/soap/?wsdl=1 s'ouvrira sans être invité à se connecter mywebsite.com sera invité à se connecter d'abord

1
MagentoMan
<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>
1
bluszcz

Une autre approche fonctionne comme ceci, si la zone que vous protégez a un script monolithique PHP contrôlant tout, comme Wordpress. Configurez l’authentification avec dans un répertoire différent. Placez-y un index.php qui définit cookie sur le chemin '/'. Ensuite, dans Wordpress (par exemple), vérifiez le cookie, mais ignorez si $ _SERVER ['REQUEST_URI'] est l'URL exclue.

Sur ma plate-forme d'hébergement partagé, RewriteRule n'a pas pu définir de variable d'environnement compatible avec "Satisfaire à tout".

Quelle que soit l'approche choisie, veillez à ce que la page que vous protégez n'inclue pas d'images, de feuilles de style, etc., qui déclenchent une demande d'authentification alors que la page elle-même n'en contient pas.

0
kitchin

pourquoi n'utilisez-vous pas simplement l'authentification de base telle qu'elle était prévue?

user:[email protected]/callbacks/etc
0
ryaan_anthony

Ajoutez le code ci-dessous à votre fichier htaccess racine et n'oubliez pas de changer votre page d'administrateur, page de fichier .htpasswd.

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

Créez un fichier .htpasswd dans votre dossier racine et ajoutez ci-dessous le nom d'utilisateur et le mot de passe (définissez le nom d'utilisateur par défaut: admin et le mot de passe: admin123)

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

S'il vous plaît laissez-moi savoir si vous êtes toujours confronté à un problème.

0
Nits