Actualización

This commit is contained in:
Xes
2025-04-10 12:24:57 +02:00
parent 8969cc929d
commit 45420b6f0d
39760 changed files with 4303286 additions and 0 deletions

View File

@@ -0,0 +1,455 @@
<?php namespace Certification;
use Carbon\Carbon;
use Firebase\JWT\JWT;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\{
JwksEndpoint,
LtiConstants,
LtiDeployment,
LtiException,
LtiMessageLaunch,
LtiOidcLogin,
LtiRegistration,
};
use Packback\Lti1p3\Interfaces\{
Cache,
Cookie,
Database
};
class TestCache implements Cache
{
private $launchData = [];
private $nonce;
public function getLaunchData($key)
{
return $this->launchData[$key] ?? null;
}
public function cacheLaunchData($key, $jwt_body)
{
$this->launchData[$key] = $jwt_body;
return $this;
}
public function cacheNonce($nonce)
{
$this->nonce = $nonce;
}
public function checkNonce($nonce)
{
return $this->nonce === $nonce;
}
}
class TestCookie implements Cookie
{
private $cookies = [];
public function getCookie($name)
{
return $this->cookies[$name];
}
public function setCookie($name, $value, $exp = 3600, $options = [])
{
$this->cookies[$name] = $value;
return $this;
}
}
class TestDb implements Database
{
private $registrations = [];
private $deplomyments = [];
public function __construct($registration, $deployment)
{
$this->registrations[$registration->getIssuer()] = $registration;
$this->deployments[$deployment->getDeploymentId()] = $deployment;
}
public function findRegistrationByIssuer($iss, $client_id = null)
{
return $this->registrations[$iss];
}
public function findDeployment($iss, $deployment_id, $client_id = null)
{
return $this->deployments[$iss];
}
}
class Lti13CertificationTest extends TestCase
{
const ISSUER_URL = 'https://ltiadvantagevalidator.imsglobal.org';
const JWKS_FILE = '/tmp/jwks.json';
const CERT_DATA_DIR = __DIR__ . '/../data/certification/';
const PRIVATE_KEY = __DIR__.'/../data/private.key';
const STATE = 'state';
private $issuer;
private $key;
public function setUp(): void
{
$this->issuer = [
'id' => 'issuer_id',
'issuer' => static::ISSUER_URL,
'client_id' => 'imstester_3dfad6d',
'auth_login_url' => 'https://ltiadvantagevalidator.imsglobal.org/ltitool/oidcauthurl.html',
'auth_token_url' => 'https://ltiadvantagevalidator.imsglobal.org/ltitool/authcodejwt.html',
'alg' => 'RS256',
'key_set_url' => static::JWKS_FILE,
'kid' => 'key-id',
'tool_private_key' => file_get_contents(static::PRIVATE_KEY)
];
$this->key = [
'version' => LtiConstants::V1_3,
'issuer_id' => $this->issuer['id'],
'deployment_id' => 'testdeploy',
'campus_id' => 1
];
$this->payload = [
LtiConstants::MESSAGE_TYPE => 'LtiResourceLinkRequest',
LtiConstants::VERSION => LtiConstants::V1_3,
LtiConstants::RESOURCE_LINK => [
'id' => 'd3a2504bba5184799a38f141e8df2335cfa8206d',
'description' => NULL,
'title' => NULL,
'validation_context' => NULL,
'errors' => [
'errors' => [],
],
],
'aud' => $this->issuer['client_id'],
'azp' => $this->issuer['client_id'],
LtiConstants::DEPLOYMENT_ID => $this->key['deployment_id'],
'exp' => Carbon::now()->addDay()->timestamp,
'iat' => Carbon::now()->subDay()->timestamp,
'iss' => $this->issuer['issuer'],
'nonce' => 'nonce-5e73ef2f4c6ea0.93530902',
'sub' => '66b6a854-9f43-4bb2-90e8-6653c9126272',
LtiConstants::TARGET_LINK_URI => 'https://lms-api.packback.localhost/api/lti/launch',
LtiConstants::CONTEXT => [
'id' => 'd3a2504bba5184799a38f141e8df2335cfa8206d',
'label' => 'Canvas Unlauched',
'title' => 'Canvas - A Fresh Course That Remains Unlaunched',
'type' => [
LtiConstants::COURSE_OFFERING,
],
'validation_context' => NULL,
'errors' => [
'errors' => [],
],
],
LtiConstants::TOOL_PLATFORM => [
'guid' => 'FnwyPrXqSxwv8QCm11UwILpDJMAUPJ9WGn8zcvBM:canvas-lms',
'name' => 'Packback Engineering',
'version' => 'cloud',
'product_family_code' => 'canvas',
'validation_context' => NULL,
'errors' => [
'errors' => [],
],
],
LtiConstants::LAUNCH_PRESENTATION => [
'document_target' => 'iframe',
'height' => 400,
'width' => 800,
'return_url' => 'https://canvas.localhost/courses/3/external_content/success/external_tool_redirect',
'locale' => 'en',
'validation_context' => NULL,
'errors' => [
'errors' => [],
],
],
'locale' => 'en',
LtiConstants::ROLES => [
LtiConstants::INSTITUTION_ADMINISTRATOR,
LtiConstants::INSTITUTION_INSTRUCTOR,
LtiConstants::MEMBERSHIP_INSTRUCTOR,
LtiConstants::SYSTEM_SYSADMIN,
LtiConstants::SYSTEM_USER,
],
LtiConstants::CUSTOM => [],
'errors' => [
'errors' => [],
],
];
$this->db = new TestDb(
new LtiRegistration([
'issuer' => static::ISSUER_URL,
'clientId' => $this->issuer['client_id'],
'keySetUrl' => static::JWKS_FILE
]),
(new LtiDeployment)->setDeploymentId(static::ISSUER_URL)
);
$this->cache = new TestCache;
$this->cookie = new TestCookie;
$this->cookie->setCookie(
LtiOidcLogin::COOKIE_PREFIX . static::STATE,
static::STATE
);
}
private function login($loginData = null)
{
$loginData = $loginData ?? [
'iss' => $this->issuer['issuer'],
'login_hint' => '535fa085f22b4655f48cd5a36a9215f64c062838'
];
$loginData['client_id'] = $this->issuer['client_id'];
}
public function buildJWT($data, $header)
{
$jwks = json_encode(JwksEndpoint::new([
$this->issuer['kid'] => $this->issuer['tool_private_key']
])->getPublicJwks());
file_put_contents(static::JWKS_FILE, $jwks);
// If we pass in a header, use that instead of creating one automatically based on params given
if ($header) {
$segments = [];
$segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($header));
$segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($data));
$signing_input = \implode('.', $segments);
$signature = JWT::sign($signing_input, $this->issuer['tool_private_key'], $this->issuer['alg']);
$segments[] = JWT::urlsafeB64Encode($signature);
return \implode('.', $segments);
}
return JWT::encode($data, $this->issuer['tool_private_key'], $alg, $this->issuer['kid']);
}
private function launch($payload)
{
$jwt = $this->buildJWT($payload, $this->issuer);
if (isset($payload['nonce'])) {
$this->cache->cacheNonce($payload['nonce']);
}
$params = [
'utf8' => '✓',
'id_token' => $jwt,
'state' => static::STATE,
];
return LtiMessageLaunch::new($this->db, $this->cache, $this->cookie)
->validate($params);
}
// tests
public function testLtiVersionPassedIsNot13()
{
$payload = $this->payload;
$payload[LtiConstants::VERSION] = 'not-1.3';
$this->expectExceptionMessage('Incorrect version, expected 1.3.0');
$this->launch($payload);
}
public function testNoLtiVersionPassedIsInJwt()
{
$payload = $this->payload;
unset($payload[LtiConstants::VERSION]);
$this->expectExceptionMessage('Missing LTI Version');
$this->launch($payload);
}
public function testJwtPassedIsNotLti13Jwt()
{
$jwt = $this->buildJWT([], $this->issuer);
$jwt_r = explode('.', $jwt);
array_pop($jwt_r);
$jwt = implode('.', $jwt_r);
$params = [
'utf8' => '✓',
'id_token' => $jwt,
'state' => static::STATE,
];
$this->expectExceptionMessage('Invalid id_token, JWT must contain 3 parts');
LtiMessageLaunch::new($this->db, $this->cache, $this->cookie)
->validate($params);
}
public function testExpAndIatFieldsInvalid()
{
$payload = $this->payload;
$payload['exp'] = Carbon::now()->subYear()->timestamp;
$payload['iat'] = Carbon::now()->subYear()->timestamp;
$this->expectExceptionMessage('Invalid signature on id_token');
$this->launch($payload);
}
public function testMessageTypeClaimMissing()
{
$payload = $this->payload;
unset($payload[LtiConstants::MESSAGE_TYPE]);
$this->expectExceptionMessage('Invalid message type');
$this->launch($payload);
}
public function testRoleClaimMissing()
{
$payload = $this->payload;
unset($payload[LtiConstants::ROLES]);
$this->expectExceptionMessage('Missing Roles Claim');
$this->launch($payload);
}
public function testDeploymentIdClaimMissing()
{
$payload = $this->payload;
unset($payload[LtiConstants::DEPLOYMENT_ID]);
$this->expectExceptionMessage('No deployment ID was specified');
$this->launch($payload);
}
public function testLaunchWithMissingResourceLinkId()
{
$payload = $this->payload;
unset($payload['sub']);
$this->expectExceptionMessage('Must have a user (sub)');
$this->launch($payload);
}
public function testInvalidCertificationCases()
{
$testCasesDir = static::CERT_DATA_DIR . 'invalid';
$testCases = scandir($testCasesDir);
// Remove . and ..
array_shift($testCases);
array_shift($testCases);
$casesCount = count($testCases);
$testedCases = 0;
foreach ($testCases as $testCase) {
$testCaseDir = $testCasesDir . DIRECTORY_SEPARATOR . $testCase . DIRECTORY_SEPARATOR;
$jwtHeader = null;
if (file_exists($testCaseDir . 'header.json')) {
$jwtHeader = json_decode(
file_get_contents($testCaseDir . 'header.json'),
true
);
}
$payload = json_decode(
file_get_contents($testCaseDir . 'payload.json'),
true
);
$keep = null;
if (file_exists($testCaseDir . 'keep.json')) {
$keep = json_decode(
file_get_contents($testCaseDir . 'keep.json'),
true
);
}
if (!$keep || !in_array('exp', $keep, true)) {
$payload['exp'] = Carbon::now()->addDay()->timestamp;
}
if (!$keep || !in_array('iat', $keep, true)) {
$payload['iat'] = Carbon::now()->subDay()->timestamp;
}
// I couldn't find a better output function
echo PHP_EOL."--> TESTING INVALID TEST CASE: $testCase";
$jwt = $this->buildJWT($payload, $this->issuer, $jwtHeader);
if (isset($payload['nonce'])) {
$this->cache->cacheNonce($payload['nonce']);
}
$params = [
'utf8' => '✓',
'id_token' => $jwt,
'state' => static::STATE,
];
try {
LtiMessageLaunch::new($this->db, $this->cache, $this->cookie)
->validate($params);
} catch (\Exception $e) {
$this->assertInstanceOf(LtiException::class, $e);
}
$testedCases++;
}
echo PHP_EOL;
$this->assertEquals($casesCount, $testedCases);
}
public function testValidCertificationCases()
{
$testCasesDir = static::CERT_DATA_DIR . 'valid';
$testCases = scandir($testCasesDir);
// Remove . and ..
array_shift($testCases);
array_shift($testCases);
$casesCount = count($testCases);
$testedCases = 0;
foreach ($testCases as $testCase) {
$payload = json_decode(
file_get_contents($testCasesDir . DIRECTORY_SEPARATOR . $testCase . DIRECTORY_SEPARATOR . 'payload.json'),
true
);
$payload['exp'] = Carbon::now()->addDay()->timestamp;
$payload['iat'] = Carbon::now()->subDay()->timestamp;
// Set a random context ID to avoid reusing the same LMS Course
$payload[LtiConstants::CONTEXT]['id'] = 'lms-course-id';
// Set a random user ID to avoid reusing the same LmsUser
$payload['sub'] = 'lms-user-id';
// I couldn't find a better output function
echo PHP_EOL."--> TESTING VALID TEST CASE: $testCase";
$jwt = $this->buildJWT($payload, $this->issuer);
$this->cache->cacheNonce($payload['nonce']);
$params = [
'utf8' => '✓',
'id_token' => $jwt,
'state' => static::STATE,
];
$result = LtiMessageLaunch::new($this->db, $this->cache, $this->cookie)
->validate($params);
// Assertions
$this->assertInstanceOf(LtiMessageLaunch::class, $result);
$testedCases++;
}
echo PHP_EOL;
$this->assertEquals($casesCount, $testedCases);
}
}

