Skip to content

Commit 16a57bc

Browse files
fix: added a parameter required for the protocol
1 parent 7ec4f6a commit 16a57bc

34 files changed

Lines changed: 1329 additions & 173 deletions

File tree

HwProj.APIGateway/HwProj.APIGateway.API/Lti/Controllers/JwksController.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,20 @@ public IActionResult GetJwks()
3636

3737
var publicParams = rsa.ExportParameters(false);
3838

39-
var securityKey = new RsaSecurityKey(publicParams)
40-
{
41-
KeyId = keyConfig.KeyId
42-
};
43-
44-
var jwk = JsonWebKeyConverter.ConvertFromRSASecurityKey(securityKey);
45-
46-
jwk.Use = "sig";
47-
jwk.Alg = "RS256";
48-
4939
var jwks = new
5040
{
51-
keys = new[] { jwk }
41+
keys = new[]
42+
{
43+
new
44+
{
45+
kty = "RSA",
46+
e = Base64UrlEncoder.Encode(publicParams.Exponent),
47+
n = Base64UrlEncoder.Encode(publicParams.Modulus),
48+
kid = keyConfig.KeyId,
49+
alg = "RS256",
50+
use = "sig"
51+
}
52+
}
5253
};
5354

5455
return Ok(jwks);

HwProj.APIGateway/HwProj.APIGateway.API/Lti/Controllers/LtiAuthController.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public async Task<IActionResult> AuthorizeLti(
8383
clientId: clientId,
8484
toolId: payload.ToolId,
8585
courseId: payload.CourseId,
86-
targetLinkUri: tool.DeepLink,
86+
targetLinkUri: redirectUri,
8787
userId: payload.UserId,
8888
nonce: nonce
8989
);
@@ -93,7 +93,8 @@ public async Task<IActionResult> AuthorizeLti(
9393
clientId: clientId,
9494
toolId: payload.ToolId,
9595
courseId: payload.CourseId,
96-
targetLinkUri: tool.LaunchUrl,
96+
targetLinkUri: redirectUri,
97+
ltiCustomParams: payload.Custom,
9798
userId: payload.UserId,
9899
nonce: nonce,
99100
resourceLinkId: payload.ResourceLinkId!);
@@ -124,6 +125,7 @@ public async Task<IActionResult> StartLti(
124125
[FromQuery] string? courseId,
125126
[FromQuery] string? toolId,
126127
[FromQuery] string? ltiLaunchUrl,
128+
[FromQuery] string? ltiCustomParams,
127129
[FromQuery] bool isDeepLink = false)
128130
{
129131
var userId = User.FindFirstValue("_id");
@@ -181,7 +183,8 @@ public async Task<IActionResult> StartLti(
181183
UserId = userId,
182184
CourseId = courseId,
183185
ToolId = toolId,
184-
ResourceLinkId = resourceLinkId
186+
ResourceLinkId = resourceLinkId,
187+
Custom = ltiCustomParams
185188
};
186189
}
187190
else
@@ -254,5 +257,6 @@ private class LtiHintPayload
254257
public string? ResourceLinkId { get; set; }
255258
public string? CourseId { get; set; }
256259
public string? ToolId { get; set; }
260+
public string? Custom { get; set; }
257261
}
258262
}

HwProj.APIGateway/HwProj.APIGateway.API/Lti/Controllers/LtiDeepLinkingReturnController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public async Task<IActionResult> OnDeepLinkingReturnAsync([FromForm] IFormCollec
3939
}
4040

4141
var unverifiedToken = handler.ReadJwtToken(tokenString);
42-
var clientId = unverifiedToken.Subject;
42+
var clientId = unverifiedToken.Issuer;
4343

4444
var tool = await toolService.GetByClientIdAsync(clientId);
4545
if (tool == null)

