/// <summary> /// 4. Display results with link to view the course /// </summary> /// <returns></returns> public async Task <IActionResult> View(CancellationToken cancellationToken, CourseWorkModel model) { var appFlow = new AppFlowMetadata(ClientId, ClientSecret, _context); var token = await appFlow.Flow.LoadTokenAsync(model.UserId, cancellationToken); var credential = new UserCredential(appFlow.Flow, model.UserId, token); try { // Get information using Google Classroom API using (var classroomService = new ClassroomService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "gc2lti" })) { var request = classroomService.Courses.Get(model.CourseId); var response = await request.ExecuteAsync(cancellationToken).ConfigureAwait(false); model.CourseAlternativeLink = response.AlternateLink; return(View(model)); } } catch (Exception e) { return(StatusCode(StatusCodes.Status500InternalServerError, e)); } }
public async Task <Boolean> checkCredential() { var app = new AppFlowMetadata(); var result = await new AuthorizationCodeMvcApp(this, app). AuthorizeAsync(cancellationToken); //var accessToken = result.Credential.Token.AccessToken; //string a = accessToken.Value; if (result.Credential != null) { //result.Credential.Token.AccessToken = null; service = new GmailService(new BaseClientService.Initializer { HttpClientInitializer = result.Credential, ApplicationName = "ASP.NET MVC Sample" }); return(true); } else { return(false); } }
/// <summary> /// 3. Create the assignment /// </summary> public async Task <IActionResult> Assign(CancellationToken cancellationToken, CourseWorkModel model) { var appFlow = new AppFlowMetadata(ClientId, ClientSecret, _context); var token = await appFlow.Flow.LoadTokenAsync(model.UserId, cancellationToken); var credential = new UserCredential(appFlow.Flow, model.UserId, token); try { // Create the assignment using (var classroomService = new ClassroomService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "gc2lti" })) { var nonce = CalculateNonce(8); var linkUrl = IsRequestLocal() ? $"{_configuration["Localhost"]}/gc2lti/{nonce}?u={model.Url}&c={model.CourseId}&t={model.Title}" : $"{_configuration["Remotehost"]}/gc2lti/{nonce}?u={model.Url}&c={model.CourseId}&t={model.Title}"; var courseWork = new CourseWork { Title = model.Title, Description = model.Description, MaxPoints = model.MaxPoints, WorkType = "ASSIGNMENT", Materials = new List <Material> { new Material { Link = new Link { Title = model.Title, // The title will be overwritten by Google's thumbnail generator Url = linkUrl } } }, State = "PUBLISHED" }; var createRequest = classroomService.Courses.CourseWork.Create(courseWork, model.CourseId); courseWork = await createRequest.ExecuteAsync(cancellationToken).ConfigureAwait(false); model.CourseWorkId = courseWork.Id; return(RedirectToAction("View", model)); } } catch (Exception e) { return(StatusCode(StatusCodes.Status500InternalServerError, e)); } }
/// <summary> /// function generates the google oauth credentials /// </summary> /// <returns></returns> public Google.Apis.Auth.OAuth2.UserCredential getGoogleOauthCredentials() { Google.Apis.Auth.OAuth2.Responses.TokenResponse responseData = new Google.Apis.Auth.OAuth2.Responses.TokenResponse(); responseData.AccessToken = this.Token; responseData.RefreshToken = this.RefreshToken; GoogleAuthorizationCodeFlow.Initializer myInit = new GoogleAuthorizationCodeFlow.Initializer(); AuthorizationCodeFlow.Initializer codeFlowIntial = myInit; codeFlowIntial.ClientSecrets = new ClientSecrets(); string googleClientId = ConfigurationManager.AppSettings["googleClientId"]; string googleClientSecret = ConfigurationManager.AppSettings["googleClientSecret"]; codeFlowIntial.ClientSecrets.ClientId = googleClientId; codeFlowIntial.ClientSecrets.ClientSecret = googleClientSecret; IAuthorizationCodeFlow myFlow = AppFlowMetadata.getFlow(); Google.Apis.Auth.OAuth2.UserCredential RetValue = new Google.Apis.Auth.OAuth2.UserCredential(myFlow, this.ID, responseData); return(RetValue); }
private async Task <ReadResultResponse> ReadResultAsync(ReadResultRequest arg) { var response = new ReadResultResponse(); var ltiRequest = await Request.ParseLtiRequestAsync(); var signature = ltiRequest.GenerateSignature("secret"); if (!ltiRequest.Signature.Equals(signature)) { response.StatusCode = StatusCodes.Status401Unauthorized; return(response); } // Read the grade from Google Classroom try { var lisResultSourcedId = JsonConvert.DeserializeObject <LisResultSourcedId>(arg.LisResultSourcedId); var googleUser = await Db.GoogleUsers.FindAsync(lisResultSourcedId.TeacherId); var appFlow = new AppFlowMetadata(ClientId, ClientSecret, Db); var token = await appFlow.Flow.LoadTokenAsync(googleUser.UserId, CancellationToken.None); var credential = new UserCredential(appFlow.Flow, googleUser.UserId, token); using (var classroomService = new ClassroomService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "gc2lti" })) { var courseWorkRequest = classroomService.Courses.CourseWork.Get ( lisResultSourcedId.CourseId, lisResultSourcedId.CourseWorkId ); var courseWork = await courseWorkRequest.ExecuteAsync(); var submissionsRequest = classroomService.Courses.CourseWork.StudentSubmissions.List ( lisResultSourcedId.CourseId, lisResultSourcedId.CourseWorkId ); submissionsRequest.UserId = lisResultSourcedId.StudentId; var submissionsResponse = await submissionsRequest.ExecuteAsync(); var submission = submissionsResponse.StudentSubmissions.FirstOrDefault(); if (submission == null) { response.StatusCode = StatusCodes.Status404NotFound; response.StatusDescription = "Submission was found."; } else { response.Result = new Result { SourcedId = arg.LisResultSourcedId, Score = submission.AssignedGrade / courseWork.MaxPoints }; response.StatusDescription = $"Score={response.Result.Score}, AssignedGrade={submission.AssignedGrade}."; } } } catch (Exception) { response.StatusCode = StatusCodes.Status500InternalServerError; } return(response); }
private async Task <ReplaceResultResponse> ReplaceResultAsync(ReplaceResultRequest arg) { // Authenticate the LTI Request var response = new ReplaceResultResponse(); var ltiRequest = await Request.ParseLtiRequestAsync(); var signature = ltiRequest.GenerateSignature("secret"); if (!ltiRequest.Signature.Equals(signature)) { response.StatusCode = StatusCodes.Status401Unauthorized; return(response); } // Lookup the "offline" TokenResponse for the TeacherId var lisResultSourcedId = JsonConvert.DeserializeObject <LisResultSourcedId>(arg.Result.SourcedId); var googleUser = await Db.GoogleUsers.FindAsync(lisResultSourcedId.TeacherId); var appFlow = new AppFlowMetadata(ClientId, ClientSecret, Db); var token = await appFlow.Flow.LoadTokenAsync(googleUser.UserId, CancellationToken.None); // Using the TokenResponse, create a UserCredential for the teacher var credential = new UserCredential(appFlow.Flow, googleUser.UserId, token); // Using the teacher's UserCredential, create an instance of the ClassroomService using (var classroomService = new ClassroomService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "gc2lti" })) { // Using the ClassroomService, get the CourseWork for the assignment var courseWorkRequest = classroomService.Courses.CourseWork.Get ( lisResultSourcedId.CourseId, lisResultSourcedId.CourseWorkId ); var courseWork = await courseWorkRequest.ExecuteAsync(); // Then get the student's StudentSubmission var submissionsRequest = classroomService.Courses.CourseWork.StudentSubmissions.List ( lisResultSourcedId.CourseId, lisResultSourcedId.CourseWorkId ); submissionsRequest.UserId = lisResultSourcedId.StudentId; var submissionsResponse = await submissionsRequest.ExecuteAsync(); if (submissionsResponse.StudentSubmissions == null) { response.StatusCode = StatusCodes.Status404NotFound; response.StatusDescription = "Submission was not found."; return(response); } var submission = submissionsResponse.StudentSubmissions.FirstOrDefault(); // Set the AssignedGrade and DraftGrade if (submission == null) { response.StatusCode = StatusCodes.Status404NotFound; response.StatusDescription = "Submission was not found."; } else { submission.AssignedGrade = arg.Result.Score * courseWork.MaxPoints; submission.DraftGrade = submission.AssignedGrade; var patchRequest = classroomService.Courses.CourseWork.StudentSubmissions.Patch ( submission, submission.CourseId, submission.CourseWorkId, submission.Id ); patchRequest.UpdateMask = "AssignedGrade,DraftGrade"; await patchRequest.ExecuteAsync(); response.StatusDescription = $"Score={arg.Result.Score}, AssignedGrade={submission.AssignedGrade}."; } } return(response); }