Browse Source

Authorization

tags/v1.1.0^2
Nemanja Grkovic 3 years ago
parent
commit
ef119d7faf

+ 9
- 0
GrpcShared/GLOBALS.cs View File

@@ -0,0 +1,9 @@
using System;
namespace Shared
{
public static class GLOBALS
{
public const String SPOTIFYURL = "https://api.spotify.com/v1/";
public const String MEDIATYPE = "application/json";
}
}

+ 8
- 2
NemAnCore/App.razor View File

@@ -1,6 +1,11 @@
<Router AppAssembly="@typeof(App).Assembly">
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" >
<Authorizing>
<text>Please wait, we are authorizint the user.</text>
</Authorizing>
</AuthorizeRouteView>
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
@@ -10,3 +15,4 @@
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>

+ 17
- 9
NemAnCore/Pages/FetchData.razor View File

@@ -1,9 +1,12 @@
@page "/search"
@attribute [Authorize]
@using Grpc.Core
@using GrpcShared.DTO
@using GrpcShared.DTO.Search
@using GrpcShared.DTO.Track.MultipleTrack
@using GrpcShared.DTO.Track.SingleTrack
@using Microsoft.AspNetCore.Authorization
@using NemAnBlazor.Services
@using NemAnBlazor.Services.Interfaces
@using System.Diagnostics
@*@inject HttpClient Http*@
@@ -12,22 +15,30 @@
@inject IAuthClientService AuthService


<AuthorizeView>
<Authorized>
The user is authorized
</Authorized>
<NotAuthorized>
The User is not authorized
</NotAuthorized>
</AuthorizeView>

<PageTitle>Search</PageTitle>

<h1>Search</h1>

<button class="btn btn-primary" @onclick="Click">Click me</button>
<AuthorizeView>
<Authorized>
<button class="btn btn-primary" @onclick="Click">Click me</button>
</Authorized>
</AuthorizeView>



@code {
protected override async Task OnInitializedAsync()
{




//MultipleTrackRequest mreq = new() { Ids = new List<string>(){"3JAeYOjyJodI4PRs44lx2l", "6clZa1yrZe7pJrYFUcD9KW"}, Token = token };
//MultipleTrackResponse multipleTrackResponse = await SearchService.GetListMultipleTrackAsync(mreq);

@@ -39,12 +50,9 @@

var token = await sessionStorage.GetItemAsync<string>("token");
TokenMessage tm = new() { Token = token };

if ((await AuthService.GetUserInfo(tm)) != null)
{
SearchRequest request = new() { Query = "aitch", Type = "track", Token = token };
SearchResponse searchResponse = await SearchService.GetListSearchAsync(request);
}
}



+ 26
- 1
NemAnCore/Pages/Index.razor View File

@@ -8,22 +8,47 @@
@inject NavigationManager NavigationManager
@inject IAuthClientService AuthService
@inject ITrackClientService SearchService
@using System.Security.Claims




<AuthorizeView>
<Authorized>
Dobrodosli @context.User.Claims.FirstOrDefault(x => x.Type == "name")?.Value.ToUpper()
</Authorized>
<NotAuthorized>
Nisi autorizovan.
<button class="btn btn-primary" @onclick="Login">Autorizuj</button>
</NotAuthorized>
</AuthorizeView>

<PageTitle>Index</PageTitle>

<h1>Pozdrav Diligent!</h1>


Dobrodošli u našu NemAn aplikaciju.




@code {
private string message;

protected override async Task OnInitializedAsync()
{
message = "Cao";
}

private async Task Login()
{
//var response = await SearchService.GetListSearchAsync(new GrpcShared.DTO.Search.SearchRequest() { Query="venom", Type = "track"});
CodeRequest authParams = await AuthService.GetAuthParams();
CodeRequest authParams = await AuthService.GetAuthParams();
// await AuthService.GetAccessToken(new CodeResponse{ Code = "hello"});
string url = $"https://accounts.spotify.com/en/authorize?client_id={authParams.ClientId}&redirect_uri={authParams.RedirectURI}&response_type={authParams.ResponseType}&scope={authParams.Scope}&show_dialog={authParams.ShowDialog}";

NavigationManager.NavigateTo(url);

}
}

+ 3
- 0
NemAnCore/Program.cs View File

@@ -2,6 +2,7 @@ using Blazored.SessionStorage;
using Grpc.Net.Client;
using Grpc.Net.Client.Web;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using NemAnBlazor;
@@ -21,6 +22,8 @@ builder.Services.AddScoped(_ =>

return channel;
});
builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<AuthenticationStateProvider, AuthClientService>();

builder.Services.AddScoped<ITrackClientService, TrackClientService>();
builder.Services.AddScoped<IAuthClientService, AuthClientService>();

+ 23
- 19
NemAnCore/Services/AuthClientService.cs View File

@@ -12,13 +12,15 @@ using Blazored.SessionStorage;