View File

@@ -0,0 +1,16 @@
<?php namespace Tests\ImsStorage;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\ImsStorage\ImsCache;
class ImsCacheTest extends TestCase
{
public function testItInstantiates()
{
$cache = new ImsCache();
$this->assertInstanceOf(ImsCache::class, $cache);
}
}

View File

@@ -0,0 +1,16 @@
<?php namespace Tests\ImsStorage;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\ImsStorage\ImsCookie;
class ImsCookieTest extends TestCase
{
public function testItInstantiates()
{
$cookie = new ImsCookie();
$this->assertInstanceOf(ImsCookie::class, $cookie);
}
}

View File

@@ -0,0 +1,78 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Mockery;
use Packback\Lti1p3\Interfaces\Database;
use Packback\Lti1p3\Interfaces\LtiRegistrationInterface;
use Packback\Lti1p3\JwksEndpoint;
class JwksEndpointTest extends TestCase
{
public function testItInstantiates()
{
$jwks = new JwksEndpoint([]);
$this->assertInstanceOf(JwksEndpoint::class, $jwks);
}
public function testCreatesANewInstance()
{
$jwks = JwksEndpoint::new([]);
$this->assertInstanceOf(JwksEndpoint::class, $jwks);
}
public function testCreatesANewInstanceFromIssuer()
{
$database = Mockery::mock(Database::class);
$registration = Mockery::mock(LtiRegistrationInterface::class);
$database->shouldReceive('findRegistrationByIssuer')
->once()
->andReturn($registration);
$registration->shouldReceive('getKid')
->once()
->andReturn('kid');
$registration->shouldReceive('getToolPrivateKey')
->once()
->andReturn('private_key');
$jwks = JwksEndpoint::fromIssuer($database, 'issuer');
$this->assertInstanceOf(JwksEndpoint::class, $jwks);
}
public function testCreatesANewInstanceFromRegistration()
{
$registration = Mockery::mock(LtiRegistrationInterface::class);
$registration->shouldReceive('getKid')
->once()
->andReturn('kid');
$registration->shouldReceive('getToolPrivateKey')
->once()
->andReturn('private_key');
$jwks = JwksEndpoint::fromRegistration($registration);
$this->assertInstanceOf(JwksEndpoint::class, $jwks);
}
public function testItGetsJwksForTheProvidedKeys()
{
$jwks = new JwksEndpoint([
'kid' => file_get_contents(__DIR__.'/data/private.key')
]);
$result = $jwks->getPublicJwks();
$this->assertEquals(['keys' => [[
'kty' => 'RSA',
'alg' => 'RS256',
'use' => 'sig',
'e' => 'AQAB',
'n' => '6DzRJzrx0KThi0piO3wdNA3e7-xXly5WJo00CqlKDodtyX6wRT76E4cD57yrr_ZWuaA-6idSFPaEQXw9tCqqTIrS4STIYrlvC0CeEA7m0s2PbI2ffaxv2kofxdmOaUI8YW8NIqNyHMl6Acz1lQOOZ5xSreG5JAqtZpy7AwDdpJo7up9937AD9ZV77qlty6xRKVqOGP1-cH97zMvlQo0EUWUhRAzDlTlCXnbeSjVypET3l93WPT9gnIywt1xX0L6rIJd-4fyU6faaToGN9z4_Q6ay2xFSEJnoNBW9wI886W75vLcVLnT95YKJJwZoKEa9yoV_ZPiTBJcFv1HFPf4ibQ',
'kid' => 'kid',
]]], $result);
}
}

