diff --git a/src/Nullinside.Api.TwitchBot/Constants.cs b/src/Nullinside.Api.TwitchBot/Constants.cs index 1fc7d36..98bb716 100644 --- a/src/Nullinside.Api.TwitchBot/Constants.cs +++ b/src/Nullinside.Api.TwitchBot/Constants.cs @@ -18,6 +18,11 @@ public static class Constants { /// The twitch id for the bot account. /// public const string BOT_ID = "640082552"; + + /// + /// The amount of time a token is valid for. + /// + public static readonly TimeSpan OAUTH_TOKEN_TIME_LIMIT = TimeSpan.FromHours(1); // TODO: This should be dynamic but I need to find a source of "good bots" lists. Might have to cheap out and just do a database table with data entry. Let users of the bot submit suggestions that we approve manually. /// diff --git a/src/Nullinside.Api.TwitchBot/Controllers/LoginController.cs b/src/Nullinside.Api.TwitchBot/Controllers/LoginController.cs index 79150e5..7b20184 100644 --- a/src/Nullinside.Api.TwitchBot/Controllers/LoginController.cs +++ b/src/Nullinside.Api.TwitchBot/Controllers/LoginController.cs @@ -1,8 +1,12 @@ +using System.Text; + using log4net; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; + using Nullinside.Api.Common.Twitch; using Nullinside.Api.Common.Twitch.Support; using Nullinside.Api.Model; @@ -75,12 +79,13 @@ public async Task TwitchLogin([FromQuery] string code, [FromServi return Redirect($"{siteUrl}/twitch/bot/config?error={TwitchBotLoginErrors.INTERNAL_ERROR}"); } - string? bearerToken = await UserHelpers.GenerateTokenAndSaveToDatabase(_dbContext, email, token, api.OAuth?.AccessToken, - api.OAuth?.RefreshToken, api.OAuth?.ExpiresUtc, user.Login, user.Id).ConfigureAwait(false); - if (string.IsNullOrWhiteSpace(bearerToken)) { + var bearerToken = await UserHelpers.GenerateTokenAndSaveToDatabase(_dbContext, email, Constants.OAUTH_TOKEN_TIME_LIMIT, api.OAuth?.AccessToken, + api.OAuth?.RefreshToken, api.OAuth?.ExpiresUtc, user.Login, user.Id, token).ConfigureAwait(false); + if (null == bearerToken) { return Redirect($"{siteUrl}/twitch/bot/config?error={TwitchBotLoginErrors.INTERNAL_ERROR}"); } - return Redirect($"{siteUrl}/twitch/bot/config?token={bearerToken}"); + var json = JsonConvert.SerializeObject(bearerToken); + return Redirect($"{siteUrl}/twitch/bot/config?token={Convert.ToBase64String(Encoding.UTF8.GetBytes(json))}"); } } \ No newline at end of file diff --git a/src/Nullinside.Api.TwitchBot/Model/NullinsideContextExtensions.cs b/src/Nullinside.Api.TwitchBot/Model/NullinsideContextExtensions.cs index ed58919..d95a4c1 100644 --- a/src/Nullinside.Api.TwitchBot/Model/NullinsideContextExtensions.cs +++ b/src/Nullinside.Api.TwitchBot/Model/NullinsideContextExtensions.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore.Storage; using Nullinside.Api.Common; +using Nullinside.Api.Common.Auth; using Nullinside.Api.Common.Twitch; using Nullinside.Api.Model; using Nullinside.Api.Model.Ddl; @@ -34,7 +35,7 @@ public static class NullinsideContextExtensions { /// The twitch api object currently in use. /// The twitch api. public static void Configure(this ITwitchApiProxy api, User user) { - api.OAuth = new TwitchAccessToken { + api.OAuth = new OAuthToken { AccessToken = user.TwitchToken, RefreshToken = user.TwitchRefreshToken, ExpiresUtc = user.TwitchTokenExpiration @@ -89,7 +90,7 @@ public static void Configure(this ITwitchApiProxy api, User user) { } // Refresh the token with the Twitch API. - TwitchAccessToken? newToken = await api.RefreshAccessToken(stoppingToken).ConfigureAwait(false); + OAuthToken? newToken = await api.RefreshAccessToken(stoppingToken).ConfigureAwait(false); if (null == newToken) { return null; } @@ -122,7 +123,7 @@ public static void Configure(this ITwitchApiProxy api, User user) { /// The stopping token. /// The number of state entries written to the database. private static async Task UpdateOAuthInDatabase(this INullinsideContext db, int userId, - TwitchAccessToken oAuth, CancellationToken stoppingToken = new()) { + OAuthToken oAuth, CancellationToken stoppingToken = new()) { User? row = await db.Users.FirstOrDefaultAsync(u => u.Id == userId && !u.IsBanned, stoppingToken).ConfigureAwait(false); if (null == row) { return -1; diff --git a/src/nullinside-api b/src/nullinside-api index 76a3c69..a078ee9 160000 --- a/src/nullinside-api +++ b/src/nullinside-api @@ -1 +1 @@ -Subproject commit 76a3c6984cea20bf75ea6814f342ab2403cff20a +Subproject commit a078ee91467f84f13d9ae9341e2aee698fd78dfe