RusticiSoftware / TinCanJS

JavaScript library for the Experience API (Tin Can API)
http://rusticisoftware.github.io/TinCanJS/
Apache License 2.0
206 stars 115 forks source link

Need access to original statement from HTTP response #144

Open mhailstone opened 7 years ago

mhailstone commented 7 years ago

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?

mhailstone commented 7 years ago

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.

brianjmiller commented 7 years ago

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.

mhailstone commented 7 years ago

@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:matthew_hailstone@byu.edu","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--