View File

@@ -0,0 +1,24 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Mockery;
use Packback\Lti1p3\Interfaces\LtiServiceConnectorInterface;
use Packback\Lti1p3\LtiAssignmentsGradesService;
class LtiAssignmentsGradesServiceTest extends TestCase
{
public function testItInstantiates()
{
$connector = Mockery::mock(LtiServiceConnectorInterface::class);
$service = new LtiAssignmentsGradesService($connector, []);
$this->assertInstanceOf(LtiAssignmentsGradesService::class, $service);
}
/**
* @todo Test this
*/
}

View File

@@ -0,0 +1,24 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Mockery;
use Packback\Lti1p3\Interfaces\LtiServiceConnectorInterface;
use Packback\Lti1p3\LtiCourseGroupsService;
class LtiCourseGroupsServiceTest extends TestCase
{
public function testItInstantiates()
{
$connector = Mockery::mock(LtiServiceConnectorInterface::class);
$service = new LtiCourseGroupsService($connector, []);
$this->assertInstanceOf(LtiCourseGroupsService::class, $service);
}
/**
* @todo Test this
*/
}

View File

@@ -0,0 +1,171 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Mockery;
use Packback\Lti1p3\LtiLineitem;
use Packback\Lti1p3\LtiDeepLinkResource;
class LtiDeepLinkResourceTest extends TestCase
{
public function setUp(): void
{
$this->deepLinkResource = new LtiDeepLinkResource();
}
public function testItInstantiates()
{
$this->assertInstanceOf(LtiDeepLinkResource::class, $this->deepLinkResource);
}
public function testItCreatesANewInstance()
{
$deepLinkResource = LtiDeepLinkResource::new();
$this->assertInstanceOf(LtiDeepLinkResource::class, $deepLinkResource);
}
public function testItGetsType()
{
$result = $this->deepLinkResource->getType();
$this->assertEquals('ltiResourceLink', $result);
}
public function testItSetsType()
{
$expected = 'expected';
$this->deepLinkResource->setType($expected);
$this->assertEquals($expected, $this->deepLinkResource->getType());
}
public function testItGetsTitle()
{
$result = $this->deepLinkResource->getTitle();
$this->assertNull($result);
}
public function testItSetsTitle()
{
$expected = 'expected';
$this->deepLinkResource->setTitle($expected);
$this->assertEquals($expected, $this->deepLinkResource->getTitle());
}
public function testItGetsText()
{
$result = $this->deepLinkResource->getText();
$this->assertNull($result);
}
public function testItSetsText()
{
$expected = 'expected';
$this->deepLinkResource->setText($expected);
$this->assertEquals($expected, $this->deepLinkResource->getText());
}
public function testItGetsUrl()
{
$result = $this->deepLinkResource->getUrl();
$this->assertNull($result);
}
public function testItSetsUrl()
{
$expected = 'expected';
$this->deepLinkResource->setUrl($expected);
$this->assertEquals($expected, $this->deepLinkResource->getUrl());
}
public function testItGetsLineitem()
{
$result = $this->deepLinkResource->getLineitem();
$this->assertNull($result);
}
public function testItSetsLineitem()
{
$expected = Mockery::mock(LtiLineitem::class);
$this->deepLinkResource->setLineitem($expected);
$this->assertEquals($expected, $this->deepLinkResource->getLineitem());
}
public function testItGetsCustomParams()
{
$result = $this->deepLinkResource->getCustomParams();
$this->assertEquals([], $result);
}
public function testItSetsCustomParams()
{
$expected = 'expected';
$this->deepLinkResource->setCustomParams($expected);
$this->assertEquals($expected, $this->deepLinkResource->getCustomParams());
}
public function testItGetsTarget()
{
$result = $this->deepLinkResource->getTarget();
$this->assertEquals('iframe', $result);
}
public function testItSetsTarget()
{
$expected = 'expected';
$this->deepLinkResource->setTarget($expected);
$this->assertEquals($expected, $this->deepLinkResource->getTarget());
}
public function testItCastsToArray()
{
$expected = [
"type" => 'ltiResourceLink',
"title" => 'a_title',
"text" => 'a_text',
"url" => 'a_url',
"presentation" => [
"documentTarget" => 'iframe',
],
"custom" => [],
"lineItem" => [
"scoreMaximum" => 80,
"label" => 'lineitem_label',
]
];
$lineitem = Mockery::mock(LtiLineitem::class);
$lineitem->shouldReceive('getScoreMaximum')
->once()->andReturn($expected['lineItem']['scoreMaximum']);
$lineitem->shouldReceive('getLabel')
->once()->andReturn($expected['lineItem']['label']);
$this->deepLinkResource->setTitle($expected['title']);
$this->deepLinkResource->setText($expected['text']);
$this->deepLinkResource->setUrl($expected['url']);
$this->deepLinkResource->setLineitem($lineitem);
$result = $this->deepLinkResource->toArray();
$this->assertEquals($expected, $result);
}
}

View File

