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; // ... }