No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

181 líneas
6.0KB

  1. using System.IdentityModel.Tokens.Jwt;
  2. using System.Net.Http.Headers;
  3. using System.Net.Http.Json;
  4. using System.Security.Claims;
  5. namespace MaUI
  6. {
  7. public static class UserConntected
  8. {
  9. public static bool IsConnected { get; private set; } = false;
  10. public static string Token { get; private set; } = "";
  11. public static string ID { get; private set; } = "";
  12. public static string FirstName { get; private set; } = "";
  13. public static string LastName { get; private set; } = "";
  14. public static string Email { get; private set; } = "";
  15. public static List<string>? Roles { get; private set; } = new();
  16. public static void SetToken(string jwt)
  17. {
  18. Token = jwt;
  19. var handler = new JwtSecurityTokenHandler();
  20. var decodedToken = handler.ReadJwtToken(jwt);
  21. var identity = new ClaimsIdentity(decodedToken.Claims, "jwt");
  22. //FirstName = decodedToken.Claims.FirstOrDefault(c => c.Type == "FirstName")!.Value;
  23. //LastName = decodedToken.Claims.FirstOrDefault(c => c.Type == "LastName")!.Value;
  24. //Email = decodedToken.Claims.FirstOrDefault(c => c.Type == "Email")!.Value;
  25. ID = decodedToken.Claims.FirstOrDefault(c => c.Type == "ID")!.Value;
  26. IsConnected = true;
  27. var user = new ClaimsPrincipal(identity);
  28. Roles = user.FindAll(ClaimTypes.Role).Select(r => r.Value).ToList();
  29. SecureStorage.SetAsync("authToken", jwt); // Stocke le token
  30. }
  31. }
  32. public class AuthorizedHttpClientHandler : DelegatingHandler
  33. {
  34. public AuthorizedHttpClientHandler()
  35. {
  36. InnerHandler = new HttpClientHandler();
  37. }
  38. protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  39. {
  40. var token = await SecureStorage.GetAsync("authToken");
  41. if (!string.IsNullOrEmpty(token))
  42. {
  43. request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
  44. }
  45. return await base.SendAsync(request, cancellationToken);
  46. }
  47. }
  48. public class ApiService
  49. {
  50. private readonly HttpClient _httpClient;
  51. private readonly HttpClient _httpClientLogin;
  52. #region Constructeur
  53. public ApiService()
  54. {
  55. _httpClientLogin = new HttpClient { BaseAddress = new Uri("https://localhost:7008") };
  56. _httpClient = new HttpClient(new AuthorizedHttpClientHandler());
  57. _httpClient.BaseAddress = new Uri("https://localhost:7008");
  58. }
  59. #endregion
  60. #region Service Create
  61. public async Task<bool> Create_Async<T>(string url, T data)
  62. {
  63. var response = await _httpClient.PostAsJsonAsync(url, data);
  64. if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
  65. {
  66. return false;
  67. }
  68. else if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
  69. {
  70. throw new Exception("Internal server error");
  71. }
  72. return response.IsSuccessStatusCode;
  73. }
  74. #endregion
  75. #region Service Update
  76. public async Task<bool> Update_Async<T>(string url, T data)
  77. {
  78. var response = await _httpClient.PutAsJsonAsync(url, data);
  79. if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
  80. {
  81. return false;
  82. }
  83. else if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
  84. {
  85. throw new Exception("Internal server error");
  86. }
  87. return response.IsSuccessStatusCode;
  88. }
  89. #endregion
  90. #region Service Delete
  91. public async Task<bool> Delete_Async<T>(string url)
  92. {
  93. var response = await _httpClient.DeleteAsync(url);
  94. if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
  95. {
  96. return false;
  97. }
  98. else if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
  99. {
  100. throw new Exception("Internal server error");
  101. }
  102. return response.IsSuccessStatusCode;
  103. }
  104. #endregion
  105. #region Service GetAll
  106. public async Task<T[]> GetAll_Async<T>(string url)
  107. {
  108. // Charger les items
  109. var response = await _httpClient.GetFromJsonAsync<T[]>(url);
  110. return response ?? Array.Empty<T>();
  111. }
  112. #endregion
  113. #region Service EnvoiRequete
  114. public async Task<string> EnvoiRequete<T>(string url, T data)
  115. {
  116. var response = await _httpClient.PostAsJsonAsync(url, data);
  117. if (!response.IsSuccessStatusCode)
  118. return $"Erreur : {response.StatusCode}";
  119. // lire le contenu JSON renvoyé
  120. var result = await response.Content.ReadAsStringAsync();
  121. return result;
  122. }
  123. #endregion
  124. #region Service GetById
  125. /* A IMPLEMENTER SI BESOIN
  126. public async Task<T> GetById_Async<T>(string url)
  127. {
  128. }
  129. */
  130. #endregion
  131. #region AuthLogin
  132. public async Task<bool> Connexion(LoginModel item)
  133. {
  134. try
  135. {
  136. string url= $"api/auth/login";
  137. var response = await _httpClientLogin.PostAsJsonAsync(url, item);
  138. response.EnsureSuccessStatusCode();
  139. var loginResponse = await response.Content.ReadFromJsonAsync<LoginResponse>();
  140. if (loginResponse is not null && !string.IsNullOrWhiteSpace(loginResponse.Token))
  141. {
  142. UserConntected.SetToken(loginResponse.Token);
  143. }
  144. else
  145. {
  146. return false;
  147. }
  148. return true;
  149. }
  150. catch
  151. {
  152. return false;
  153. }
  154. }
  155. #endregion
  156. }
  157. }