Skip to content

Commit f793258

Browse files
author
Robinson Aizprua
committed
dev
1 parent d8af640 commit f793258

File tree

10 files changed

+85
-55
lines changed

10 files changed

+85
-55
lines changed

src/GOC.ApiGateway/AppSettings.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,21 @@ public class IdentitySettings
3030
{
3131
public string Authority { get; set; }
3232
public string ApiName { get; set; }
33-
public string ApiSecret { get; set; }
34-
public IList<DownstreamClient> DownstreamClients { get; set; }
35-
}
33+
public string ApiSecret { get; set; }
34+
public string TokenEndpoint { get; set; }
35+
36+
public string TokenEndpointUrl
37+
{
38+
get => $"{Authority}/{TokenEndpoint}";
39+
}
40+
public IList<DownstreamClient> DownstreamClients { get; set; }
41+
}
42+
//TODO do this in json config file
3643
public class DownstreamClient
3744
{
38-
public string ApiName { get; set; }
39-
public string ApiSecret { get; set; }
45+
public string ClientId { get; set; }
46+
public string ClientSecret { get; set; }
47+
public string ResourceName { get; set; }
4048
}
4149
public class RabbitMQSettings
4250
{
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Microsoft.AspNetCore.Mvc;
2+
3+
namespace GOC.ApiGateway.Controllers
4+
{
5+
public class BaseController : Controller
6+
{
7+
8+
}
9+
}

src/GOC.ApiGateway/Controllers/ValuesController.cs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
1-
using System;
2-
using System.Net.Http;
3-
using System.Threading.Tasks;
4-
using EasyNetQ;
5-
using GOC.ApiGateway.Interfaces;
6-
using IdentityModel.Client;
1+
using GOC.ApiGateway.Interfaces;
72
using Microsoft.AspNetCore.Authorization;
3+
using Microsoft.AspNetCore.Http;
84
using Microsoft.AspNetCore.Mvc;
95

106
namespace GOC.ApiGateway.Controllers
117
{
128
[Route("api/[controller]")]
13-
//[Authorize]
14-
public class ValuesController : Controller
9+
[Authorize]
10+
public class ValuesController : BaseController
1511
{
1612
private readonly IInventoryService _service;
1713

18-
public ValuesController(IInventoryService service, IBus bus, IGocHttpBasicClient http)
19-
{
14+
public ValuesController(IInventoryService service, IGocHttpClient k)
15+
{
2016
_service = service;
21-
}
17+
}
18+
2219
// GET api/values
2320
[HttpGet]
2421
public IActionResult Get()

src/GOC.ApiGateway/GOC.ApiGateway.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<Folder Include="wwwroot\" />
1010
<Folder Include="Services\" />
1111
<Folder Include="Handlers\" />
12+
<Folder Include="Repositories\InventoryService\" />
1213
</ItemGroup>
1314

1415
<ItemGroup>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace GOC.ApiGateway
22
{
3-
public interface IGocHttpBasicClient
3+
public interface IGocHttpClient
44
{
55
}
66
}

src/GOC.ApiGateway/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public static void Main(string[] args)
1313
public static IWebHost BuildWebHost(string[] args) =>
1414
WebHost.CreateDefaultBuilder(args)
1515
.UseStartup<Startup>()
16-
.UseUrls("http://*:5001")
16+
.UseUrls("http://*:5060")
1717
.Build();
1818
}
1919
}
Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
42
using System.Net.Http;
53
using System.Threading;
64
using System.Threading.Tasks;
5+
using IdentityModel.Client;
76

87
namespace GOC.ApiGateway
98
{
10-
public class HttpClientWrapper : IGocHttpBasicClient
9+
public class HttpClientWrapper : IGocHttpClient
1110
{
1211
private readonly HttpClient _httpClient;
1312
private readonly Func<string, string, Uri> _relativeUriResolver;
14-
private readonly Action<HttpRequestMessage> _httpRequestMessageDecorator;
13+
private IHttpTokenAuthorizationContext _authContext { get; set; }
1514

16-
public HttpClientWrapper(HttpClient client, Func<string, string, Uri> serviceUriResolver = null, Action<HttpRequestMessage> httpRequestMessageDecorator = null)
15+
public HttpClientWrapper(HttpClient client, IHttpTokenAuthorizationContext authContext,Func<string, string, Uri> serviceUriResolver = null)
1716
{
17+
_authContext = authContext;
1818
_httpClient = client;
1919
_relativeUriResolver = serviceUriResolver ?? ((sn, s) => new Uri(s));
20-
_httpRequestMessageDecorator = httpRequestMessageDecorator ?? (m => { });
2120
}
2221

2322
/// <summary>
@@ -32,19 +31,39 @@ public Uri ResolveRelativeUri(string serviceName, string relativeUri)
3231
return _relativeUriResolver(serviceName, relativeUri);
3332
}
3433

35-
public async Task<HttpResponseMessage> GetAsync(string serviceName, string relativeUri, CancellationToken cancellationToken)
34+
public async Task<HttpResponseMessage> GetAsync(string serviceName, DownstreamClient downstreamClient, string relativeUri, CancellationToken cancellationToken)
3635
{
36+
await SetAccessToken(downstreamClient);
3737
var request = CreateRequestMessage(HttpMethod.Get, serviceName, relativeUri);
3838
return await _httpClient.SendAsync(request, cancellationToken);
3939
}
4040

41-
private HttpRequestMessage CreateRequestMessage(HttpMethod method, string serviceName, string relativeUri)
41+
HttpRequestMessage CreateRequestMessage(HttpMethod method, string serviceName, string relativeUri)
4242
{
4343
var uri = _relativeUriResolver.Invoke(serviceName, relativeUri);
4444
var request = new HttpRequestMessage(method, uri);
45-
_httpRequestMessageDecorator.Invoke(request);
4645
return request;
4746
}
4847

48+
async Task SetAccessToken(DownstreamClient downstreamClient)
49+
{
50+
var delegateToken = await DelegateAsync(_authContext.AccessToken, downstreamClient.ClientId, downstreamClient.ClientSecret, downstreamClient.ResourceName);
51+
_httpClient.SetBearerToken(delegateToken.AccessToken);
52+
}
53+
54+
async Task<TokenResponse> DelegateAsync(string userToken, string clientId, string clientSecret, string resourceName)
55+
{
56+
var payload = new
57+
{
58+
token = userToken
59+
};
60+
61+
// create token client
62+
var client = new TokenClient(Startup.AppSettings.Identity.TokenEndpointUrl, clientId, clientSecret);
63+
64+
// send custom grant to token endpoint, return response
65+
return await client.RequestCustomGrantAsync("delegation", resourceName, payload);
66+
}
67+
4968
}
5069
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using GOC.ApiGateway;
2+
3+
public class RespositoryBase
4+
{
5+
protected readonly IGocHttpClient Client;
6+
7+
public RespositoryBase(IGocHttpClient client)
8+
{
9+
Client = client;
10+
}
11+
}

src/GOC.ApiGateway/Startup.cs

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,19 @@ public Startup(IHostingEnvironment env)
3737

3838
Configuration = builder.Build();
3939
AppSettings = Configuration.GetSection("ApiGateWay").Get<AppSettings>();
40-
40+
//TODO do this somehow in json config file
4141
var downstreamClients = new List<DownstreamClient>
4242
{
4343
new DownstreamClient
4444
{
45-
ApiName = "api1.client",
46-
ApiSecret = "api1.client-secret"
45+
ClientId = "api1.client",
46+
ClientSecret = "api1.client-secret",
47+
ResourceName = "api2"
4748
}
4849
};
4950
AppSettings.Identity.DownstreamClients = downstreamClients;
5051
}
51-
public static AppSettings AppSettings { get; set; }
52+
public static AppSettings AppSettings { get; private set; }
5253
public IConfiguration Configuration { get; }
5354
private Container Container { get; } = new Container();
5455
private ILoggerFactory LoggerFactory { get; set; }
@@ -143,7 +144,7 @@ protected void InitializeContainer(IApplicationBuilder app)
143144

