Skip to content

Instantly share code, notes, and snippets.

@ntakouris
Created July 22, 2019 14:50
Show Gist options
  • Save ntakouris/9ad3162232f722b94fb0a28710e02777 to your computer and use it in GitHub Desktop.
Save ntakouris/9ad3162232f722b94fb0a28710e02777 to your computer and use it in GitHub Desktop.
public async Task<AuthenticationResult> RefreshTokenAsync(string token, string refreshToken)
{
var validatedToken = GetPrincipalFromToken(token);
if (validatedToken == null)
{
return new AuthenticationResult {Errors = new[] {"Invalid Token"}};
}
var expiryDateUnix =
long.Parse(validatedToken.Claims.Single(x => x.Type == JwtRegisteredClaimNames.Exp).Value);
var expiryDateTimeUtc = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
.AddSeconds(expiryDateUnix);
if (expiryDateTimeUtc > DateTime.UtcNow)
{
return new AuthenticationResult {Errors = new[] {"This token hasn't expired yet"}};
}
var jti = validatedToken.Claims.Single(x => x.Type == JwtRegisteredClaimNames.Jti).Value;
var storedRefreshToken = await _context.RefreshTokens.SingleOrDefaultAsync(x => x.Token == refreshToken);
if (storedRefreshToken == null)
{
return new AuthenticationResult {Errors = new[] {"This refresh token does not exist"}};
}
if (DateTime.UtcNow > storedRefreshToken.ExpiryDate)
{
return new AuthenticationResult {Errors = new[] {"This refresh token has expired"}};
}
if (storedRefreshToken.Invalidated)
{
return new AuthenticationResult {Errors = new[] {"This refresh token has been invalidated"}};
}
if (storedRefreshToken.Used)
{
return new AuthenticationResult {Errors = new[] {"This refresh token has been used"}};
}
if (storedRefreshToken.JwtId != jti)
{
return new AuthenticationResult {Errors = new[] {"This refresh token does not match this JWT"}};
}
storedRefreshToken.Used = true;
_context.RefreshTokens.Update(storedRefreshToken);
await _context.SaveChangesAsync();
var user = await _userManager.FindByIdAsync(validatedToken.Claims.Single(x => x.Type == "id").Value);
return await GenerateAuthenticationResultForUserAsync(user);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment