Skip to content

Commit 07727e2

Browse files
committed
TD-4086-Adds tableau JWT token helper class and settings
1 parent 9c8910d commit 07727e2

File tree

5 files changed

+92
-2
lines changed

5 files changed

+92
-2
lines changed

DigitalLearningSolutions.Data/Extensions/ConfigurationExtensions.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ public static class ConfigurationExtensions
4949

5050
private const string LearningHubUserAPIUserAPIUrl = "LearningHubUserApi:UserApiUrl";
5151
private const string UserResearchUrlName = "UserResearchUrl";
52+
private const string TableauSectionKey = "TableauDashboards";
53+
private const string TableauClientId = "ClientId";
54+
private const string TableauClientSecret = "ClientSecret";
55+
private const string TableauUsername = "Username";
56+
private const string TableauClientName = "ClientName";
5257

5358
public static string GetAppRootPath(this IConfiguration config)
5459
{
@@ -218,5 +223,21 @@ public static string GetUserResearchUrl(this IConfiguration config)
218223
{
219224
return config[UserResearchUrlName]!;
220225
}
226+
public static string GetTableauClientName(this IConfiguration config)
227+
{
228+
return config[$"{TableauSectionKey}:{TableauClientName}"]!;
229+
}
230+
public static string GetTableauClientId(this IConfiguration config)
231+
{
232+
return config[$"{TableauSectionKey}:{TableauClientId}"]!;
233+
}
234+
public static string GetTableauClientSecret(this IConfiguration config)
235+
{
236+
return config[$"{TableauSectionKey}:{TableauClientSecret}"]!;
237+
}
238+
public static string GetTableauUser(this IConfiguration config)
239+
{
240+
return config[$"{TableauSectionKey}:{TableauUsername}"]!;
241+
}
221242
}
222243
}

DigitalLearningSolutions.Web/Helpers/ExternalApis/FilteredApiHelper.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@
66
using System.Net.Http;
77
using System.Security.Claims;
88
using System.Text;
9-
using System.Text.Json;
109
using System.Threading.Tasks;
1110
using Newtonsoft.Json;
1211
using System.Net.Http.Headers;
1312
using DigitalLearningSolutions.Data.Models.External.Filtered;
14-
using System.Collections;
1513
using System.Collections.Generic;
1614
using System.Linq;
1715
using DigitalLearningSolutions.Data.Utilities;
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
namespace DigitalLearningSolutions.Web.Helpers.ExternalApis
2+
{
3+
using Microsoft.IdentityModel.Tokens;
4+
using System.Collections.Generic;
5+
using System.IdentityModel.Tokens.Jwt;
6+
using System.Security.Claims;
7+
using System.Text;
8+
using System;
9+
using Microsoft.Extensions.Configuration;
10+
using DigitalLearningSolutions.Data.Extensions;
11+
12+
public interface ITableauConnectionHelperService
13+
{
14+
string GetToken(string email);
15+
}
16+
public class TableauConnectionHelper : ITableauConnectionHelperService
17+
{
18+
private readonly string connectedAppClient;
19+
private readonly string connectedAppSecretKey;
20+
private readonly string connectedAppClientId;
21+
private readonly string user;
22+
public TableauConnectionHelper(IConfiguration config)
23+
{
24+
connectedAppClient = config.GetTableauClientName();
25+
connectedAppClientId = config.GetTableauClientId();
26+
connectedAppSecretKey = config.GetTableauClientSecret();
27+
user = config.GetTableauUser();
28+
}
29+
public string GetToken(string email)
30+
{
31+
var tokenHandler = new JwtSecurityTokenHandler();
32+
var key = Encoding.ASCII.GetBytes(connectedAppSecretKey);
33+
34+
var tokenDescriptor = new SecurityTokenDescriptor
35+
{
36+
Issuer = connectedAppClientId,
37+
Audience = "tableau",
38+
Subject = new ClaimsIdentity(new[]
39+
{
40+
new Claim(JwtRegisteredClaimNames.Sub, user),
41+
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
42+
new Claim("scp", "tableau:views:embed"),
43+
new Claim("scp", "tableau:metrics:embed")
44+
}),
45+
Expires = DateTime.UtcNow.AddMinutes(5),
46+
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),
47+
Claims = new Dictionary<string, object>
48+
{
49+
{ "kid", connectedAppClientId },
50+
{ "iss", connectedAppClient }
51+
}
52+
};
53+
54+
var token = tokenHandler.CreateToken(tokenDescriptor);
55+
var tokenString = tokenHandler.WriteToken(token);
56+
57+
return tokenString;
58+
}
59+
60+
}
61+
}

DigitalLearningSolutions.Web/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,7 @@ private static void RegisterHttpClients(IServiceCollection services)
560560
services.AddHttpClient<ILearningHubReportApiClient, LearningHubReportApiClient>();
561561
services.AddScoped<IFreshdeskApiClient, FreshdeskApiClient>();
562562
services.AddScoped<ILearningHubUserApiClient, LearningHubUserApiClient>();
563+
services.AddScoped<ITableauConnectionHelperService, TableauConnectionHelper>();
563564
}
564565

565566
private static void RegisterWebServiceFilters(IServiceCollection services)

DigitalLearningSolutions.Web/appsettings.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,14 @@
7878
"LearningHubUserApi": {
7979
"UserApiUrl": "https://userapi.learninghub.nhs.uk/api/"
8080
},
81+
"TableauDashboards": {
82+
"SiteUrl": "https://tabuat.data.england.nhs.uk",
83+
"CompetencyDashboardUrl": "https://tabuat.data.england.nhs.uk/#/workbooks/7839/views",
84+
"Username": "SVC_default_TEL",
85+
"Password": "",
86+
"ClientName": "tel_dls",
87+
"ClientId": "a7906ce3-e0c9-403e-a169-8eb78d858f8a",
88+
"ClientSecret": ""
89+
},
8190
"UserResearchUrl": "https://forms.office.com/e/nKcK8AdHRX"
8291
}

0 commit comments

Comments
 (0)