| @@ -11,10 +11,10 @@ namespace GrpcShared.DTO.Auth | |||
| public class TokenResponse | |||
| { | |||
| [ProtoMember(1)] | |||
| public string? AccessToken { get; set; } | |||
| public string? access_token { get; set; } | |||
| [ProtoMember(2)] | |||
| public string? RefreshToken{ get; set; } | |||
| public string? refresh_token{ get; set; } | |||
| [ProtoMember(3)] | |||
| public int? ExpiresIn { get; set; } | |||
| public int? expires_in { get; set; } | |||
| } | |||
| } | |||
| @@ -31,10 +31,13 @@ namespace IdentityProvider.Services | |||
| string url = "https://accounts.spotify.com/api/token"; | |||
| http.BaseAddress = new Uri(url); | |||
| //get client id and secret from appsettings, convert to base64 and set as header | |||
| var secrets = await GetAuthParams(); | |||
| 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)); | |||
| //ACCEPT HEADER | |||
| @@ -45,18 +48,18 @@ namespace IdentityProvider.Services | |||
| var requestBody = new Dictionary<string, string>(); | |||
| requestBody["grant_type"] = tokenRequest.grant_type; | |||
| 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 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() | |||
| @@ -7,6 +7,7 @@ | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Blazored.SessionStorage" Version="2.2.0" /> | |||
| <PackageReference Include="Grpc.Net.Client" Version="2.47.0" /> | |||
| <PackageReference Include="Grpc.Net.Client.Web" Version="2.47.0" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.7" /> | |||
| @@ -2,6 +2,7 @@ | |||
| @using NemAnBlazor.Services.Interfaces | |||
| @inject NavigationManager NavigationMgr | |||
| @inject IAuthClientService AuthService | |||
| @inject Blazored.SessionStorage.ISessionStorageService sessionStorage | |||
| <PageTitle>Callback page</PageTitle> | |||
| @@ -23,11 +24,11 @@ | |||
| //code is the only parameter in the url | |||
| 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 | |||
| await sessionStorage.SetItemAsync("token", response.access_token); | |||
| await sessionStorage.SetItemAsync("refresh_token", response.refresh_token); | |||
| } | |||
| } | |||
| @@ -1,3 +1,4 @@ | |||
| using Blazored.SessionStorage; | |||
| using Grpc.Net.Client; | |||
| using Grpc.Net.Client.Web; | |||
| using Microsoft.AspNetCore.Components; | |||
| @@ -23,6 +24,7 @@ builder.Services.AddScoped(_ => | |||
| builder.Services.AddScoped<ISearchClientService, SearchClientService>(); | |||
| builder.Services.AddScoped<IAuthClientService, AuthClientService>(); | |||
| builder.Services.AddBlazoredSessionStorage(); | |||
| await builder.Build().RunAsync(); | |||