HwProj.APIGateway/HwProj.APIGateway.API/Lti/Services/ILtiTokenService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public string CreateResourceLinkToken(
1818
string toolId,
1919
string courseId,
2020
string targetLinkUri,
21+
string? ltiCustomParams,
2122
string userId,
2223
string nonce,
2324
string resourceLinkId);

HwProj.APIGateway/HwProj.APIGateway.API/Lti/Services/LtiTokenService.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IdentityModel.Tokens.Jwt;
44
using System.Security.Claims;
55
using System.Security.Cryptography;
6+
using System.Text.Json;
67
using HwProj.APIGateway.API.Lti.Models;
78
using HwProj.APIGateway.API.LTI.Services;
89
using LtiAdvantage.DeepLinking;
@@ -57,6 +58,7 @@ public string CreateResourceLinkToken(
5758
string toolId,
5859
string courseId,
5960
string targetLinkUri,
61+
string? ltiCustomParams,
6062
string userId,
6163
string nonce,
6264
string resourceLinkId)
@@ -93,6 +95,21 @@ public string CreateResourceLinkToken(
9395
}
9496
};
9597

98+
if (string.IsNullOrEmpty(ltiCustomParams))
99+
{
100+
request.Custom = new Dictionary<string, string>();
101+
return this.CreateJwt(clientId, request);
102+
}
103+
104+
try
105+
{
106+
request.Custom = JsonSerializer.Deserialize<Dictionary<string, string>>(ltiCustomParams);
107+
}
108+
catch (JsonException)
109+
{
110+
request.Custom = new Dictionary<string, string>();
111+
}
112+
96113
return this.CreateJwt(clientId, request);
97114
}
98115

HwProj.AuthService/HwProj.AuthService.API/appsettings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
},
3030
"EventBus": {
3131
"EventBusHostName": "localhost",
32-
"EventBusUserName": "guest",
33-
"EventBusPassword": "guest",
32+
"EventBusUserName": "user",
33+
"EventBusPassword": "password",
3434
"EventBusVirtualHost": "/",
3535
"EventBusQueueName": "AuthService",
3636
"EventBusRetryCount": "5"

HwProj.Common/HwProj.Models/CoursesService/ViewModels/HomeworkTaskViewModels.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class HomeworkTaskViewModel
3737
public bool IsDeferred { get; set; }
3838

3939
[JsonProperty]
40-
public string? LtiLaunchUrl { get; set; }
40+
public LtiLaunchData? LtiLaunchData { get; set; }
4141
}
4242

4343
public class HomeworkTaskForEditingViewModel
@@ -67,6 +67,12 @@ public class CreateTaskViewModel
6767

6868
public ActionOptions? ActionOptions { get; set; }
6969

70-
public string? LtiLaunchUrl { get; set; }
70+
public LtiLaunchData? LtiLaunchData { get; set; }
71+
}
72+
73+
public class LtiLaunchData
74+
{
75+
public string LtiLaunchUrl { get; set; }
76+
public string? CustomParams { get; set; }
7177
}
7278
}

HwProj.CoursesService/HwProj.CoursesService.API/Controllers/HomeworksController.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,13 @@ private async Task FillLtiUrls(HomeworkViewModel viewModel)
8989
if (viewModel.Tasks != null && viewModel.Tasks.Any())
9090
{
9191
var taskIds = viewModel.Tasks.Select(t => t.Id).ToArray();
92-
var ltiUrls = await _tasksService.GetLtiUrlsForTasksAsync(taskIds);
92+
var ltilaunchMultipleData = await _tasksService.GetLtiDataForTasksAsync(taskIds);
9393

9494
foreach (var task in viewModel.Tasks)
9595
{
96-
if (ltiUrls.TryGetValue(task.Id, out var url))
96+
if (ltilaunchMultipleData.TryGetValue(task.Id, out var ltiLaunchData))
9797
{
98-
task.LtiLaunchUrl = url;
98+
task.LtiLaunchData = ltiLaunchData.ToLtiLaunchData();
9999
}
100100
}
101101
}