144145
// message bus registration
145146
Container.Register<IBus>(() => RabbitHutch.CreateBus($"host={AppSettings.Rabbit.Host}"), Lifestyle.Singleton);
146-
147+
Container.Register<IHttpContextAccessor, HttpContextAccessor>(Lifestyle.Scoped);
147148
Container.CrossWire<ILoggerFactory>(app);
148149
Container.Verify();
149150

@@ -166,41 +167,24 @@ private void RegisterCustomHttpClient(IApplicationBuilder app)
166167
}, Lifestyle.Scoped);
167168

168169
var consulUriResolverRegistration = Lifestyle.Singleton.CreateRegistration<Func<string, string, Uri>>(
169-
() => (serviceName, relativeUri) => Cluster.Client.ResolveUri(serviceName, relativeUri), Container);
170-
171-
var httpMessageDecoratorRegistration =
172-
Lifestyle.Singleton.CreateRegistration<Action<HttpRequestMessage>>(
173-
() => m =>
174-
{
175-
var authorizationContext = Container.GetInstance<IHttpTokenAuthorizationContext>();
176-
void SetBearerToken(string t) => m.Headers.Add("Authorization", $"Bearer {t}");
177-
178-
if (authorizationContext.BearerTokens.Any())
179-
{
180-
SetBearerToken(authorizationContext.BearerTokens.First());
181-
}
182-
else if (!String.IsNullOrEmpty(authorizationContext.AccessToken))
183-
{
184-
SetBearerToken(authorizationContext.AccessToken);
185-
}
186-
}, Container);
187-
170+
() => (serviceName, relativeUri) => Cluster.Client.ResolveUri(serviceName, relativeUri), Container);
171+
172+
188173
var gocHttpClientRegistration = Lifestyle.Singleton.CreateRegistration(() => new HttpClient(), Container);
189174

