- fix: auth renew and null fix
This commit is contained in:
@@ -38,6 +38,7 @@ public class AuthService(
|
||||
var err = await e.Content.AsJson<AuthDenyError>();
|
||||
|
||||
if (err is null) throw;
|
||||
e.Dispose();
|
||||
throw new AuthException(err);
|
||||
}
|
||||
}
|
||||
@@ -60,14 +61,36 @@ public class AuthService(
|
||||
public async Task<AuthTokenCredentials> Refresh(AuthTokenCredentials tokenCredentials)
|
||||
{
|
||||
var authUrl = new Uri($"{tokenCredentials.AuthServer}api/auth/refresh");
|
||||
var newToken = await restService.PostAsync<LoginToken, TokenRequest>(
|
||||
TokenRequest.From(tokenCredentials), authUrl, cancellationService.Token);
|
||||
|
||||
return tokenCredentials with { Token = newToken };
|
||||
try
|
||||
{
|
||||
var newToken = await restService.PostAsync<LoginToken, TokenRequest>(
|
||||
TokenRequest.From(tokenCredentials), authUrl, cancellationService.Token);
|
||||
|
||||
return tokenCredentials with { Token = newToken };
|
||||
}
|
||||
catch (RestRequestException e)
|
||||
{
|
||||
if (e.StatusCode == HttpStatusCode.Unauthorized)
|
||||
throw new AuthTokenExpiredException(tokenCredentials);
|
||||
|
||||
e.Dispose();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class AuthTokenExpiredException : Exception
|
||||
{
|
||||
public AuthTokenExpiredException(AuthTokenCredentials credentials): base("Taken token is expired. Login: " + credentials.Login)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public sealed record AuthTokenCredentials(Guid UserId, LoginToken Token, string Login, string AuthServer);
|
||||
public sealed record ProfileAuthCredentials(
|
||||
string Login,
|
||||
string Password,
|
||||
string AuthServer);
|
||||
|
||||
public sealed record AuthDenyError(string[] Errors, AuthenticateDenyCode Code);
|
||||
|
||||
@@ -108,5 +131,4 @@ public sealed record TokenRequest(string Token)
|
||||
}
|
||||
|
||||
public static TokenRequest Empty { get; } = new TokenRequest("");
|
||||
|
||||
}
|
||||
@@ -29,7 +29,12 @@ public class RestService
|
||||
[Pure]
|
||||
public async Task<T> GetAsync<T>(Uri uri, CancellationToken cancellationToken) where T : notnull
|
||||
{
|
||||
var response = await _client.GetAsync(uri, cancellationToken);
|
||||
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri)
|
||||
{
|
||||
Version = HttpVersion.Version10,
|
||||
};
|
||||
|
||||
var response = await _client.SendAsync(httpRequestMessage, cancellationToken).ConfigureAwait(false);
|
||||
return await ReadResult<T>(response, cancellationToken, uri);
|
||||
}
|
||||
|
||||
@@ -85,10 +90,15 @@ public class RestService
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
return await response.Content.AsJson<T>();
|
||||
var data = await response.Content.AsJson<T>();
|
||||
response.Dispose();
|
||||
return data;
|
||||
}
|
||||
|
||||
var ex = new RestRequestException(response.Content, response.StatusCode,
|
||||
$"Error while processing {uri.ToString()}: {response.ReasonPhrase}");
|
||||
|
||||
throw new RestRequestException(response.Content, response.StatusCode, $"Error while processing {uri.ToString()}: {response.ReasonPhrase}");
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,8 +106,13 @@ public sealed class NullResponse
|
||||
{
|
||||
}
|
||||
|
||||
public sealed class RestRequestException(HttpContent content, HttpStatusCode statusCode, string message) : Exception(message)
|
||||
public sealed class RestRequestException(HttpContent content, HttpStatusCode statusCode, string message) : Exception(message), IDisposable
|
||||
{
|
||||
public HttpStatusCode StatusCode { get; } = statusCode;
|
||||
public HttpContent Content { get; } = content;
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Content.Dispose();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user