@@ -0,0 +1,50 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Mockery;
use Packback\Lti1p3\Interfaces\LtiRegistrationInterface;
use Packback\Lti1p3\LtiDeepLink;
use Packback\Lti1p3\Nonce;
class LtiDeepLinkTest extends TestCase
{
public function testItInstantiates()
{
$registration = Mockery::mock(LtiRegistrationInterface::class);
$deepLink = new LtiDeepLink($registration, 'test', []);
$this->assertInstanceOf(LtiDeepLink::class, $deepLink);
}
/**
* @todo Figure out how to test this
*/
// public function testItGetsJwtResponse()
// {
// $registration = Mockery::mock(LtiRegistrationInterface::class);
// $registration->shouldReceive('getClientId')
// ->once()->andReturn('client_id');
// $registration->shouldReceive('getIssuer')
// ->once()->andReturn('issuer');
// $registration->shouldReceive('getToolPrivateKey')
// ->once()->andReturn(file_get_contents(__DIR__.'/data/private.key'));
// $registration->shouldReceive('getKid')
// ->once()->andReturn('kid');
// $deepLink = new LtiDeepLink($registration, 'deployment_id', [
// 'data' => 'test_data'
// ]);
// $resource = Mockery::mock();
// $resource->shouldReceive('toArray')
// ->once()->andReturn(['resource']);
// $result = $deepLink->getResponseJwt([ $resource ]);
// $expected = '';
// $this->assertEquals(
// $expected,
// $result
// );
// }
}

View File

@@ -0,0 +1,36 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\LtiDeployment;
class LtiDeploymentTest extends TestCase
{
public function setUp(): void
{
$this->deployment = new LtiDeployment;
}
public function testItInstantiates()
{
$this->assertInstanceOf(LtiDeployment::class, $this->deployment);
}
public function testItGetsDeploymentId()
{
$result = $this->deployment->getDeploymentId();
$this->assertNull($result);
}
public function testItSetsDeploymentId()
{
$expected = 'expected';
$this->deployment->setDeploymentId($expected);
$this->assertEquals($expected, $this->deployment->getDeploymentId());
}
}

View File

@@ -0,0 +1,113 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\LtiGradeSubmissionReview;
class LtiGradeSubmissionReviewTest extends TestCase
{
public function setUp(): void
{
$this->gradeReview = new LtiGradeSubmissionReview;
}
public function testItInstantiates()
{
$this->assertInstanceOf(LtiGradeSubmissionReview::class, $this->gradeReview);
}
public function testItGetsReviewableStatus()
{
$expected = 'ReviewableStatus';
$gradeReview = new LtiGradeSubmissionReview(['reviewableStatus' => 'ReviewableStatus']);
$result = $gradeReview->getReviewableStatus();
$this->assertEquals($expected, $result);
}
public function testItSetsReviewableStatus()
{
$expected = 'expected';
$this->gradeReview->setReviewableStatus($expected);
$this->assertEquals($expected, $this->gradeReview->getReviewableStatus());
}
public function testItGetsLabel()
{
$expected = 'Label';
$gradeReview = new LtiGradeSubmissionReview(['label' => 'Label']);
$result = $gradeReview->getLabel();
$this->assertEquals($expected, $result);
}
public function testItSetsLabel()
{
$expected = 'expected';
$this->gradeReview->setLabel($expected);
$this->assertEquals($expected, $this->gradeReview->getLabel());
}
public function testItGetsUrl()
{
$expected = 'Url';
$gradeReview = new LtiGradeSubmissionReview(['url' => 'Url']);
$result = $gradeReview->getUrl();
$this->assertEquals($expected, $result);
}
public function testItSetsUrl()
{
$expected = 'expected';
$this->gradeReview->setUrl($expected);
$this->assertEquals($expected, $this->gradeReview->getUrl());
}
public function testItGetsCustom()
{
$expected = 'Custom';
$gradeReview = new LtiGradeSubmissionReview(['custom' => 'Custom']);
$result = $gradeReview->getCustom();
$this->assertEquals($expected, $result);
}
public function testItSetsCustom()
{
$expected = 'expected';
$this->gradeReview->setCustom($expected);
$this->assertEquals($expected, $this->gradeReview->getCustom());
}
public function testItCastsFullObjectToString()
{
$expected = [
'reviewableStatus' => 'ReviewableStatus',
'label' => 'Label',
'url' => 'Url',
'custom' => 'Custom',
];
$gradeReview = new LtiGradeSubmissionReview($expected);
$this->assertEquals(json_encode($expected), (string) $gradeReview);
}
public function testItCastsEmptyObjectToString()
{
$this->assertEquals('[]', (string) $this->gradeReview);
}
}

View File

@@ -0,0 +1,220 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\LtiGrade;
class LtiGradeTest extends TestCase
{
public function setUp(): void
{
$this->grade = new LtiGrade;
}
public function testItInstantiates()
{
$this->assertInstanceOf(LtiGrade::class, $this->grade);
}
public function testItCreatesANewInstance()
{
$grade = LtiGrade::new();
$this->assertInstanceOf(LtiGrade::class, $grade);
}
public function testItGetsScoreGiven()
{
$expected = 'expected';
$grade = new LtiGrade([ 'scoreGiven' => $expected ]);
$result = $grade->getScoreGiven();
$this->assertEquals($expected, $result);
}
public function testItSetsScoreGiven()
{
$expected = 'expected';
$this->grade->setScoreGiven($expected);
$this->assertEquals($expected, $this->grade->getScoreGiven());
}
public function testItGetsScoreMaximum()
{
$expected = 'expected';
$grade = new LtiGrade([ 'scoreMaximum' => $expected ]);
$result = $grade->getScoreMaximum();
$this->assertEquals($expected, $result);
}
public function testItSetsScoreMaximum()
{
$expected = 'expected';
$this->grade->setScoreMaximum($expected);
$this->assertEquals($expected, $this->grade->getScoreMaximum());
}
public function testItGetsComment()
{
$expected = 'expected';
$grade = new LtiGrade([ 'comment' => $expected ]);
$result = $grade->getComment();
$this->assertEquals($expected, $result);
}
public function testItSetsComment()
{
$expected = 'expected';
$this->grade->setComment($expected);
$this->assertEquals($expected, $this->grade->getComment());
}
public function testItGetsActivityProgress()
{
$expected = 'expected';
$grade = new LtiGrade([ 'activityProgress' => $expected ]);
$result = $grade->getActivityProgress();
$this->assertEquals($expected, $result);
}
public function testItSetsActivityProgress()
{
$expected = 'expected';
$this->grade->setActivityProgress($expected);
$this->assertEquals($expected, $this->grade->getActivityProgress());
}
public function testItGetsGradingProgress()
{
$expected = 'expected';
$grade = new LtiGrade([ 'gradingProgress' => $expected ]);
$result = $grade->getGradingProgress();
$this->assertEquals($expected, $result);
}
public function testItSetsGradingProgress()
{
$expected = 'expected';
$this->grade->setGradingProgress($expected);
$this->assertEquals($expected, $this->grade->getGradingProgress());
}
public function testItGetsTimestamp()
{
$expected = 'expected';
$grade = new LtiGrade([ 'timestamp' => $expected ]);
$result = $grade->getTimestamp();
$this->assertEquals($expected, $result);
}
public function testItSetsTimestamp()
{
$expected = 'expected';
$this->grade->setTimestamp($expected);
$this->assertEquals($expected, $this->grade->getTimestamp());
}
public function testItGetsUserId()
{
$expected = 'expected';
$grade = new LtiGrade([ 'userId' => $expected ]);
$result = $grade->getUserId();
$this->assertEquals($expected, $result);
}
public function testItSetsUserId()
{
$expected = 'expected';
$this->grade->setUserId($expected);
$this->assertEquals($expected, $this->grade->getUserId());
}
public function testItGetsSubmissionReview()
{
$expected = 'expected';
$grade = new LtiGrade([ 'submissionReview' => $expected ]);
$result = $grade->getSubmissionReview();
$this->assertEquals($expected, $result);
}
public function testItSetsSubmissionReview()
{
$expected = 'expected';
$this->grade->setSubmissionReview($expected);
$this->assertEquals($expected, $this->grade->getSubmissionReview());
}
public function testItGetsCanvasExtension()
{
$expected = 'expected';
$grade = new LtiGrade([ 'https://canvas.instructure.com/lti/submission' => $expected ]);
$result = $grade->getCanvasExtension();
$this->assertEquals($expected, $result);
}
public function testItSetsCanvasExtension()
{
$expected = 'expected';
$this->grade->setCanvasExtension($expected);
$this->assertEquals($expected, $this->grade->getCanvasExtension());
}
public function testItCastsFullObjectToString()
{
$expected = [
'scoreGiven' => 5,
'scoreMaximum' => 10,
'comment' => 'Comment',
'activityProgress' => 'ActivityProgress',
'gradingProgress' => 'GradingProgress',
'timestamp' => 'Timestamp',
'userId' => 'UserId',
'submissionReview' => 'SubmissionReview',
'https://canvas.instructure.com/lti/submission' => 'CanvasExtension'
];
$grade = new LtiGrade($expected);
$this->assertEquals(json_encode($expected), (string) $grade);
}
public function testItCastsEmptyObjectToString()
{
$this->assertEquals('[]', (string) $this->grade);
}
}

