From a576ba75fa9ecc94f4efdc141960cd15758c9061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88?= Date: Wed, 1 Oct 2025 10:39:18 -0400 Subject: [PATCH] feat: refresh token --- .../Controllers/UserController.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/Nullinside.Api/Controllers/UserController.cs b/src/Nullinside.Api/Controllers/UserController.cs index e6cf1c7..c7fd591 100644 --- a/src/Nullinside.Api/Controllers/UserController.cs +++ b/src/Nullinside.Api/Controllers/UserController.cs @@ -93,6 +93,29 @@ public UserController(IConfiguration configuration, INullinsideContext dbContext return Redirect($"{siteUrl}/user/login?error=1"); } } + + /// + /// Called to generate a new oauth token using the refresh token we previously provided. + /// + /// The refresh token we provided. + /// The cancellation token. + /// A redirect to the nullinside website. + [AllowAnonymous] + [HttpPost] + [Route("token/refresh")] + public async Task Refresh(AuthToken token, CancellationToken cancellationToken = new()) { + var user = await _dbContext.Users.FirstOrDefaultAsync(u => u.RefreshToken == token.Token, cancellationToken).ConfigureAwait(false); + if (null == user?.Email) { + return Unauthorized(); + } + + var bearerToken = await UserHelpers.GenerateTokenAndSaveToDatabase(_dbContext, user.Email, Constants.OAUTH_TOKEN_TIME_LIMIT, cancellationToken: cancellationToken).ConfigureAwait(false); + if (null == bearerToken) { + return StatusCode(500); + } + + return Ok(bearerToken); + } /// /// Converts the credential string we get from google to a representation we read information from.