// Kyoo - A portable and vast media library solution. // Copyright (c) Kyoo. // // See AUTHORS.md and LICENSE file in the project root for full license information. // // Kyoo is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // Kyoo is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Kyoo. If not, see . using System; using System.Collections.Generic; using System.Text; using Autofac; using Kyoo.Abstractions; using Kyoo.Abstractions.Controllers; using Kyoo.Authentication.Models; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; namespace Kyoo.Authentication { /// /// A module that enable OpenID authentication for Kyoo. /// public class AuthenticationModule : IPlugin { /// public string Slug => "auth"; /// public string Name => "Authentication"; /// public string Description => "Enable an authentication/permission system for Kyoo (via Jwt or ApiKeys)."; /// public Dictionary Configuration => new() { { AuthenticationOption.Path, typeof(AuthenticationOption) }, { PermissionOption.Path, typeof(PermissionOption) }, }; /// /// The configuration to use. /// private readonly IConfiguration _configuration; /// /// Create a new authentication module instance and use the given configuration. /// /// The configuration to use public AuthenticationModule(IConfiguration configuration) { _configuration = configuration; } /// public void Configure(ContainerBuilder builder) { builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); } /// public void Configure(IServiceCollection services) { Uri publicUrl = _configuration.GetPublicUrl(); AuthenticationOption jwt = ConfigurationBinder.Get( _configuration.GetSection(AuthenticationOption.Path) ); // TODO handle direct-videos with bearers (probably add a cookie and a app.Use to translate that for videos) services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = publicUrl.ToString(), ValidAudience = publicUrl.ToString(), IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwt.Secret)) }; }); } /// public IEnumerable ConfigureSteps => new IStartupAction[] { SA.New(app => app.UseAuthentication(), SA.Authentication), }; } }