View File

@@ -0,0 +1,200 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\LtiLineitem;
class LtiLineitemTest extends TestCase
{
public function setUp(): void
{
$this->lineItem = new LtiLineitem;
}
public function testItInstantiates()
{
$this->assertInstanceOf(LtiLineitem::class, $this->lineItem);
}
public function testItCreatesANewInstance()
{
$grade = LtiLineitem::new();
$this->assertInstanceOf(LtiLineitem::class, $grade);
}
public function testItGetsId()
{
$expected = 'expected';
$grade = new LtiLineitem([ 'id' => $expected ]);
$result = $grade->getId();
$this->assertEquals($expected, $result);
}
public function testItSetsId()
{
$expected = 'expected';
$this->lineItem->setId($expected);
$this->assertEquals($expected, $this->lineItem->getId());
}
public function testItGetsScoreMaximum()
{
$expected = 'expected';
$grade = new LtiLineitem([ 'scoreMaximum' => $expected ]);
$result = $grade->getScoreMaximum();
$this->assertEquals($expected, $result);
}
public function testItSetsScoreMaximum()
{
$expected = 'expected';
$this->lineItem->setScoreMaximum($expected);
$this->assertEquals($expected, $this->lineItem->getScoreMaximum());
}
public function testItGetsLabel()
{
$expected = 'expected';
$grade = new LtiLineitem([ 'label' => $expected ]);
$result = $grade->getLabel();
$this->assertEquals($expected, $result);
}
public function testItSetsLabel()
{
$expected = 'expected';
$this->lineItem->setLabel($expected);
$this->assertEquals($expected, $this->lineItem->getLabel());
}
public function testItGetsResourceId()
{
$expected = 'expected';
$grade = new LtiLineitem([ 'resourceId' => $expected ]);
$result = $grade->getResourceId();
$this->assertEquals($expected, $result);
}
public function testItSetsResourceId()
{
$expected = 'expected';
$this->lineItem->setResourceId($expected);
$this->assertEquals($expected, $this->lineItem->getResourceId());
}
public function testItGetsResourceLinkId()
{
$expected = 'expected';
$grade = new LtiLineitem([ 'resourceLinkId' => $expected ]);
$result = $grade->getResourceLinkId();
$this->assertEquals($expected, $result);
}
public function testItSetsResourceLinkId()
{
$expected = 'expected';
$this->lineItem->setResourceLinkId($expected);
$this->assertEquals($expected, $this->lineItem->getResourceLinkId());
}
public function testItGetsTag()
{
$expected = 'expected';
$grade = new LtiLineitem([ 'tag' => $expected ]);
$result = $grade->getTag();
$this->assertEquals($expected, $result);
}
public function testItSetsTag()
{
$expected = 'expected';
$this->lineItem->setTag($expected);
$this->assertEquals($expected, $this->lineItem->getTag());
}
public function testItGetsStartDateTime()
{
$expected = 'expected';
$grade = new LtiLineitem([ 'startDateTime' => $expected ]);
$result = $grade->getStartDateTime();
$this->assertEquals($expected, $result);
}
public function testItSetsStartDateTime()
{
$expected = 'expected';
$this->lineItem->setStartDateTime($expected);
$this->assertEquals($expected, $this->lineItem->getStartDateTime());
}
public function testItGetsEndDateTime()
{
$expected = 'expected';
$grade = new LtiLineitem([ 'endDateTime' => $expected ]);
$result = $grade->getEndDateTime();
$this->assertEquals($expected, $result);
}
public function testItSetsEndDateTime()
{
$expected = 'expected';
$this->lineItem->setEndDateTime($expected);
$this->assertEquals($expected, $this->lineItem->getEndDateTime());
}
public function testItCastsFullObjectToString()
{
$expected = [
'id' => 'Id',
'scoreMaximum' => 'ScoreMaximum',
'label' => 'Label',
'resourceId' => 'ResourceId',
'tag' => 'Tag',
'startDateTime' => 'StartDateTime',
'endDateTime' => 'EndDateTime',
];
$lineItem = new LtiLineitem($expected);
$this->assertEquals(json_encode($expected), (string) $lineItem);
}
public function testItCastsEmptyObjectToString()
{
$this->assertEquals('[]', (string) $this->lineItem);
}
}

View File

@@ -0,0 +1,45 @@
<?php namespace Tests;
use Mockery;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\Interfaces\Cache;
use Packback\Lti1p3\Interfaces\Cookie;
use Packback\Lti1p3\Interfaces\Database;
use Packback\Lti1p3\LtiMessageLaunch;
class LtiMessageLaunchTest extends TestCase
{
public function setUp(): void
{
$this->cache = Mockery::mock(Cache::class);
$this->cookie = Mockery::mock(Cookie::class);
$this->database = Mockery::mock(Database::class);
$this->messageLaunch = new LtiMessageLaunch(
$this->database,
$this->cache,
$this->cookie
);
}
public function testItInstantiates()
{
$this->assertInstanceOf(LtiMessageLaunch::class, $this->messageLaunch);
}
public function testItCreatesANewInstance()
{
$messageLaunch = LtiMessageLaunch::new(
$this->database,
$this->cache,
$this->cookie
);
$this->assertInstanceOf(LtiMessageLaunch::class, $messageLaunch);
}
/**
* @todo Finish testing
*/
}

View File

