Created
July 22, 2019 14:50
-
-
Save ntakouris/9ad3162232f722b94fb0a28710e02777 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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