HwProj.CoursesService/HwProj.CoursesService.API/Controllers/TasksController.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ public async Task<IActionResult> GetTask(long taskId)
4848
var task = taskFromDb.ToHomeworkTaskViewModel();
4949

5050

51-
task.LtiLaunchUrl = await _tasksService.GetTaskLtiUrlAsync(taskId);
51+
var ltiLaunchData = await _tasksService.GetTaskLtiDataAsync(taskId);
52+
task.LtiLaunchData = ltiLaunchData.ToLtiLaunchData();
53+
5254
return Ok(task);
5355
}
5456

@@ -78,7 +80,7 @@ public async Task<IActionResult> AddTask(long homeworkId, [FromBody] CreateTaskV
7880
var task = await _tasksService.AddTaskAsync(
7981
homeworkId,
8082
taskViewModel.ToHomeworkTask(),
81-
taskViewModel.LtiLaunchUrl
83+
taskViewModel.LtiLaunchData.ToLtiLaunchData()
8284
);
8385

8486
return Ok(task);
@@ -105,7 +107,7 @@ public async Task<IActionResult> UpdateTask(long taskId, [FromBody] CreateTaskVi
105107
taskId,
106108
taskViewModel.ToHomeworkTask(),
107109
taskViewModel.ActionOptions ?? ActionOptions.Default,
108-
taskViewModel.LtiLaunchUrl
110+
taskViewModel.LtiLaunchData.ToLtiLaunchData()
109111
);
110112

111113
return Ok(updatedTask.ToHomeworkTaskViewModel());

HwProj.CoursesService/HwProj.CoursesService.API/Domains/MappingExtensions.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,12 @@ public static HomeworkTaskTemplate ToHomeworkTaskTemplate(this HomeworkTaskViewM
169169
IsDeadlineStrict = task.IsDeadlineStrict,
170170
HasSpecialPublicationDate = task.PublicationDate != null,
171171
HasSpecialDeadlineDate = task.DeadlineDate != null,
172-
LtiLaunchUrl = task.LtiLaunchUrl
172+
LtiLaunchData = task.LtiLaunchData == null ? null :
173+
new LtiLaunchData
174+
{
175+
LtiLaunchUrl = task.LtiLaunchData.LtiLaunchUrl,
176+
CustomParams = task.LtiLaunchData.CustomParams
177+
}
173178
};
174179

175180
public static Course ToCourse(this CourseTemplate courseTemplate)
@@ -205,5 +210,23 @@ public static HomeworkTask ToHomeworkTask(this HomeworkTaskTemplate taskTemplate
205210
PublicationDate = taskTemplate.HasSpecialPublicationDate ? DateToOverride : (DateTime?)null,
206211
DeadlineDate = taskTemplate.HasSpecialDeadlineDate ? DateToOverride : (DateTime?)null,
207212
};
213+
214+
public static LtiLaunchData? ToLtiLaunchData(
215+
this HwProj.Models.CoursesService.ViewModels.LtiLaunchData? ltiLaunchData)
216+
=> ltiLaunchData == null ? null :
217+
new LtiLaunchData
218+
{
219+
LtiLaunchUrl = ltiLaunchData.LtiLaunchUrl,
220+
CustomParams = ltiLaunchData.CustomParams
221+
};
222+
223+
public static HwProj.Models.CoursesService.ViewModels.LtiLaunchData? ToLtiLaunchData(
224+
this LtiLaunchData? ltiLaunchData)
225+
=> ltiLaunchData == null ? null :
226+
new HwProj.Models.CoursesService.ViewModels.LtiLaunchData
227+
{
228+
LtiLaunchUrl = ltiLaunchData.LtiLaunchUrl,
229+
CustomParams = ltiLaunchData.CustomParams
230+
};
208231
}
209232
}

0 commit comments

Comments
 (0)