@@ -0,0 +1,66 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Mockery;
use Packback\Lti1p3\Interfaces\LtiServiceConnectorInterface;
use Packback\Lti1p3\LtiNamesRolesProvisioningService;
class LtiNamesRolesProvisioningServiceTest extends TestCase
{
public function setUp(): void
{
$this->connector = Mockery::mock(LtiServiceConnectorInterface::class);
}
public function testItInstantiates()
{
$nrps = new LtiNamesRolesProvisioningService($this->connector, []);
$this->assertInstanceOf(LtiNamesRolesProvisioningService::class, $nrps);
}
public function testItGetsMembers()
{
$expected = [ 'members' ];
$nrps = new LtiNamesRolesProvisioningService($this->connector, [
'context_memberships_url' => 'url'
]);
$this->connector->shouldReceive('makeServiceRequest')
->once()->andReturn([
'headers' => [],
'body' => [ 'members' => $expected ]
]);
$result = $nrps->getMembers();
$this->assertEquals($expected, $result);
}
public function testItGetsMembersIteratively()
{
$response = [ 'members' ];
$expected = array_merge($response, $response);
$nrps = new LtiNamesRolesProvisioningService($this->connector, [
'context_memberships_url' => 'url'
]);
// First response
$this->connector->shouldReceive('makeServiceRequest')
->once()->andReturn([
'headers' => [ 'Link:Something<else>;rel="next"' ],
'body' => [ 'members' => $response ]
]);
// Second response
$this->connector->shouldReceive('makeServiceRequest')
->once()->andReturn([
'headers' => [],
'body' => [ 'members' => $response ]
]);
$result = $nrps->getMembers();
$this->assertEquals($expected, $result);
}
}

View File

@@ -0,0 +1,105 @@
<?php namespace Tests;
use Mockery;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\Interfaces\Cache;
use Packback\Lti1p3\Interfaces\Cookie;
use Packback\Lti1p3\Interfaces\Database;
use Packback\Lti1p3\LtiOidcLogin;
use Packback\Lti1p3\OidcException;
class LtiOidcLoginTest extends TestCase
{
public function setUp(): void
{
$this->cache = Mockery::mock(Cache::class);
$this->cookie = Mockery::mock(Cookie::class);
$this->database = Mockery::mock(Database::class);
$this->oidcLogin = new LtiOidcLogin(
$this->database,
$this->cache,
$this->cookie
);
}
public function testItInstantiates()
{
$this->assertInstanceOf(LtiOidcLogin::class, $this->oidcLogin);
}
public function testItCreatesANewInstance()
{
$oidcLogin = LtiOidcLogin::new(
$this->database,
$this->cache,
$this->cookie
);
$this->assertInstanceOf(LtiOidcLogin::class, $this->oidcLogin);
}
public function testItValidatesARequest()
{
$expected = 'expected';
$request = [
'iss' => 'Issuer',
'login_hint' => 'LoginHint',
'client_id' => 'ClientId'
];
$this->database->shouldReceive('findRegistrationByIssuer')
->once()->with($request['iss'], $request['client_id'])
->andReturn($expected);
$result = $this->oidcLogin->validateOidcLogin($request);
$this->assertEquals($expected, $result);
}
public function testValidatesFailsIfIssuerIsNotSet()
{
$request = [
'login_hint' => 'LoginHint',
'client_id' => 'ClientId'
];
$this->expectException(OidcException::class);
$this->expectExceptionMessage(LtiOidcLogin::ERROR_MSG_ISSUER);
$this->oidcLogin->validateOidcLogin($request);
}
public function testValidatesFailsIfLoginHintIsNotSet()
{
$request = [
'iss' => 'Issuer',
'client_id' => 'ClientId'
];
$this->expectException(OidcException::class);
$this->expectExceptionMessage(LtiOidcLogin::ERROR_MSG_LOGIN_HINT);
$this->oidcLogin->validateOidcLogin($request);
}
public function testValidatesFailsIfRegistrationNotFound()
{
$request = [
'iss' => 'Issuer',
'login_hint' => 'LoginHint',
];
$this->database->shouldReceive('findRegistrationByIssuer')
->once()->andReturn(null);
$this->expectException(OidcException::class);
$this->expectExceptionMessage(LtiOidcLogin::ERROR_MSG_REGISTRATION);
$this->oidcLogin->validateOidcLogin($request);
}
/**
* @todo Finish testing
*/
}

View File

@@ -0,0 +1,190 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\LtiRegistration;
class LtiRegistrationTest extends TestCase
{
public function setUp(): void
{
$this->registration = new LtiRegistration;
}
public function testItInstantiates()
{
$this->assertInstanceOf(LtiRegistration::class, $this->registration);
}
public function testItCreatesANewInstance()
{
$registration = LtiRegistration::new();
$this->assertInstanceOf(LtiRegistration::class, $registration);
}
public function testItGetsIssuer()
{
$expected = 'expected';
$registration = new LtiRegistration([ 'issuer' => $expected ]);
$result = $registration->getIssuer();
$this->assertEquals($expected, $result);
}
public function testItSetsIssuer()
{
$expected = 'expected';
$this->registration->setIssuer($expected);
$this->assertEquals($expected, $this->registration->getIssuer());
}
public function testItGetsClientId()
{
$expected = 'expected';
$registration = new LtiRegistration([ 'clientId' => $expected ]);
$result = $registration->getClientId();
$this->assertEquals($expected, $result);
}
public function testItSetsClientId()
{
$expected = 'expected';
$this->registration->setClientId($expected);
$this->assertEquals($expected, $this->registration->getClientId());
}
public function testItGetsKeySetUrl()
{
$expected = 'expected';
$registration = new LtiRegistration([ 'keySetUrl' => $expected ]);
$result = $registration->getKeySetUrl();
$this->assertEquals($expected, $result);
}
public function testItSetsKeySetUrl()
{
$expected = 'expected';
$this->registration->setKeySetUrl($expected);
$this->assertEquals($expected, $this->registration->getKeySetUrl());
}
public function testItGetsAuthTokenUrl()
{
$expected = 'expected';
$registration = new LtiRegistration([ 'authTokenUrl' => $expected ]);
$result = $registration->getAuthTokenUrl();
$this->assertEquals($expected, $result);
}
public function testItSetsAuthTokenUrl()
{
$expected = 'expected';
$this->registration->setAuthTokenUrl($expected);
$this->assertEquals($expected, $this->registration->getAuthTokenUrl());
}
public function testItGetsAuthLoginUrl()
{
$expected = 'expected';
$registration = new LtiRegistration([ 'authLoginUrl' => $expected ]);
$result = $registration->getAuthLoginUrl();
$this->assertEquals($expected, $result);
}
public function testItSetsAuthLoginUrl()
{
$expected = 'expected';
$this->registration->setAuthLoginUrl($expected);
$this->assertEquals($expected, $this->registration->getAuthLoginUrl());
}
public function testItGetsAuthServer()
{
$expected = 'expected';
$registration = new LtiRegistration([ 'authServer' => $expected ]);
$result = $registration->getAuthServer();
$this->assertEquals($expected, $result);
}
public function testItSetsAuthServer()
{
$expected = 'expected';
$this->registration->setAuthServer($expected);
$this->assertEquals($expected, $this->registration->getAuthServer());
}
public function testItGetsToolPrivateKey()
{
$expected = 'expected';
$registration = new LtiRegistration([ 'toolPrivateKey' => $expected ]);
$result = $registration->getToolPrivateKey();
$this->assertEquals($expected, $result);
}
public function testItSetsToolPrivateKey()
{
$expected = 'expected';
$this->registration->setToolPrivateKey($expected);
$this->assertEquals($expected, $this->registration->getToolPrivateKey());
}
public function testItGetsKid()
{
$expected = 'expected';
$registration = new LtiRegistration([ 'kid' => $expected ]);
$result = $registration->getKid();
$this->assertEquals($expected, $result);
}
public function testItGetsKidFromIssuerAndClientId()
{
$expected = '39e02c46a08382b7b352b4f1a9d38698b8fe7c8eb74ead609c804b25eeb1db52';
$registration = new LtiRegistration([
'issuer' => 'Issuer',
'client_id' => 'ClientId'
]);
$result = $registration->getKid();
$this->assertEquals($expected, $result);
}
public function testItSetsKid()
{
$expected = 'expected';
$this->registration->setKid($expected);
$this->assertEquals($expected, $this->registration->getKid());
}
}

