diff --git a/src/Tgstation.Server.Host/Security/TokenFactory.cs b/src/Tgstation.Server.Host/Security/TokenFactory.cs index cbaf09b049..cc5ff8a270 100644 --- a/src/Tgstation.Server.Host/Security/TokenFactory.cs +++ b/src/Tgstation.Server.Host/Security/TokenFactory.cs @@ -26,6 +26,26 @@ namespace Tgstation.Server.Host.Security /// readonly SecurityConfiguration securityConfiguration; + /// + /// The claim. + /// + readonly Claim issuerClaim; + + /// + /// The claim. + /// + readonly Claim audienceClaim; + + /// + /// The for generating tokens. + /// + readonly JwtHeader tokenHeader; + + /// + /// The used to generate s. + /// + readonly JwtSecurityTokenHandler tokenHandler; + /// /// The for the . /// @@ -73,6 +93,14 @@ namespace Tgstation.Server.Host.Security RequireExpirationTime = true, }; + + issuerClaim = new Claim(JwtRegisteredClaimNames.Iss, ValidationParameters.ValidIssuer); + audienceClaim = new Claim(JwtRegisteredClaimNames.Aud, ValidationParameters.ValidAudience); + tokenHeader = new JwtHeader( + new SigningCredentials( + ValidationParameters.IssuerSigningKey, + SecurityAlgorithms.HmacSha256)); + tokenHandler = new JwtSecurityTokenHandler(); } /// @@ -88,8 +116,8 @@ namespace Tgstation.Server.Host.Security // since unix time rounds down, it looks like it came from before the user changed their password // this happens occasionally in unit tests // just delay a second so we can force a round up - var lpuUnix = user.LastPasswordUpdate?.ToUnixTimeSeconds(); - if (nowUnix == lpuUnix) + var userLastPassworUpdateUnix = user.LastPasswordUpdate?.ToUnixTimeSeconds(); + if (nowUnix == userLastPassworUpdateUnix) await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken); var expiry = now.AddMinutes(oAuth @@ -100,16 +128,21 @@ namespace Tgstation.Server.Host.Security new Claim(JwtRegisteredClaimNames.Sub, user.Id.Value.ToString(CultureInfo.InvariantCulture)), new Claim(JwtRegisteredClaimNames.Exp, expiry.ToUnixTimeSeconds().ToString(CultureInfo.InvariantCulture)), new Claim(JwtRegisteredClaimNames.Nbf, nowUnix.ToString(CultureInfo.InvariantCulture)), - new Claim(JwtRegisteredClaimNames.Iss, ValidationParameters.ValidIssuer), - new Claim(JwtRegisteredClaimNames.Aud, ValidationParameters.ValidAudience), + issuerClaim, + audienceClaim, }; - var token = new JwtSecurityToken(new JwtHeader(new SigningCredentials(ValidationParameters.IssuerSigningKey, SecurityAlgorithms.HmacSha256)), new JwtPayload(claims)); - return new TokenResponse + var securityToken = new JwtSecurityToken( + tokenHeader, + new JwtPayload(claims)); + + var tokenResponse = new TokenResponse { - Bearer = new JwtSecurityTokenHandler().WriteToken(token), + Bearer = tokenHandler.WriteToken(securityToken), ExpiresAt = expiry, }; + + return tokenResponse; } } }