TinCanJS
TinCanJS copied to clipboard
Need access to original statement from HTTP response
I am creating/consuming signed statements. I would like to be able to get at the original string of the statement in a multi-part response. In LRS.js line 237, you could pass parameters to indicate you would like to keep the original statement object (minus the content
attribute in the attachment). Or you could assign the originalJSON
to JSON.parse(parsedResponse[0].body)
after you created the statement. Either way, is there a reason not to set the original string of the statement from the response? I'm wanting it so I can verify/validate the JWS in the attachment, and then provide that to another LRS (exporting it so to speak). Thoughts on this export process that would be better?
I think I just saw the answer to this in another issue. I should be using the statement.asVersion("1.0.0")
method (for example) to get the statement.
I don't know of one, but having said that you shouldn't need it to accomplish your goal. You can access the individual objects themselves, or as you've found use the serialized versions via the asVersion
methods. Verifying the JWS has to go beyond regular string comparison as JSON isn't ordered, and there are properties that can be ignored because they don't pertain to the statement's semantics.
@brianjmiller Thanks for the response. The use case I'm trying to address is to export xAPI statements either to another LRS, or provide the signed statement standalone. I could use the TinCanJS module to connect to and save in a different LRS, but if I wanted to save the signed statement standalone in some other long term storage strategy, would the raw multi-part response work in your opinion? Here is an example:
Content-Length:1886
Content-Type:application/json; charset=UTF-8
{"id":"7a3940c1-6d66-4328-9ad3-0d5b2b077f66","actor":{"objectType":"Agent","account":{"homePage":"http://byu.edu/","name":"123456789"}},"verb":{"id":"http://byu.edu/expapi/verbs/completed","display":{"en-US":"completed"}},"result":{"extensions":{"http://byu.edu/expapi/extensions/grade":"A-"}},"context":{"contextActivities":{"category":[{"id":"http://byu.edu/expapi/ces","objectType":"Activity"}]}},"timestamp":"2017-09-18T20:46:08.076Z","stored":"2017-09-18T20:46:08.547Z","authority":{"objectType":"Agent","mbox":"mailto:[email protected]","name":"Matthew Hailstone"},"version":"1.0.0","attachments":[{"usageType":"http://adlnet.gov/expapi/attachments/signature","display":{"en-US":"Signature"},"description":{"en-US":"Course Completed Signature"},"contentType":"application/octet-stream","length":4661,"sha2":"071af7ed9305009d3bbf2b5fffc1eadfc4730a611554595fad3f205c27597eb5"}],"object":{"id":"http://api.byu.edu/classes/20175,06387,001,001","definition":{"extensions":{"http://byu.edu/expapi/extensions/title_code":"001","http://byu.edu/expapi/extensions/section_number":"001","http://byu.edu/expapi/extensions/course_title":"College Algebra","http://byu.edu/expapi/extensions/section_type":"DAY","http://byu.edu/expapi/extensions/year_term":"20175","http://byu.edu/expapi/extensions/instructors":[{"id":"123456789","name":"Billy Jones","type":"Primary"}],"http://byu.edu/expapi/extensions/subject_area":"MATH","http://byu.edu/expapi/extensions/audit":false,"http://byu.edu/expapi/extensions/credit_hours":3,"http://byu.edu/expapi/extensions/catalog_number":"110","http://byu.edu/expapi/extensions/curriculum_id":"06387","http://byu.edu/expapi/extensions/institution":"BYU","http://byu.edu/expapi/extensions/catalog_suffix":""},"name":{"en-US":"MATH 110"},"description":{"en-US":"College Algebra"},"type":"http://byu.edu/expapi/activities/course"},"objectType":"Activity"}}
--e17395ece693460f8f9d9cd7e2aaf06f
X-Experience-API-Hash:071af7ed9305009d3bbf2b5fffc1eadfc4730a611554595fad3f205c27597eb5
Content-Transfer-Encoding:binary
Content-Length:4661
Content-Type:application/octet-stream
eyJhbGciOiJSUzI1NiIsIng1YyI6WyJNSUlGTURDQ0JCaWdBd0lCQWdJSkFQMXhvenBra1Ixb01BMEdDU3FHU0liM0RRRUJDd1VBTUlIQU1Rc3dDUVlEVlFRR0V3SlZVekVOTUFzR0ExVUVDQk1FVlhSaGFERU9NQXdHQTFVRUJ4TUZVSEp2ZG04eElUQWZCZ05WQkFvVEdFSnlhV2RvWVcwZ1dXOTFibWNnVlc1cGRtVnljMmwwZVRFcE1DY0dBMVVFQ3hNZ1QyWm1hV05sSUc5bUlFbHVabTl5YldGMGFXOXVJRlJsWTJodWIyeHZaM2t4R2pBWUJnTlZCQU1URVUxaGRIUm9aWGNnU0dGcGJITjBiMjVsTVNnd0pnWUpLb1pJaHZjTkFRa0JGaGx0WVhSMGFHVjNYMmhoYVd4emRHOXVaVUJpZVhVdVpXUjFNQjRYRFRFM01Ea3hOVEl3TURrd09Wb1hEVEU0TURreE5USXdNRGt3T1Zvd2djQXhDekFKQmdOVkJBWVRBbFZUTVEwd0N3WURWUVFJRXdSVmRHRm9NUTR3REFZRFZRUUhFd1ZRY205MmJ6RWhNQjhHQTFVRUNoTVlRbkpwWjJoaGJTQlpiM1Z1WnlCVmJtbDJaWEp6YVhSNU1Ta3dKd1lEVlFRTEV5QlBabVpwWTJVZ2IyWWdTVzVtYjNKdFlYUnBiMjRnVkdWamFHNXZiRzluZVRFYU1CZ0dBMVVFQXhNUlRXRjBkR2hsZHlCSVlXbHNjM1J2Ym1VeEtEQW1CZ2txaGtpRzl3MEJDUUVXR1cxaGRIUm9aWGRmYUdGcGJITjBiMjVsUUdKNWRTNWxaSFV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRExHam5iMDdpRXRWS1hyTDZVRHlydGFkR25oSG5BV1F4SldtMFB0ck1mbVFsOEpwSlRsUmt1cU1YcnBUSUUrVFBtTDlEdWxiUGF4c3ZmM2ZHSjFCeDBSRmo4SXlBU1V0RU9lYzBPdW45c0cwdXlVZGw5dFdSQUJ2SFBpejV2V3M1ZmkwUmoyQlJKWDgwdzlyWk4wZzBaeXVPQlBVTXZGSHpFdkh5QXIvNkthRlFPZ2QzWkdFQ09QZ1BaTXFIOHdmRzl0NVhjVFFLd2N1SEM5Tmc4WTh0elQwcFpuU0Y1UGlNbkZjY2xSdThTYW1zQllSc2cxOUlyVE0wWDEwbTBONjB1SkIzbVFZR09DdkZreFdxUktGZ2pMQ3pPa0FpblYvdDNqSzRVMzhidDhOVi9rbFArMkpTdWRrR2I3TTNDa0VsUllKMDV2UzN6MjVXZ3l6em5CZVF0QWdNQkFBR2pnZ0VwTUlJQkpUQWRCZ05WSFE0RUZnUVVvZHlnR1hqbWJMWDBMa1hubzMzekQwNzNUakV3Z2ZVR0ExVWRJd1NCN1RDQjZvQVVvZHlnR1hqbWJMWDBMa1hubzMzekQwNzNUakdoZ2Nha2djTXdnY0F4Q3pBSkJnTlZCQVlUQWxWVE1RMHdDd1lEVlFRSUV3UlZkR0ZvTVE0d0RBWURWUVFIRXdWUWNtOTJiekVoTUI4R0ExVUVDaE1ZUW5KcFoyaGhiU0JaYjNWdVp5QlZibWwyWlhKemFYUjVNU2t3SndZRFZRUUxFeUJQWm1acFkyVWdiMllnU1c1bWIzSnRZWFJwYjI0Z1ZHVmphRzV2Ykc5bmVURWFNQmdHQTFVRUF4TVJUV0YwZEdobGR5QklZV2xzYzNSdmJtVXhLREFtQmdrcWhraUc5dzBCQ1FFV0dXMWhkSFJvWlhkZmFHRnBiSE4wYjI1bFFHSjVkUzVsWkhXQ0NRRDljYU02WkpFZGFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDalZ1aGo1ckx2dUorb1VIT2ZXaFExOGJuWjNYTVpnMktXMkVUdk1HcnpOV2JHVzZLcjhlTmJRSkJSQzNMRTV2R1FwNlhuemlpMXh2cVNQdnNSamZRNGJVMFplTlkwaFV0VndwUHowNzFIYVFZRHozNUF6QmhvaWw1THJqNGszaW5OZGt4MHFtbkRVYTgxd21FajIwL0FSdmNDdkN3eGw5VjRVQ1Y0N3ROVFJmM2VkSHlKRXd1WjBMRFB5UDlMLzFLa3NoSS9jWTE1VSszQ2xzZjYwWGp0ZFdpZHdXQmxuZ0NRNUx3UHBlYkt2NTBFOGU1VFZGT0t2Y2V5bXVDSzJjb1JFejh3SzAyMVh2eS9QWmxkbXM1TmsyWE1EY2JzRExoVzRvZGpXd3ZhdEpCanhZYWNwMEhpL01PUjJmZndISUZRVTF0czAyeC9ET1ZLMWJNTzhsdHUiXX0.eyJpZCI6IjdhMzk0MGMxLTZkNjYtNDMyOC05YWQzLTBkNWIyYjA3N2Y2NiIsInRpbWVzdGFtcCI6IjIwMTctMDktMThUMjA6NDY6MDguMDc2WiIsImFjdG9yIjp7Im9iamVjdFR5cGUiOiJBZ2VudCIsImFjY291bnQiOnsibmFtZSI6IjEyMzQ1Njc4OSIsImhvbWVQYWdlIjoiaHR0cDovL2J5dS5lZHUvIn19LCJ2ZXJiIjp7ImlkIjoiaHR0cDovL2J5dS5lZHUvZXhwYXBpL3ZlcmJzL2NvbXBsZXRlZCIsImRpc3BsYXkiOnsiZW4tVVMiOiJjb21wbGV0ZWQifX0sInJlc3VsdCI6eyJleHRlbnNpb25zIjp7Imh0dHA6Ly9ieXUuZWR1L2V4cGFwaS9leHRlbnNpb25zL2dyYWRlIjoiQS0ifX0sImNvbnRleHQiOnsiY29udGV4dEFjdGl2aXRpZXMiOnsiY2F0ZWdvcnkiOlt7ImlkIjoiaHR0cDovL2J5dS5lZHUvZXhwYXBpL2NlcyIsIm9iamVjdFR5cGUiOiJBY3Rpdml0eSJ9XX19LCJvYmplY3QiOnsiaWQiOiJodHRwOi8vYXBpLmJ5dS5lZHUvY2xhc3Nlcy8yMDE3NSwwNjM4NywwMDEsMDAxIiwib2JqZWN0VHlwZSI6IkFjdGl2aXR5IiwiZGVmaW5pdGlvbiI6eyJ0eXBlIjoiaHR0cDovL2J5dS5lZHUvZXhwYXBpL2FjdGl2aXRpZXMvY291cnNlIiwibmFtZSI6eyJlbi1VUyI6Ik1BVEggMTEwIn0sImRlc2NyaXB0aW9uIjp7ImVuLVVTIjoiQ29sbGVnZSBBbGdlYnJhIn0sImV4dGVuc2lvbnMiOnsiaHR0cDovL2J5dS5lZHUvZXhwYXBpL2V4dGVuc2lvbnMvaW5zdGl0dXRpb24iOiJCWVUiLCJodHRwOi8vYnl1LmVkdS9leHBhcGkvZXh0ZW5zaW9ucy95ZWFyX3Rlcm0iOiIyMDE3NSIsImh0dHA6Ly9ieXUuZWR1L2V4cGFwaS9leHRlbnNpb25zL2N1cnJpY3VsdW1faWQiOiIwNjM4NyIsImh0dHA6Ly9ieXUuZWR1L2V4cGFwaS9leHRlbnNpb25zL3RpdGxlX2NvZGUiOiIwMDEiLCJodHRwOi8vYnl1LmVkdS9leHBhcGkvZXh0ZW5zaW9ucy9zZWN0aW9uX251bWJlciI6IjAwMSIsImh0dHA6Ly9ieXUuZWR1L2V4cGFwaS9leHRlbnNpb25zL3N1YmplY3RfYXJlYSI6Ik1BVEgiLCJodHRwOi8vYnl1LmVkdS9leHBhcGkvZXh0ZW5zaW9ucy9jYXRhbG9nX251bWJlciI6IjExMCIsImh0dHA6Ly9ieXUuZWR1L2V4cGFwaS9leHRlbnNpb25zL2NhdGFsb2dfc3VmZml4IjoiIiwiaHR0cDovL2J5dS5lZHUvZXhwYXBpL2V4dGVuc2lvbnMvY291cnNlX3RpdGxlIjoiQ29sbGVnZSBBbGdlYnJhIiwiaHR0cDovL2J5dS5lZHUvZXhwYXBpL2V4dGVuc2lvbnMvc2VjdGlvbl90eXBlIjoiREFZIiwiaHR0cDovL2J5dS5lZHUvZXhwYXBpL2V4dGVuc2lvbnMvY3JlZGl0X2hvdXJzIjozLCJodHRwOi8vYnl1LmVkdS9leHBhcGkvZXh0ZW5zaW9ucy9hdWRpdCI6ZmFsc2UsImh0dHA6Ly9ieXUuZWR1L2V4cGFwaS9leHRlbnNpb25zL2luc3RydWN0b3JzIjpbeyJpZCI6IjEyMzQ1Njc4OSIsIm5hbWUiOiJCaWxseSBKb25lcyIsInR5cGUiOiJQcmltYXJ5In1dfX19fQ.kQicfeVnJ3VlLqLrvO6SU3Ucs5ott3PEf7ZlMbyBcZC0DG4vJiHNnYvyhRtLcJTXm7dr3u1XXXRCE7SPWngLztvfbLgzgBy4EHO0YAey1UfN-xZPaLCb1TKLYqG1jIvYmvNC9BiK-s-d2TjrJMH0rn54dlCTjoR7Gxk2q6z-fN-vJ9lDjb-nXFdPqzOxPvyRMuDYOJXA-v3FhLPfs_HIMvixOYD2kbc46z7JJwixYTT6NAM3oTGYxwHIcfWdtF8MRw0Ofh6hbyTaPbglVWvg3ek9qCXLh8k7TRPGgEENe8ADAmSIAf53xaPtWXRj7R36iN_m7ABm3V5YLezUkPThSQ
--e17395ece693460f8f9d9cd7e2aaf06f--