private async Task RefreshAuthToken() { if (!string.IsNullOrEmpty(Token) && ExpirationTimestamp > DateTime.UtcNow) { return; } string AUTH_REQUEST = JsonSerializer.Serialize(new TokenAuthRequest(UserName, Password)); HttpContent requestBody = new StringContent(AUTH_REQUEST, Encoding.UTF8, APPLICATION_JSON); HttpResponseMessage response = await Http.PostAsync("auth/", requestBody); string responseBody = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { GetErrorAndThrowException(responseBody, AUTH_TOKEN_ERROR_MESSAGE); } TokenAuthResponse auth = JsonSerializer.Deserialize <TokenAuthResponse>(responseBody); if (auth == null || auth.data == null || auth.data.tokenAuth == null) { GetErrorAndThrowException(responseBody, AUTH_TOKEN_ERROR_MESSAGE); } Token = auth.data.tokenAuth.token; IssuedTimestamp = DateTime.UnixEpoch + TimeSpan.FromSeconds(auth.data.tokenAuth.payload.origIat); ExpirationTimestamp = DateTime.UnixEpoch + TimeSpan.FromSeconds(auth.data.tokenAuth.payload.exp); RefreshExpirationTimestamp = DateTime.UnixEpoch + TimeSpan.FromSeconds(auth.data.tokenAuth.refreshExpiresIn); }
public IActionResult Auth(TokenAuthRequest model) { return(Result(() => { if (model == null) { return ApplicationResult.Fail("bad request"); } UserViewModel user; switch (model.GrantType) { case "password": var credentialResult = _userService.GetUserByCredential(model.UserName, model.Password); if (credentialResult.IsSuccess == false) { return credentialResult; } user = credentialResult.Value; break; case "refresh_token": var refreshTokenResult = _userService.GetUserByRefreshToken(model.RefreshToken); if (refreshTokenResult.IsSuccess == false) { return refreshTokenResult; } user = refreshTokenResult.Value; break; case "signUp": case "string": if (!ModelState.IsValid) { return ApplicationResult.Fail(GetModelErrors()); } //return user Id var signUpResult = _userService.SignUp(new UserViewModel() { UserName = model.UserName.ToLower(), Email = model.Email, PasswordHash = model.Password, Avatar = model.Avatar, Country = model.Country, SexType = model.SexType, PhoneNumber = model.Phone }); if (signUpResult.IsSuccess == false) { return signUpResult; } user = signUpResult.Value; break; default: return ApplicationResult.Fail("The grant_type is not support"); } var refreshToken = _userService.GrantRefreshToken(user.Id); var accessToken = GenerateJwtToken(user); var result = new TokenAuthResponse { RefreshToken = refreshToken, AccessToken = accessToken }; return ApplicationResult.Ok(result); })); }