View File

@@ -0,0 +1,24 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Mockery;
use Packback\Lti1p3\Interfaces\LtiRegistrationInterface;
use Packback\Lti1p3\LtiServiceConnector;
class LtiServiceConnectorTest extends TestCase
{
public function testItInstantiates()
{
$registration = Mockery::mock(LtiRegistrationInterface::class);
$connector = new LtiServiceConnector($registration);
$this->assertInstanceOf(LtiServiceConnector::class, $connector);
}
/**
* @todo Finish testing
*/
}

View File

@@ -0,0 +1,16 @@
<?php namespace Tests\MessageValidators;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\MessageValidators\DeepLinkMessageValidator;
class DeepLinkMessageValidatorTest extends TestCase
{
public function testItInstantiates()
{
$validator = new DeepLinkMessageValidator([]);
$this->assertInstanceOf(DeepLinkMessageValidator::class, $validator);
}
}

View File

@@ -0,0 +1,16 @@
<?php namespace Tests\MessageValidators;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\MessageValidators\ResourceMessageValidator;
class ResourceMessageValidatorTest extends TestCase
{
public function testItInstantiates()
{
$validator = new ResourceMessageValidator([]);
$this->assertInstanceOf(ResourceMessageValidator::class, $validator);
}
}

View File

@@ -0,0 +1,16 @@
<?php namespace Tests\MessageValidators;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\MessageValidators\SubmissionReviewMessageValidator;
class SubmissionReviewMessageValidatorTest extends TestCase
{
public function testItInstantiates()
{
$validator = new SubmissionReviewMessageValidator([]);
$this->assertInstanceOf(SubmissionReviewMessageValidator::class, $validator);
}
}

View File

@@ -0,0 +1,30 @@
<?php namespace Tests;
use PHPUnit\Framework\TestCase;
use Packback\Lti1p3\Redirect;
class RedirectTest extends TestCase
{
public function testItInstantiates()
{
$redirect = new Redirect('test');
$this->assertInstanceOf(Redirect::class, $redirect);
}
public function testItGetsRedirectUrl()
{
$expected = 'expected';
$redirect = new Redirect($expected);
$result = $redirect->getRedirectUrl();
$this->assertEquals($expected, $result);
}
/**
* @todo Finish testing
*/
}

View File

@@ -0,0 +1,4 @@
{
"badtestonly": "12345",
"alg": "RS256"
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574764165,
"iat": 1574763865,
"nonce": "38a686abdea59",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 22222,
"iat": 11111,
"nonce": "c624ec8384a5",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,4 @@
{
"kid": "imstester_66067",
"alg": "RS256"
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574764225,
"iat": 1574763925,
"nonce": "830be2877067",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1 @@
{ "name" : "badltilaunch" }

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574764295,
"iat": 1574763995,
"nonce": "8070d617365e",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "11.3",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,40 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "39890",
"aud": "imstester_3dfad6d",
"exp": 1574779693,
"iat": 1574779393,
"nonce": "7964e46f-2f18-4b4c-96eb-ea5e84a77f3c",
"name": "Lauren Colleen Hutton",
"given_name": "Lauren",
"family_name": "Hutton",
"middle_name": "Colleen",
"email": "l.c.hutton@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor"
],
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,43 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574766613,
"iat": 1574766313,
"nonce": "c41c481bea3b",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,47 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574764678,
"iat": 1574764378,
"nonce": "2b9f4c80f4ae6",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,43 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574765110,
"iat": 1574764810,
"nonce": "c73f563cfe17",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,47 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574766571,
"iat": 1574766271,
"nonce": "15b5502ef6d9b",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,47 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574766462,
"iat": 1574766162,
"nonce": "1344de3bffa6c",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,45 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574766515,
"iat": 1574766215,
"nonce": "3de2defce1635",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "",
"aud": "imstester_3dfad6d",
"exp": 1574766669,
"iat": 1574766369,
"nonce": "3ce31fd612e1c",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,43 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "39890",
"aud": "imstester_3dfad6d",
"exp": 1574779639,
"iat": 1574779339,
"nonce": "2d5be9d404a1c",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,44 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "39890",
"aud": "imstester_3dfad6d",
"exp": 1574779416,
"iat": 1574779116,
"nonce": "1c6160abaa34c",
"email": "l.c.hutton@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,47 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "39890",
"aud": "imstester_3dfad6d",
"exp": 1574779530,
"iat": 1574779230,
"nonce": "12f8f7e8d9343",
"name": "Lauren Colleen Hutton",
"given_name": "Lauren",
"family_name": "Hutton",
"middle_name": "Colleen",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "39890",
"aud": "imstester_3dfad6d",
"exp": 1574779337,
"iat": 1574779037,
"nonce": "80a3e68b2cb5",
"name": "Lauren Colleen Hutton",
"given_name": "Lauren",
"family_name": "Hutton",
"middle_name": "Colleen",
"email": "l.c.hutton@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
""
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,50 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "39890",
"aud": "imstester_3dfad6d",
"exp": 1574778409,
"iat": 1574778109,
"nonce": "9824f85b050f",
"name": "Lauren Colleen Hutton",
"given_name": "Lauren",
"family_name": "Hutton",
"middle_name": "Colleen",
"email": "l.c.hutton@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor",
"http://purl.imsglobal.org/vocab/lis/v2/institution/person#Staff",
"http://purl.imsglobal.org/vocab/lis/v2/institution/person#Other"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "39890",
"aud": "imstester_3dfad6d",
"exp": 1574778959,
"iat": 1574778659,
"nonce": "2cfb292bce9ea",
"name": "Lauren Colleen Hutton",
"given_name": "Lauren",
"family_name": "Hutton",
"middle_name": "Colleen",
"email": "l.c.hutton@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"Instructor"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "39890",
"aud": "imstester_3dfad6d",
"exp": 1574779245,
"iat": 1574778945,
"nonce": "248d630ede7c0",
"name": "Lauren Colleen Hutton",
"given_name": "Lauren",
"family_name": "Hutton",
"middle_name": "Colleen",
"email": "l.c.hutton@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/unknown/unknown#Helper"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "39890",
"aud": "imstester_3dfad6d",
"exp": 1574766741,
"iat": 1574766441,
"nonce": "35d2999e2bcc",
"name": "Lauren Colleen Hutton",
"given_name": "Lauren",
"family_name": "Hutton",
"middle_name": "Colleen",
"email": "l.c.hutton@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "3622bed7314b4f9c8f0e533e158ff797",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1879",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1879/lineitems"
}
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574780231,
"iat": 1574779931,
"nonce": "3d20d137d3cab",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,43 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574780613,
"iat": 1574780313,
"nonce": "82280639-9be0-4527-b43d-5d7637c20849",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "0d0b8a77054343a1901d0db481759e84",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1882",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1882/lineitems"
}
}

