diff --git a/back/src/Kyoo.Authentication/Controllers/OidcController.cs b/back/src/Kyoo.Authentication/Controllers/OidcController.cs index 0a1a4f72..11f951c9 100644 --- a/back/src/Kyoo.Authentication/Controllers/OidcController.cs +++ b/back/src/Kyoo.Authentication/Controllers/OidcController.cs @@ -110,4 +110,10 @@ public class OidcController( } return user; } + + public async Task LinkAccount(Guid userId, string provider, string code) + { + (_, ExternalToken extToken) = await _TranslateCode(provider, code); + return await users.AddExternalToken(userId, provider, extToken); + } } diff --git a/back/src/Kyoo.Authentication/Views/AuthApi.cs b/back/src/Kyoo.Authentication/Views/AuthApi.cs index 58ae93a7..7da38e8e 100644 --- a/back/src/Kyoo.Authentication/Views/AuthApi.cs +++ b/back/src/Kyoo.Authentication/Views/AuthApi.cs @@ -175,7 +175,10 @@ namespace Kyoo.Authentication.Views if (code == null) return BadRequest(new RequestError("Invalid code.")); - User user = await oidc.LoginViaCode(provider, code); + Guid? userId = User.GetId(); + User user = userId.HasValue + ? await oidc.LinkAccount(userId.Value, provider, code) + : await oidc.LoginViaCode(provider, code); return new JwtToken( tokenController.CreateAccessToken(user, out TimeSpan expireIn), await tokenController.CreateRefreshToken(user), diff --git a/back/src/Kyoo.Core/Controllers/Repositories/UserRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/UserRepository.cs index fd5f9788..785bde85 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/UserRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/UserRepository.cs @@ -23,6 +23,7 @@ using System.Linq; using System.Threading.Tasks; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; +using Kyoo.Abstractions.Models.Exceptions; using Kyoo.Abstractions.Models.Permissions; using Kyoo.Abstractions.Models.Utils; using Kyoo.Postgresql; @@ -109,4 +110,12 @@ public class UserRepository( null ); } + + public async Task AddExternalToken(Guid userId, string provider, ExternalToken token) + { + User user = await GetWithTracking(userId); + user.ExternalId[provider] = token; + await database.SaveChangesAsync(); + return user; + } }