web-dev-qa-db-ja.com

Apache2:いくつかの式と照合することにより、残りのすべてのAPI Request_URIを基本認証から除外します

セットアップしましたBasic Authは、関連するユーザーのみにアクセスを許可するブラウザー認証用のOpencartプロジェクト用です。さて、I need to use REST API for a mobile app。 APIからエンドポイントを呼び出してOpnecartプロジェクトから詳細を取得する場合、APIからaccess_tokenを生成する必要があり、すべてのリクエストでそのaccess_tokenを使用することで、APIから詳細を取得できます。問題は、私がプロジェクト用に設定した基本認証であり、そのため、1つのメソッドしか使用できないためAPIにアクセスできず、opencartから詳細を取得するGETメソッドであるAPIにアクセスできないため、2つのメソッドを使用できません。つまり、Auth Header and GET methods。そう、 what I am trying to do is to disable Basic Auth if the Request_URI includes api calls.

私がこれまでにプロジェクトのvhostで試したことは次のとおりですが、これはすべてうまくいきませんでした。

次の質問の受け入れられた答えからアイデアを得ましたが、私にとってはうまくいきませんでした。 https://stackoverflow.com/questions/8978080/htaccess-exclude-one-url-from-basic-auth?answertab=votes#tab-top

<Directory /var/www/html/projectexample>
 AllowOverride All        
 # Auth stuff
 AuthName "Authentication Required"
 AuthType Basic
 AuthUserFile /etc/Apache2/.htpasswd
 Order allow,deny
 Deny from all
 Satisfy any
 <RequireAny>
    <RequireAll>
        Require expr %{REQUEST_URI} =~ m#^/api/rest/.*#
    </RequireAll>
    Require valid-user
 </RequireAny>
</Directory>

以下のようなSetEnvIf環境変数も使用しようとしましたが、うまくいきませんでした。

<Directory /var/www/html/projectexample>
  AllowOverride All        
  # Auth stuff
  AuthName "Authentication Required"
  AuthType Basic
  AuthUserFile /etc/Apache2/.htpasswd
  SetEnvIf Request_URI "^/api/*" allow=1
  #SetEnvIf Request_URI "^/(api/*)" allow=1
  Order allow,deny
  Require valid-user
  Allow from env=allow
  Deny from env!=allow
  Satisfy any
</Directory>

解決策はありますか?

1
Haroon

私のプロジェクトでSEO URLを有効にしているため、うまくいったソリューション:

<Directory /var/www/html/projectexample>
    AllowOverride All
</Directory>

<Location "/">
    # Default to Basic Auth protection for any stie
    AuthType Basic
    AuthName "Authentication required"
    AuthUserFile /etc/Apache2/.htpasswd
    Require valid-user

    # If the request goes to a rest page: bypass basic auth
    SetEnvIf Request_URI ^/api/ noauth=1

    # gets REDIRECT_ prepended if the request is a redirect
    Allow from env=REDIRECT_noauth
    Allow from env=noauth
    Order allow,deny
    Satisfy any
    Deny from env!=noauth
</Location>

Allow from env=REDIRECT_noauthはSEO URLのためにここでトリックを行っています。

1
Haroon

/var/www/html/projectexampleがドキュメントルートであり、/var/www/html/projectexample/apiが無制限のアクセスを許可するAPIディレクトリであるとすると、2つの<Directory>コンテナを作成できます。例えば:

<Directory /var/www/html/projectexample>
  AuthName "Authentication Required"
  AuthType Basic
  AuthUserFile /etc/Apache2/.htpasswd
  Require valid-user
</Directory>

<Directory /var/www/html/projectexample/api>
  Require all granted
</Directory>

より具体的な/api<Directory>コンテナは前者をオーバーライドします。

Apache 2.4以降を使用している場合、古いApache 2.2の認証ディレクティブ(Order allow,denyなど)と新しい<RequireAny> etc.ディレクティブを混在させないでください。古いディレクティブは、下位互換性のためにのみ使用できます。 2つのタイプのディレクティブを混在させると、予期しない競合が発生する可能性があります。

1
MrWhite