ASP.NET Core のアプリで Firebase 認証

.NET Core の gRPC とか C# の Firestore クライアントを触る - kitak blog で書いたアプリに Firebase の認証を組み込む。具体的にはクライアントの Firebase SDK で生成した ID トークンの検証をおこない、ユーザーの id を取得する。.NET Core のバージョンは 3.1.0

ASP.NET Core には認証や認可の機能が含まれているので、Startup.cs でそれぞれのサービスとミドルウェアを登録してあげればよい。事前に利用する認証スキームのパッケージをインストールしておく。Firebase Authentication の場合は Microsoft.AspNetCore.Authentication.JwtBearer

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

サービスの登録

[Project ID] は Firebase のプロジェクトIDで置き換える。

public void ConfigureServices(IServiceCollection services)
{

    // ...

    services.AddAuthorization(options =>
    {
        options.AddPolicy(JwtBearerDefaults.AuthenticationScheme, policy =>
        {
            policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
            policy.RequireClaim(ClaimTypes.Name);
        });
    });
    services
        .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Authority = "https://securetoken.google.com/[Project ID]";
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidIssuer = "https://securetoken.google.com/[Project ID]",
                ValidateAudience = true,
                ValidAudience = "[Project ID]",
                ValidateLifetime = true
            };
        });

   // ...
}

ミドルウェアの登録

呼び出す順番が重要なので注意

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...

    app.UseAuthentication();
    app.UseAuthorization();

    // ...
}

アクセスの制御

実際にアクセスを制御するには、制御したい gRPC のサービスのクラスかメソッドに Authorize 属性を指定する。ユーザーの情報は ServerCallContext から取得できる。

[Authorize]
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
    var user = context.GetHttpContext().User;
    var uid = user.Claims.Where(claim => claim.Type == "user_id").FirstOrDefault().Value;
    
    // ...
}