namespace NemAnBlazor.Services
{
public class AuthClientService : IAuthClientService
public class AuthClientService : AuthenticationStateProvider, IAuthClientService
{

private IAuthService _serviceClient;
public AuthClientService(GrpcChannel grpcChannel)
private ISessionStorageService _sessionStorage;
public AuthClientService(GrpcChannel grpcChannel, ISessionStorageService sessionStorage)
{
_serviceClient = grpcChannel.CreateGrpcService<IAuthService>();
_sessionStorage = sessionStorage;
}
public async Task<TokenResponse> GetAccessToken(TokenRequest request)
{
@@ -35,29 +37,31 @@ namespace NemAnBlazor.Services
return await _serviceClient.GetUserInfo(token);
}

//public override async Task<AuthenticationState> GetAuthenticationStateAsync()
//{
// string token = await _sessionStorage.GetItemAsync<string>("token");
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
await Task.Delay(1500);

string token = await _sessionStorage.GetItemAsync<string>("token");

// //token = "BQBMgFm6jnFNWWeZEMGIRP_f-ENPid7Kw8JubAyuWAe4JK0S1DPFGlaAdZ_Fey6ePkCnz8-cqC0oyRmrciWUy5ISUTQKDe8PTQn4iBRMYCgM0n4GnS1xAErHJcm4Vpu2TAngk-4vQUOfTQRcedNTfCaHKP4uFJgTlTI7JHGrtB-_EZLnFcZ2OQe31oFQIJ1wM3ZtvwnN";
// if (token == null) return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
//token = "BQBMgFm6jnFNWWeZEMGIRP_f-ENPid7Kw8JubAyuWAe4JK0S1DPFGlaAdZ_Fey6ePkCnz8-cqC0oyRmrciWUy5ISUTQKDe8PTQn4iBRMYCgM0n4GnS1xAErHJcm4Vpu2TAngk-4vQUOfTQRcedNTfCaHKP4uFJgTlTI7JHGrtB-_EZLnFcZ2OQe31oFQIJ1wM3ZtvwnN";
if (token == null) return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));

// var userInfo = await _serviceClient.GetUserInfo(new TokenMessage { Token = token });
var userInfo = await _serviceClient.GetUserInfo(new TokenMessage { Token = token });

// List<Claim> claims = new();
List<Claim> claims = new();

// claims.Add(new Claim("email", userInfo.email!));
// claims.Add(new Claim("id", userInfo.id!));
// claims.Add(new Claim("name", userInfo.display_name!));
claims.Add(new Claim("email", userInfo.email!));
claims.Add(new Claim("id", userInfo.id!));
claims.Add(new Claim("name", userInfo.display_name!));

// ClaimsIdentity identity = new(claims, "jwt");
// //ClaimsIdentity identity = new();
// ClaimsPrincipal user = new(identity);
// AuthenticationState state = new(user);
ClaimsIdentity identity = new(claims, "jwt");
//ClaimsIdentity identity = new();
ClaimsPrincipal user = new(identity);
AuthenticationState state = new(user);

// NotifyAuthenticationStateChanged(Task.FromResult(state));
NotifyAuthenticationStateChanged(Task.FromResult(state));

// return state;
//}
return state;
}
}
}

+ 7
- 7
NemAnCore/Shared/NavMenu.razor View File

@@ -1,27 +1,27 @@
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">NemAnCore</a>
<a class="navbar-brand" href="">Spotify</a>
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</div>

<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu" >
<nav class="flex-column" >
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
@* <div class="nav-item px-3">
<NavLink class="nav-link" href="callback">
<span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>
</div>
</div>*@
<div class="nav-item px-3">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
<NavLink class="nav-link" href="search">
<span class="oi oi-list-rich" aria-hidden="true"></span> Search
</NavLink>
</div>
</nav>

+ 2
- 1
NemAnCore/_Imports.razor View File

@@ -8,4 +8,5 @@
@using Microsoft.JSInterop
@using NemAnBlazor
@using NemAnBlazor.Shared
@using System.Web
@using System.Web
@using Microsoft.AspNetCore.Components.Authorization

+ 1
- 1
NemAnCore/wwwroot/index.html View File

@@ -8,7 +8,7 @@
<base href="/" />
<link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />
<link href="css/app.css" rel="stylesheet" />
<link href="NemAnCore.styles.css" rel="stylesheet" />
<link href="NemAnBlazor.styles.css" rel="stylesheet" />
</head>

<body>

+ 0
- 5
gRPCServer/Services/TrackService.cs View File

@@ -27,7 +27,6 @@ namespace SpotifyService.Services
public async Task<SearchResponse> ListSearchAsync(SearchRequest request)
{


var client = _httpClientFactory.CreateClient("HttpClient");

client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + request.Token );
@@ -81,10 +80,6 @@ namespace SpotifyService.Services

client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + request.Token);


//bool startingQuestionMarkAdded = false;
//var sb = new StringBuilder();

var param = new Dictionary<string, List<string>>();
param["ids"] = request.Ids;


Loading…
Cancel
Save