View File

@@ -0,0 +1,44 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574780559,
"iat": 1574780259,
"nonce": "5c1192fd-58e8-44e5-a280-8501f442cf5f",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "0d0b8a77054343a1901d0db481759e84",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1882",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1882/lineitems"
}
}

View File

@@ -0,0 +1,47 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574780588,
"iat": 1574780288,
"nonce": "02a07b9d-9b46-4afd-9df7-3463f6fe65cd",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "0d0b8a77054343a1901d0db481759e84",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1882",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1882/lineitems"
}
}

View File

@@ -0,0 +1,43 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574780640,
"iat": 1574780340,
"nonce": "420df5e0-7f4f-4a8c-bec8-0d3fd0579c9c",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "0d0b8a77054343a1901d0db481759e84",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1882",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1882/lineitems"
}
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574780525,
"iat": 1574780225,
"nonce": "23aa93ba-bbcb-460f-ad9f-8a850b39dd90",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
""
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "0d0b8a77054343a1901d0db481759e84",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1882",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1882/lineitems"
}
}

View File

@@ -0,0 +1,50 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574780329,
"iat": 1574780029,
"nonce": "1304be14-fbc2-4b63-a778-72b34669159f",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner",
"http://purl.imsglobal.org/vocab/lis/v2/institution/person#Student",
"http://purl.imsglobal.org/vocab/lis/v2/institution/person#Mentor"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "a7432159070d4c8b981b51dc1eb982db",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1880",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1880/lineitems"
}
}

View File

@@ -0,0 +1,48 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574780453,
"iat": 1574780153,
"nonce": "b2d3f2da-d4fa-42e9-adc7-513e5ed74715",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"Learner"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "0d0b8a77054343a1901d0db481759e84",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1882",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1882/lineitems"
}
}

View File

@@ -0,0 +1,49 @@
{
"iss": "https://ltiadvantagevalidator.imsglobal.org",
"sub": "40899",
"aud": "imstester_3dfad6d",
"exp": 1574780481,
"iat": 1574780181,
"nonce": "834fe0f9-bc3f-4012-9f21-acbd54ca021a",
"name": "Carrie A Lowell",
"given_name": "Carrie",
"family_name": "Lowell",
"middle_name": "A",
"email": "c.lowell@district1.com",
"locale": "en-US",
"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "http://localhost:8080/",
"https://purl.imsglobal.org/spec/lti/claim/deployment_id": "testdeploy",
"https://purl.imsglobal.org/spec/lti/claim/message_type": "LtiResourceLinkRequest",
"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner",
"http://purl.imsglobal.org/vocab/lis/v2/uknownrole/unknown#Unknown"
],
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "8893483",
"label": "Biology 102",
"title": "Bio Adventures",
"type": [
"http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"
]
},
"https://purl.imsglobal.org/spec/lti/claim/resource_link": {
"id": "0d0b8a77054343a1901d0db481759e84",
"title": "Introduction Assignment",
"description": "This is the introduction assignment"
},
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://ltiadvantagevalidator.imsglobal.org/ltitool/namesandroles.html?memberships=1882",
"service_versions": [
"2.0"
]
},
"https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
"scope": [
"https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
"https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
"https://purl.imsglobal.org/spec/lti-ags/scope/score"
],
"lineitems": "https://ltiadvantagevalidator.imsglobal.org/ltitool/rest/assignmentsgrades/1882/lineitems"
}
}

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDoPNEnOvHQpOGL
SmI7fB00Dd7v7FeXLlYmjTQKqUoOh23JfrBFPvoThwPnvKuv9la5oD7qJ1IU9oRB
fD20KqpMitLhJMhiuW8LQJ4QDubSzY9sjZ99rG/aSh/F2Y5pQjxhbw0io3IcyXoB
zPWVA45nnFKt4bkkCq1mnLsDAN2kmju6n33fsAP1lXvuqW3LrFEpWo4Y/X5wf3vM
y+VCjQRRZSFEDMOVOUJedt5KNXKkRPeX3dY9P2CcjLC3XFfQvqsgl37h/JTp9ppO
gY33Pj9DprLbEVIQmeg0Fb3Ajzzpbvm8txUudP3lgoknBmgoRr3KhX9k+JMElwW/
UcU9/iJtAgMBAAECggEBANO831TNQTvhmGHO59EkT9vt6Z0F9rY34QQ1KYWu435r
q4VSpJP93zN+neji9AXyqw+DMtl6EDRcriimhfuGCs7Oo4Xya2DXgI7Z00MA0yLP
mDx4wzlpxnFXs7BHsrf1U+fhwDAcpSXp6/tIS4AZRfThaeBvNMXPllk//KG4YFx5
Jd+nMHOr+TdGAYQDCCIPjFQ3rRR433+ZdTe7IWg/FHFXuCmJdoVLocIJg4rBHjKm
/UkEhKVINtacpHwSKKBUwnFQs9DhCgus0uCstFHl9AETomrefURESqn4u4LPsGjD
wxqV0rRc2Rr64xrfQpS708y6FrBHa1MoHBOTCuN3+gECgYEA96NBy9pWlkY7dAKx
n9RpnqArT1LOdGNc2sgce8Hqyn8E+JQ83dGTSDPXxUOXuJj8k3/8wFIl4DFwuX4m
5tDpJCQGJMd2c70/Ee3XWTR/NqJf09FrSULGF8CgtHEzITVftn1JQqmhu7GT9KfM
QEPkCBZ0pgZk+KneiwJoy5PgqD0CgYEA8BRuUX1/n8f2530r9A7PD3k6wYy/Y3kH
ZNxOyTfU3T5BaGYLmrUSfvU0/iLN8pTosgjb64v3NX+Odxm3QUcjJfZZvGXFY4LJ
SxrHqUR3pdqEhFo5p//lgTbyfmDTivVEX1N51IgeF383j0v51SKZ/joXEpB0bnip
ifC0D6zp1fECgYEAlfzNxziRJSeYruVKzDGNX0RHtx3CagAcp254wgRrvwY77otq
ajebaynrUFFmPap7oKLuZVXcFvQbAF6GFVsHOpqPFguxlNxUrPlPa3o+asriG5tF
zfOho5VKQMAnZb+8Hv23N6cijFo78P0I2wvDu5pOQJiy42GPpsZozpTch0kCgYBh
bpk63yi9SqTsW4NL//qOeA+dXyaJEyQqDbK3vL3ZsBtRaCCLf7Lq7U69WJimO0KY
hjniRSJlhsflk/0oM9uS24Cdkdviv8A7h7nB+zRnjeA76nX9tT+KCietnFQdz94Y
pcMKutcjiBCfSiExG2LNpvuYICHwd22uuo4I0o7vsQKBgQDexwa/iM+ZStTFqbc1
ES4a0F+LAccVzTnqs156hHbvl3DEPstkn6YbeCRttdP0HYGst8kL1SbGiCnT3QDr
w0uJyJvV6cQ+kTIUj+Z/565rqknqmF4PUdN2zM6m7abNf8AoEvxDk+htG7ZDCvSH
ikLoBvdctqsEWGB4SAGpZF45qw==
-----END PRIVATE KEY-----