| public class TokenResponse | public class TokenResponse | ||||
| { | { | ||||
| [ProtoMember(1)] | [ProtoMember(1)] | ||||
| public string? AccessToken { get; set; } | |||||
| public string? access_token { get; set; } | |||||
| [ProtoMember(2)] | [ProtoMember(2)] | ||||
| public string? RefreshToken{ get; set; } | |||||
| public string? refresh_token{ get; set; } | |||||
| [ProtoMember(3)] | [ProtoMember(3)] | ||||
| public int? ExpiresIn { get; set; } | |||||
| public int? expires_in { get; set; } | |||||
| } | } | ||||
| } | } |
| string url = "https://accounts.spotify.com/api/token"; | string url = "https://accounts.spotify.com/api/token"; | ||||
| http.BaseAddress = new Uri(url); | http.BaseAddress = new Uri(url); | ||||
| //get client id and secret from appsettings, convert to base64 and set as header | //get client id and secret from appsettings, convert to base64 and set as header | ||||
| var secrets = await GetAuthParams(); | var secrets = await GetAuthParams(); | ||||
| byte[] contentType = Encoding.UTF8.GetBytes($"{secrets.ClientId}:{secrets.ClientSecret}"); | byte[] contentType = Encoding.UTF8.GetBytes($"{secrets.ClientId}:{secrets.ClientSecret}"); | ||||
| tokenRequest.redirect_uri = secrets.RedirectURI; | |||||
| //AUTHORIZATION HEADER | |||||
| http.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Basic " + Convert.ToBase64String(contentType)); | http.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Basic " + Convert.ToBase64String(contentType)); | ||||
| //ACCEPT HEADER | //ACCEPT HEADER | ||||
| var requestBody = new Dictionary<string, string>(); | var requestBody = new Dictionary<string, string>(); | ||||
| requestBody["grant_type"] = tokenRequest.grant_type; | requestBody["grant_type"] = tokenRequest.grant_type; | ||||
| requestBody["code"] = tokenRequest.code!; | requestBody["code"] = tokenRequest.code!; | ||||
| requestBody["redirect_uri"] = secrets.RedirectURI!; | |||||
| requestBody["redirect_uri"] = tokenRequest.redirect_uri!; | |||||
| var response = await http.PostAsync(url, new FormUrlEncodedContent(requestBody)); | var response = await http.PostAsync(url, new FormUrlEncodedContent(requestBody)); | ||||
| var contents = JsonConvert.DeserializeObject<TokenResponse>(await response.Content.ReadAsStringAsync()); | var contents = JsonConvert.DeserializeObject<TokenResponse>(await response.Content.ReadAsStringAsync()); | ||||
| return await Task.FromResult(new TokenResponse | |||||
| return new TokenResponse | |||||
| { | { | ||||
| AccessToken = contents!.AccessToken, | |||||
| RefreshToken = contents!.RefreshToken, | |||||
| ExpiresIn = contents!.ExpiresIn | |||||
| }); | |||||
| access_token = contents!.access_token, | |||||
| refresh_token = contents!.refresh_token, | |||||
| expires_in = contents!.expires_in | |||||
| }; | |||||
| } | } | ||||
| public async Task<CodeRequest> GetAuthParams() | public async Task<CodeRequest> GetAuthParams() |
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <PackageReference Include="Blazored.SessionStorage" Version="2.2.0" /> | |||||
| <PackageReference Include="Grpc.Net.Client" Version="2.47.0" /> | <PackageReference Include="Grpc.Net.Client" Version="2.47.0" /> | ||||
| <PackageReference Include="Grpc.Net.Client.Web" Version="2.47.0" /> | <PackageReference Include="Grpc.Net.Client.Web" Version="2.47.0" /> | ||||
| <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.7" /> | <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.7" /> |
| @using NemAnBlazor.Services.Interfaces | @using NemAnBlazor.Services.Interfaces | ||||
| @inject NavigationManager NavigationMgr | @inject NavigationManager NavigationMgr | ||||
| @inject IAuthClientService AuthService | @inject IAuthClientService AuthService | ||||
| @inject Blazored.SessionStorage.ISessionStorageService sessionStorage | |||||
| <PageTitle>Callback page</PageTitle> | <PageTitle>Callback page</PageTitle> | ||||
| //code is the only parameter in the url | //code is the only parameter in the url | ||||
| string code = url.Split("=")[1]; | string code = url.Split("=")[1]; | ||||
| string redirectURI = "https://localhost:44342/"; //ovo promeni da se storuje negde na neko univerzalno mesto | |||||
| var response = await AuthService.GetAccessToken(new GrpcShared.DTO.Auth.TokenRequest { code = code, redirect_uri = redirectURI}); | |||||
| var response = await AuthService.GetAccessToken(new GrpcShared.DTO.Auth.TokenRequest { code = code}); | |||||
| //store access token in local storage | //store access token in local storage | ||||
| await sessionStorage.SetItemAsync("token", response.access_token); | |||||
| await sessionStorage.SetItemAsync("refresh_token", response.refresh_token); | |||||
| } | } | ||||
| } | } |
| using Blazored.SessionStorage; | |||||
| using Grpc.Net.Client; | using Grpc.Net.Client; | ||||
| using Grpc.Net.Client.Web; | using Grpc.Net.Client.Web; | ||||
| using Microsoft.AspNetCore.Components; | using Microsoft.AspNetCore.Components; | ||||
| builder.Services.AddScoped<ISearchClientService, SearchClientService>(); | builder.Services.AddScoped<ISearchClientService, SearchClientService>(); | ||||
| builder.Services.AddScoped<IAuthClientService, AuthClientService>(); | builder.Services.AddScoped<IAuthClientService, AuthClientService>(); | ||||
| builder.Services.AddBlazoredSessionStorage(); | |||||
| await builder.Build().RunAsync(); | await builder.Build().RunAsync(); | ||||