190175

191176
Container.RegisterConditional(serviceType: typeof(HttpClient),
192177
registration: gocHttpClientRegistration,
193-
predicate: c => c.Consumer.ImplementationType.GetInterface(nameof(IGocHttpBasicClient)) != null);
178+
predicate: c => c.Consumer.ImplementationType.GetInterface(nameof(IGocHttpClient)) != null);
194179

195180
void RegisterHttpClient(Type type, Registration registration) => Container.RegisterConditional(serviceType: type,
196181
registration: registration,
197182
predicate: context =>
198183
context.Consumer.ImplementationType == typeof(HttpClientWrapper));
199184

200185
RegisterHttpClient(typeof(Func<string, string, Uri>), consulUriResolverRegistration);
201-
RegisterHttpClient(typeof(Action<HttpRequestMessage>), httpMessageDecoratorRegistration);
202186

203-
Container.Register<IGocHttpBasicClient, HttpClientWrapper>(Lifestyle.Scoped);
187+
Container.Register<IGocHttpClient, HttpClientWrapper>(Lifestyle.Scoped);
204188
}
205189

206190
private async Task<IEnumerable<string>> BearerTokenAccessor(HttpContext context)

src/GOC.ApiGateway/appsettings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
"Identity" : {
1919
"Authority": "http://vagrant:5000",
2020
"ApiName": "api1",
21-
"ApiSecret": "api1-secret"
21+
"ApiSecret": "api1-secret",
22+
"TokenEndpoint": "connect/token"
2223
},
2324
"Rabbit": {
2425
"Host": "vagrant"

0 commit comments

Comments
 (0)