# ベーシック認証（廃止）

Source: https://docs.sisk-framework.org/ja/docs/extensions/basic-auth.html

> [!CAUTION]
> **廃止されました。使用しないでください。** Sisk.BasicAuth パッケージはメンテナンスされておらず、NuGet でも非推奨となっており、代替パッケージはありません。`BasicAuthenticateRequestHandler` は標準的な HTTP クライアントが送信する Base64 認証情報をデコードしないため、認証されたリクエストは拒否されます。代わりに、[リクエストハンドラ](https://docs.sisk-framework.org/ja/docs/fundamentals/request-handlers.md) を自作し、[HttpHeaderCollection.Authorization](https://docs.sisk-framework.org/api/Sisk.Core.Entity.HttpHeaderCollection.Authorization.md) を読み取ってベーシック認証を実装してください。このページは歴史的参照用に残しています。

Basic Auth パッケージは、非常に少ない設定と手間で Sisk アプリケーションにベーシック認証スキームを処理できるリクエストハンドラを追加します。ベーシック HTTP 認証は、ユーザー ID とパスワードによる最小限の入力形式でリクエストを認証し、セッションはクライアント側で完全に管理され、認証トークンやアクセストークンは使用しません。

![ベーシック認証](https://docs.sisk-framework.org/assets/img/basic-auth.svg)

ベーシック認証スキームの詳細は、[MDN 仕様](https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Authentication) を参照してください。

## インストール

まず、プロジェクトに Sisk.BasicAuth パッケージをインストールします。

    > dotnet add package Sisk.BasicAuth

インストール方法の詳細は、[NuGet リポジトリ](https://www.nuget.org/packages/Sisk.BasicAuth/0.15.0) をご覧ください。

## 認証ハンドラの作成

認証スキームはモジュール全体または個々のルート単位で制御できます。まず、最初のベーシック認証ハンドラを書いてみましょう。

以下の例では、データベースへの接続を行い、ユーザーの存在とパスワードの有効性を確認した後、ユーザーをコンテキストバッグに格納します。

```cs
public class UserAuthHandler : BasicAuthenticateRequestHandler
{
    public UserAuthHandler() : base()
    {
        Realm = "To enter this page, please, inform your credentials.";
    }

    public override HttpResponse? OnValidating(BasicAuthenticationCredentials credentials, HttpContext context)
    {
        DbContext db = new DbContext();

        // この場合、メールアドレスをユーザーIDフィールドとして使用しているので、
        // メールアドレスでユーザーを検索します。
        User? user = db.Users.FirstOrDefault(u => u.Email == credentials.UserId);
        if (user == null)
        {
            return base.CreateUnauthorizedResponse("Sorry! No user was found by this email.");
        }

        // 資格情報のパスワードがこのユーザーに対して有効か検証します。
        if (!user.ValidatePassword(credentials.Password))
        {
            return base.CreateUnauthorizedResponse("Invalid credentials.");
        }

        // ログインしたユーザーを HttpContext に追加します
        // そして実行を続行します
        context.Bag.Add("loggedUser", user);
        return null;
    }
}
```

このリクエストハンドラをルートまたはクラスに関連付けるだけです。

```cs
public class UsersController
{
    [RouteGet("/")]
    [RequestHandler(typeof(UserAuthHandler))]
    public string Index(HttpRequest request)
    {
        User loggedUser = request.Bag.Get<User>();
        return $"Hello, {loggedUser.Name}!";
    }
}
```

または、[RouterModule](https://docs.sisk-framework.org/api/Sisk.Core.Routing.RouterModule.md) クラスを使用します。

```cs
public class UsersController : RouterModule
{
    public ClientModule()
    {
        // このクラス内のすべてのルートは
        // UserAuthHandler によって処理されます。
        base.HasRequestHandler(new UserAuthHandler());
    }
    
    [RouteGet("/")]
    public string Index(HttpRequest request)
    {
        User loggedUser = request.Bag.Get<User>();
        return $"Hello, {loggedUser.Name}!";
    }
}
```

## 備考

ベーシック認証の主な責務はクライアント側で実行されます。ストレージ、キャッシュ制御、暗号化はすべてクライアント側でローカルに処理され、サーバーは認証情報を受け取り、アクセスが許可されるかどうかを検証するだけです。

この方式は、クライアントに大きな責任が課せられるため、最も安全な方法とは言えません。クレデンシャルの追跡や保護が困難になる可能性があります。また、パスワードは固有の暗号化が施されていないため、SSL などの安全な接続環境で送信することが必須です。リクエストヘッダーが一瞬でも傍受されれば、ユーザーの認証情報が漏洩する恐れがあります。

本番環境のアプリケーションでは、より堅牢な認証ソリューションを採用し、汎用コンポーネントの過度な使用は避けてください。プロジェクトの要件に合わないコンポーネントは、セキュリティリスクを招く可能性があります。
