{"title":"How to authenticate using REMOTE_USER","version":"4.1","locale":"ja","docname":"howto/auth-remote-user","url":"/ja/4.1/howto/auth-remote-user/","canonical":"https://djangodocs.dev/ja/4.1/howto/auth-remote-user/","summary":"This document describes how to make use of external authentication sources (where the web server sets the REMOTE_USER environment variable) in your Django…","html":"<h1>How to authenticate using <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code><a class=\"heading-anchor\" href=\"#how-to-authenticate-using-remote-user\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>This document describes how to make use of external authentication sources\n(where the web server sets the <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> environment variable) in your\nDjango applications.  This type of authentication solution is typically seen on\nintranet sites, with single sign-on solutions such as IIS and Integrated\nWindows Authentication or Apache and <a class=\"reference external\" href=\"https://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html\">mod_authnz_ldap</a>, <a class=\"reference external\" href=\"https://www.apereo.org/projects/cas\">CAS</a>, <a class=\"reference external\" href=\"http://weblogin.org\">Cosign</a>,\n<a class=\"reference external\" href=\"https://uit.stanford.edu/service/authentication\">WebAuth</a>, <a class=\"reference external\" href=\"https://sourceforge.net/projects/mod-auth-sspi\">mod_auth_sspi</a>, etc.</p>\n<p>When the web server takes care of authentication it typically sets the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> environment variable for use in the underlying application.  In\nDjango, <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> is made available in the <a class=\"reference internal\" href=\"/ja/4.1/ref/request-response/#django.http.HttpRequest.META\" title=\"django.http.HttpRequest.META\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.META</span></code></a> attribute.  Django can be configured to make\nuse of the <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> value using the <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code>\nor <code class=\"docutils literal notranslate\"><span class=\"pre\">PersistentRemoteUserMiddleware</span></code>, and\n<a class=\"reference internal\" href=\"/ja/4.1/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a> classes found in\n<a class=\"reference internal\" href=\"/ja/4.1/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code></a>.</p>\n<section id=\"configuration\">\n<h2>設定<a class=\"heading-anchor\" href=\"#configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>最初に次のように <a class=\"reference internal\" href=\"/ja/4.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 設定に <a class=\"reference internal\" href=\"/ja/4.1/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.middleware.RemoteUserMiddleware</span></code></a> を加える必要があります。これは <a class=\"reference internal\" href=\"/ja/4.1/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.middleware.AuthenticationMiddleware</span></code></a> の <strong>後に</strong> 追加してください:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s1\">&#39;...&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth.middleware.RemoteUserMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;...&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>続いて、<a class=\"reference internal\" href=\"/ja/4.1/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code></a> 設定の <a class=\"reference internal\" href=\"/ja/4.1/ref/contrib/auth/#django.contrib.auth.backends.ModelBackend\" title=\"django.contrib.auth.backends.ModelBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code></a> を <a class=\"reference internal\" href=\"/ja/4.1/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a> に変更します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">AUTHENTICATION_BACKENDS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s1\">&#39;django.contrib.auth.backends.RemoteUserBackend&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>この設定を行うと <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META['REMOTE_USER']</span></code> 内の username を検索し、 <a class=\"reference internal\" href=\"/ja/4.1/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a> を使用したユーザーの認証と自動ログインを行います。</p>\n<p>この特定の設定は、デフォルトの <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code> による認証を無効にすることに注意してください。つまり、 <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> の値が設定されていなければ、Django の admin interface を使ったとしても、ユーザーはログインすることができないということです。 <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> が存在しない場合のフォールバックとして <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code> のリストに <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.auth.backends.ModelBackend'</span></code>  を追加しておけば、この問題は解決できます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.admin</span></code> 画面や <a class=\"reference internal\" href=\"/ja/4.1/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a> 管理コマンドなどの、Django のユーザ管理機能はリモートユーザを統合管理しません。これらのインタフェースは <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code> の設定にかかわらず、データベース中のユーザだけを管理します。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>RemoteUserBackend``を``ModelBackend``から継承した後も、<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>ModelBackend``によってチェックが行われ、すべてのパーミッションが維持されます。</p>\n<p><a class=\"reference internal\" href=\"/ja/4.1/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">is_active=False</span></code></a> 属性を持つユーザは認証が許可されません。許可したい場合は、:class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.backends.AllowAllUsersRemoteUserBackend`を使用してください。</p>\n</aside>\n<p>認証メカニズムが <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> 以外のカスタム HTTP ヘッダを使っている場合には、以下の例のように <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> をサブクラス化して、クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">header</span></code> 属性を適切な <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code> のキー名に設定してください:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.middleware</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">RemoteUserMiddleware</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomHeaderMiddleware</span><span class=\"p\">(</span><span class=\"n\">RemoteUserMiddleware</span><span class=\"p\">):</span>\n    <span class=\"n\">header</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;HTTP_AUTHUSER&#39;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> のサブクラスをカスタム HTTP ヘッダーとともに使う場合は、慎重になってください. フロントエンドの Web サーバは、必ず、いつもでも適切な認証のチェックに基づいたヘッダーを設置または削除してください。決して偽の（もしくは『スプーフィングされた』）ヘッダー値を送ってくるエンドユーザーを許可してはいけません。例えば、 HTTP ヘッダの <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth-User</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth_User</span></code> は両方とも <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code> のキー <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_X_AUTH_USER</span></code> に正規化されてしまうので、 ダッシュの代わりにアンダースコアを使ったスプーフィングされたヘッダーを許容していないかもまた必ずチェックしてください。</p>\n<p>この警告は、<code class=\"docutils literal notranslate\"><span class=\"pre\">header</span> <span class=\"pre\">=</span> <span class=\"pre\">'REMOTE_USER'</span></code> になっているデフォルト設定の <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> には適用されません。それは、 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code> 内の <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_</span></code> で始まらないキーは、HTTP リクエストヘッダーに直接設置されるのではなく、 WSGI サーバによって設置されるからです。</p>\n</aside>\n<p>認証メカニズムをより細かく制御したければ、 <a class=\"reference internal\" href=\"/ja/4.1/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a> を継承する独自の認証バックエンドを作成し、属性やメソッドをいくつかオーバライドしてください。</p>\n</section>\n<section id=\"using-remote-user-on-login-pages-only\">\n<span id=\"persistent-remote-user-middleware-howto\"></span><h2>ログインページでのみ <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> を使用する<a class=\"heading-anchor\" href=\"#using-remote-user-on-login-pages-only\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> 認証ミドルウェアは、 HTTP リクエストヘッダーの <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> が認証されたリクエストに存在していることを仮定しています。これが <code class=\"docutils literal notranslate\"><span class=\"pre\">htpasswd</span></code>、または同様のメカニズムを備えた Basic 認証なら、妥当で実用的かもしれませんが、ネゴシエート(GSSAPI/ケルベロス)や他の資源を利用した認証メソッドでは、フロントエンド HTTP サーバの認証では、通常、ひとつもしくはいくつかのログイン URL のみ設置します。そして、認証が成功した後、アプリケーションは認証されたセッションそれ自体を維持しようとします。</p>\n<p><a class=\"reference internal\" href=\"/ja/4.1/ref/middleware/#django.contrib.auth.middleware.PersistentRemoteUserMiddleware\" title=\"django.contrib.auth.middleware.PersistentRemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PersistentRemoteUserMiddleware</span></code></a> は、この使用事例の補助を提供する。これは、はっきりとユーザーにログアウトされるまで、認証されたセッションを維持しようとする。このクラスは、このドキュメントの上にある <a class=\"reference internal\" href=\"/ja/4.1/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code></a> の当座の代替として使うことができる。</p>\n</section>","rootId":"how-to-authenticate-using-remote-user","toc":[{"title":"設定","anchor":"configuration","children":[]},{"title":"ログインページでのみ REMOTE_USER を使用する","anchor":"using-remote-user-on-login-pages-only","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"「How-to」ガイド","url":"/ja/4.1/howto/"}],"prev":{"docname":"howto/index","title":"「How-to」ガイド","url":"/ja/4.1/howto/"},"next":{"docname":"howto/csrf","title":"How to use Django's CSRF protection","url":"/ja/4.1/howto/csrf/"},"formats":{"html":"/ja/4.1/howto/auth-remote-user/","markdown":"/ja/4.1/howto/auth-remote-user.md","json":"/ja/4.1/howto/auth-remote-user.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/howto/auth-remote-user.txt","official":"https://docs.djangoproject.com/ja/4.1/howto/auth-remote-user/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}