Blazor & WASM in combination to get statistics from Spotify API for performing the song analysis. With separate microservices for auth, Spotify, user data tracking, and application, connected through gRPC with Polly.
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

AuthService.cs 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //using IdentityProvider.Protos.AuthService;
  2. using Grpc.Net.Client;
  3. using GrpcShared;
  4. using GrpcShared.DTO;
  5. using GrpcShared.DTO.Auth;
  6. using GrpcShared.DTO.User;
  7. using GrpcShared.Interfaces;
  8. using Microsoft.Extensions.Options;
  9. using Microsoft.Net.Http.Headers;
  10. using Newtonsoft.Json;
  11. using System.Net.Http.Headers;
  12. using System.Text;
  13. using System.Text.Json;
  14. namespace IdentityProvider.Services
  15. {
  16. public class AuthService : IAuthService
  17. {
  18. private readonly ILogger<AuthService> _logger;
  19. private readonly CodeRequest _params;
  20. private readonly IHttpClientFactory _httpClientFactory;
  21. public AuthService(ILogger<AuthService> logger, IOptions<CodeRequest> options, IHttpClientFactory httpClientFactory)
  22. {
  23. _logger = logger;
  24. _params = options.Value;
  25. _httpClientFactory = httpClientFactory;
  26. }
  27. public async Task<TokenResponse> GetAccessToken(TokenRequest tokenRequest)
  28. {
  29. var http = _httpClientFactory.CreateClient();
  30. string url = "https://accounts.spotify.com/api/token";
  31. http.BaseAddress = new Uri(url);
  32. //get client id and secret, and redirect uri from appsettings, convert to base64 and set as header
  33. var secrets = await GetAuthParams();
  34. byte[] contentType = Encoding.UTF8.GetBytes($"{secrets.ClientId}:{secrets.ClientSecret}");
  35. tokenRequest.redirect_uri = secrets.RedirectURI;
  36. //AUTHORIZATION HEADER
  37. http.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Basic " + Convert.ToBase64String(contentType));
  38. ////ACCEPT HEADER
  39. //http.DefaultRequestHeaders.Accept.Add(
  40. // new MediaTypeWithQualityHeaderValue("application/json"));
  41. //BODY PARAMS
  42. var requestBody = new Dictionary<string, string>();
  43. requestBody["grant_type"] = tokenRequest.grant_type;
  44. requestBody["code"] = tokenRequest.code!;
  45. requestBody["redirect_uri"] = tokenRequest.redirect_uri!;
  46. //REQUEST
  47. var response = await http.PostAsync(url, new FormUrlEncodedContent(requestBody));
  48. var contents = JsonConvert.DeserializeObject<TokenResponse>(await response.Content.ReadAsStringAsync());
  49. if (contents != null)
  50. return new TokenResponse
  51. {
  52. access_token = contents!.access_token,
  53. refresh_token = contents!.refresh_token,
  54. expires_in = contents!.expires_in
  55. };
  56. else return null;
  57. }
  58. public async Task<CodeRequest> GetAuthParams()
  59. {
  60. var authParams = new CodeRequest
  61. {
  62. ClientId = _params.ClientId,
  63. RedirectURI = _params.RedirectURI,
  64. Scope = _params.Scope,
  65. ClientSecret = _params.ClientSecret
  66. };
  67. return await Task.FromResult(authParams);
  68. }
  69. public async Task<UserInfoResponse> GetUserInfo(TokenMessage token)
  70. {
  71. var http = _httpClientFactory.CreateClient();
  72. http.BaseAddress = new Uri(SpotifyService.GLOBALS.SPOTIFYURL);
  73. //AUTHORIZATION HEADER
  74. http.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + token.Token);
  75. var response = await http.GetAsync(http.BaseAddress + "me");
  76. var user = JsonConvert.DeserializeObject<UserInfoResponse>(await response.Content.ReadAsStringAsync());
  77. return await Task.FromResult(user!);
  78. }
  79. }
  80. }