diff --git a/.github/workflows/deploy-cloud-run.yml b/.github/workflows/deploy-cloud-run.yml index ba6582dc..97a81984 100644 --- a/.github/workflows/deploy-cloud-run.yml +++ b/.github/workflows/deploy-cloud-run.yml @@ -26,11 +26,22 @@ env: AUTH0_AUDIENCE: ${{ vars.AUTH0_AUDIENCE }} AUTH_REDIRECT_URI: ${{ vars.AUTH_REDIRECT_URI }} AUTH_POST_LOGIN_REDIRECT: ${{ vars.AUTH_POST_LOGIN_REDIRECT }} - + LATEST_SPEC_VERSION: ${{ vars.LATEST_SPEC_VERSION }} + # Image service (diagram rendering at startup build) + IMAGE_SERVICE_URL: ${{ vars.IMAGE_SERVICE_URL }} + IMAGE_SERVICE_AUTH0_DOMAIN: ${{ vars.IMAGE_SERVICE_AUTH0_DOMAIN }} + IMAGE_SERVICE_AUTH0_AUDIENCE: ${{ vars.IMAGE_SERVICE_AUTH0_AUDIENCE }} + IMAGE_SERVICE_M2M_CLIENT_ID: ${{ vars.IMAGE_SERVICE_M2M_CLIENT_ID }} + # FastComments (discussion) + FASTCOMMENTS_TENANT_ID: ${{ vars.FASTCOMMENTS_TENANT_ID }} + FASTCOMMENTS_ENABLED: ${{ vars.FASTCOMMENTS_ENABLED }} + COMMENTS_SITE_KEY: ${{ vars.COMMENTS_SITE_KEY }} # Secrets AUTH0_CLIENT_SECRET: ${{ secrets.AUTH0_CLIENT_SECRET }} AUTH_COOKIE_SECRET: ${{ secrets.AUTH_COOKIE_SECRET }} MPS_API_KEY: ${{ secrets.MPS_API_KEY }} + IMAGE_SERVICE_M2M_CLIENT_SECRET: ${{ secrets.IMAGE_SERVICE_M2M_CLIENT_SECRET }} + FASTCOMMENTS_API_SECRET: ${{ secrets.FASTCOMMENTS_API_SECRET }} jobs: deploy: @@ -76,6 +87,16 @@ jobs: -t ${{ steps.vars.outputs.IMAGE_URI }} \ --push . + - name: Set health probe path + run: | + BASE="${ASTRO_BASE_PATH:-/}" + BASE="${BASE%/}" + if [ -z "$BASE" ] || [ "$BASE" = "/" ]; then + echo "HEALTHZ_PATH=/healthz" >> "$GITHUB_ENV" + else + echo "HEALTHZ_PATH=${BASE}/healthz" >> "$GITHUB_ENV" + fi + - name: Deploy to Cloud Run id: deploy uses: google-github-actions/deploy-cloudrun@v2 @@ -87,10 +108,12 @@ jobs: --allow-unauthenticated --ingress=internal-and-cloud-load-balancing --port=4321 - --startup-probe=httpGet.port=4321,initialDelaySeconds=10,timeoutSeconds=10,periodSeconds=120,failureThreshold=10 - --memory=1Gi + --startup-probe=httpGet.path=${{ env.HEALTHZ_PATH }},httpGet.port=4321,initialDelaySeconds=10,timeoutSeconds=10,periodSeconds=120,failureThreshold=10 + --memory=2Gi --timeout=60 --min-instances=1 + --concurrency=10 + --cpu=2 --set-env-vars ASTRO_BASE_PATH=${{ env.ASTRO_BASE_PATH }} --set-env-vars AUTH0_DOMAIN=${{ env.AUTH0_DOMAIN }} --set-env-vars AUTH0_CLIENT_ID=${{ env.AUTH0_CLIENT_ID }} @@ -100,8 +123,16 @@ jobs: --set-env-vars AUTH_REDIRECT_URI=${{ env.AUTH_REDIRECT_URI }} --set-env-vars AUTH_POST_LOGIN_REDIRECT=${{ env.AUTH_POST_LOGIN_REDIRECT }} --set-env-vars MPS_API_KEY=${{ env.MPS_API_KEY }} - + --set-env-vars LATEST_SPEC_VERSION=${{ env.LATEST_SPEC_VERSION }} + --set-env-vars IMAGE_SERVICE_URL=${{ env.IMAGE_SERVICE_URL }} + --set-env-vars IMAGE_SERVICE_AUTH0_DOMAIN=${{ env.IMAGE_SERVICE_AUTH0_DOMAIN }} + --set-env-vars IMAGE_SERVICE_AUTH0_AUDIENCE=${{ env.IMAGE_SERVICE_AUTH0_AUDIENCE }} + --set-env-vars IMAGE_SERVICE_M2M_CLIENT_ID=${{ env.IMAGE_SERVICE_M2M_CLIENT_ID }} + --set-env-vars IMAGE_SERVICE_M2M_CLIENT_SECRET=${{ env.IMAGE_SERVICE_M2M_CLIENT_SECRET }} + --set-env-vars FASTCOMMENTS_TENANT_ID=${{ env.FASTCOMMENTS_TENANT_ID }} + --set-env-vars FASTCOMMENTS_ENABLED=${{ env.FASTCOMMENTS_ENABLED }} + --set-env-vars FASTCOMMENTS_API_SECRET=${{ env.FASTCOMMENTS_API_SECRET }} + --set-env-vars COMMENTS_SITE_KEY=${{ env.COMMENTS_SITE_KEY }} - name: Output URL run: echo "Deployed to ${{ steps.deploy.outputs.url }}" - diff --git a/.microsite b/.microsite index 9d738667..ac849ec8 100644 --- a/.microsite +++ b/.microsite @@ -2,7 +2,20 @@ "title": "Open Badges", "description": "Share verified skills and achievements with learning providers and employers across multiple platforms.", "categories": { + "Specification": { + "order": 1 + }, + "Normative": { + "order": 2 + }, + "Guide": { + "order": 3 + }, + "Certification": { + "order": 4 + }, "Extension": { + "order": 5, "description": "Extensions are optional additions to the Open Badges standard that provide additional functionality or support for specific use cases. They are designed to be modular and can be implemented independently of the core standard.", "image": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmxpbms9Imh0dHA6Ly93d3cub3JnLzIwMDAveGxpbmsiIHZlcnNpb249IjEuMSIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjQgNjQiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGQ9Ik0zOS40NywzMC43NWMtOC44NiwzLjAyLTEyLjMwLDE0LjIxLTYuNjQsMjEuNjhjMy42LDQuNzgsMTAuMDMsNi43NjEsMTUuNzAsNC44MkM1NC4xMyw1NS4zNCw1OCw0OS45Miw1OCw0NCAgQzU4LDM0LjU2LDQ4LjQyLDI3LjY5LDM5LjQ3LDMwLjc1eiBNNDkuNSw0Ni41aC0zdjNjMCwzLjIyLTUsMy4yMi01LDB2LTNoLTMgYy0zLjIyLDAuMDItMy4yMi01LDAuMDItNWgzdi0zYzAtMy4yMiw1LTMuMjIsNSwwdjNoMyAgQzUyLjcyLDQxLjUsNTIuNzIsNDYuNSw0OS41LDQ2LjV6Ii8+PHBhdGggZD0iTTIyLDU0aDkuNTEgYy01LjI4LTYuNi00LjQwLTE2LjQ3LDEuOTUtMjIuMDQgYzUuNzYtNS4wNSwxNC41Ny01LjIyOSwyMC41NC0wLjQ1VjIyYzAtMy4zMS0yLjY5LTYtNi02aC02LjY4ICBjMC45Ni0yLjAxLDAuOS00LjM2LTAuMTYtNi4zMmMtMS43Ni0zLjI3LTUuOS00LjYtOS4yMy0yLjk3Yy0zLjQsMS42Ni00Ljg4LDUuODctMy4yNSw5LjI5SDIyYy0zLjMxLDAtNiwyLjY5LTYsNnY1LjY4ICBjLTMuMTYtMS41LTcuMDYtMC4zOC04LjkyLDIuNTljLTIuMDEsMy4xOS0xLjA3LDcuNTMsMi4xLDkuNjAxYzIuMDQsMS4zMiw0LjYyLDEuNSw2LjgyLDAuNDVWNDhDMTYsNTEuMzEsMTguNjksNTQsMjIsNTR6Ii8+PC9zdmc+" } diff --git a/Dockerfile b/Dockerfile index a7f7fc5a..d3235a6b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,32 +1,19 @@ FROM us-central1-docker.pkg.dev/specautomation-458709/microsites/microsites-base:dev -ARG ASTRO_BASE_PATH=/case/ -ENV ASTRO_BASE_PATH=/case/ +ARG ASTRO_BASE_PATH=/open-badges/ +ENV ASTRO_BASE_PATH=/open-badges/ +ENV MICROSITE_CONTENT_ROOT=/app/content -# This clears some test upstream content bundled in the base image, preserving content.config.ts -RUN if [ -f /app/src/content/content.config.ts ]; then \ - cp /app/src/content/content.config.ts /tmp/content.config.ts; \ - fi && \ - rm -rf /app/src/content && \ - mkdir -p /app/src/content/standards && \ - if [ -f /tmp/content.config.ts ]; then \ - cp /tmp/content.config.ts /app/src/content/content.config.ts; \ - rm /tmp/content.config.ts; \ - fi +# Remove bundled upstream example content (mdexamples, diagram-examples, etc.) +RUN rm -rf /app/content/docs - -COPY --chown=astro:nodejs ob_v3p0/microsites /app/src/content/standards/ -COPY --chown=astro:nodejs .microsite /app/src/content/ +COPY --chown=astro:nodejs ob_v3p0/microsites /app/content/docs/standards/ +COPY --chown=astro:nodejs .microsite /app/content/.microsite # ACE Extension -COPY --chown=astro:nodejs extensions/aceExtension/v1p0/microsite /app/src/content/standards/ace-extension +COPY --chown=astro:nodejs extensions/aceExtension/v1p0/microsite /app/content/docs/standards/ob-ace # Assessment Extension -COPY --chown=astro:nodejs extensions/assessmentExtension/v2p0/microsite /app/src/content/standards/assessment-extension +COPY --chown=astro:nodejs extensions/assessmentExtension/v2p0/microsite /app/content/docs/standards/ob-assessment # Issuer Accreditation Extension -COPY --chown=astro:nodejs extensions/issuerAccreditationExtension/v2p0/microsite /app/src/content/standards/issuer-accreditation-extension - -# The base image handles everything: -# 1. Runtime processes the assets (transforms paths, copies assets) -# 2. Starts the Astro server -# No additional commands needed! \ No newline at end of file +COPY --chown=astro:nodejs extensions/issuerAccreditationExtension/v2p0/microsite /app/content/docs/standards/ob-accred diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..5714af1e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,48 @@ +services: + image-service: + image: us-central1-docker.pkg.dev/specautomation-458709/microsites/microsites-image-service:dev + platform: linux/amd64 + container_name: ob-image-service-dev + ports: + - "8080:8080" + environment: + NODE_ENV: development + IN_DOCKER: "true" + IMAGE_SERVICE_AUTH_DISABLED: "true" + CACHE_DIR: /cache + CACHE_PUBLIC_HOST: http://image-service:8080 + volumes: + - diagram-cache:/cache + + web: + build: + context: . + dockerfile: Dockerfile + args: + ASTRO_BASE_PATH: "/open-badges/" + platform: linux/amd64 + image: ob-microsite:local + container_name: ob-microsite-dev + ports: + - "4321:4321" + depends_on: + - image-service + environment: + NODE_ENV: development + IN_DOCKER: "true" + ASTRO_BASE_PATH: "/open-badges/" + MICROSITE_CONTENT_ROOT: "/app/content" + DISABLE_AUTH: "true" + HOST: "0.0.0.0" + IMAGE_SERVICE_URL: http://image-service:8080 + IMAGE_SERVICE_AUTH_DISABLED: "true" + LATEST_SPEC_VERSION: "v3p0" + # Optional: uncomment and set for MPS blocks or FastComments local testing + # MPS_API_KEY: "" + # MPS_HOST: "https://mps.1edtech.org" + # FASTCOMMENTS_TENANT_ID: "" + # FASTCOMMENTS_ENABLED: "true" + # COMMENTS_SITE_KEY: "open-badges" + +volumes: + diagram-cache: diff --git a/docs/context.json b/docs/context.json deleted file mode 100644 index c504c798..00000000 --- a/docs/context.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "@context" : { - "id" : "@id", - "type" : "@type", - - "obi" : "https://purl.imsglobal.org/spec/ob/vocab#", - "xsd" : "http://www.w3.org/2001/XMLSchema#", - - "dtAssertion" : "obi:dtAssertion", - "dtBadgeConnectAPI" : "obi:dtBadgeConnectAPI", - "dtProfile" : "obi:dtProfile", - "dtStatus" : "obi:dtStatus", - "dtStatusResponse" : "obi:dtStatusResponse", - - "dtCompactJWS" : { "@id" : "obi:dtCompactJWS", "@type" : "xsd:string" }, - "dtIRI" : { "@id" : "obi:dtIRI", "@type" : "xsd:normalizedString" }, - "dtURL" : { "@id" : "obi:dtURL", "@type" : "xsd:anyURI" }, - - "apiBase" : "obi:dtURL", - "assertion" : "obi:dtAssertion", - "assertions" : { "@id" : "obi:dtAssertion", "@container" : "@set" }, - "authorizationUrl" : "obi:dtURL", - "badgeConnectAPI" : { "@id" : "obi:dtBadgeConnectAPI", "@container" : "@set" }, - "error" : { "@id" : "obi:error", "@type" : "xsd:string" }, - "image" : { "@id" : "obi:image", "@type" : "xsd:anyURI" }, - "name" : { "@id" : "obi:name", "@type" : "xsd:string" }, - "privacyPolicyUrl" : "obi:dtURL", - "profile" : "obi:dtProfile", - "registrationUrl" : "obi:dtURL", - "scopesOffered" : { "@id" : "obi:scopesOffered", "@type" : "xsd:anyURI", "@container" : "@set" }, - "signedAssertion" : "obi:dtCompactJWS", - "signedAssertions" : { "@id" : "obi:dtCompactJWS", "@container" : "@set" }, - "status" : "obi:dtStatus", - "statusCode" : { "@id" : "obi:statusCode", "@type" : "xsd:integer" }, - "statusText" : "obi:StatusTextEnumDType", - "termsOfServiceUrl" : "obi:dtURL", - "tokenRevocationUrl" : "obi:dtURL", - "tokenUrl" : "obi:dtURL", - "version" : { "@id" : "obi:version", "@type" : "xsd:string" } - } -} diff --git a/docs/images/OB3_ACG_DynamicClientRegistration.svg b/docs/images/OB3_ACG_DynamicClientRegistration.svg deleted file mode 100644 index 8fbdb205..00000000 --- a/docs/images/OB3_ACG_DynamicClientRegistration.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/OB3_ACG_ObtainingTokens.svg b/docs/images/OB3_ACG_ObtainingTokens.svg deleted file mode 100644 index 4ff8562f..00000000 --- a/docs/images/OB3_ACG_ObtainingTokens.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/OB3_Architecture.svg b/docs/images/OB3_Architecture.svg deleted file mode 100644 index 0d294716..00000000 --- a/docs/images/OB3_Architecture.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/figure02-openbadges-3.0-diagram.png b/docs/images/figure02-openbadges-3.0-diagram.png deleted file mode 100644 index 8036e6b0..00000000 Binary files a/docs/images/figure02-openbadges-3.0-diagram.png and /dev/null differ diff --git a/docs/images/figure03-skill-assertion-with-evidence.png b/docs/images/figure03-skill-assertion-with-evidence.png deleted file mode 100644 index 887ba85e..00000000 Binary files a/docs/images/figure03-skill-assertion-with-evidence.png and /dev/null differ diff --git a/docs/images/figure04-defined-achievement-with-skill.png b/docs/images/figure04-defined-achievement-with-skill.png deleted file mode 100644 index 7463e339..00000000 Binary files a/docs/images/figure04-defined-achievement-with-skill.png and /dev/null differ diff --git a/docs/images/ob30-concept.png b/docs/images/ob30-concept.png deleted file mode 100644 index a1a38794..00000000 Binary files a/docs/images/ob30-concept.png and /dev/null differ diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 1fee4cc5..00000000 --- a/docs/index.html +++ /dev/null @@ -1,4 +0,0 @@ - - Hello -

Hello

- \ No newline at end of file diff --git a/docs/ob_v3p0.html b/docs/ob_v3p0.html deleted file mode 100644 index 384ebca0..00000000 --- a/docs/ob_v3p0.html +++ /dev/null @@ -1,5040 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -Open Badges Specification 3.0 - IMS Base Document - - - - - - - -
-
-

Open Badges Specification

- -
-
- IMS Base Document
Spec Version 3.0 -
IMS Base Document - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Document Version:0
Date Issued:10 March 2022
Status:This document is for review and comment by IMS Contributing Members.
This version:https://www.imsglobal.org/spec/ob/v3p0/main/
Latest version:https://www.imsglobal.org/spec/ob/latest/main/
Errata:https://www.imsglobal.org/spec/ob/v3p0/errata/
Issue Tracker - https://github.com/IMSGlobal/openbadges-specification/issues -
-

IPR and Distribution Notice

-

- Recipients of this document are requested to submit, with their - comments, notification of any relevant patent claims or other - intellectual property rights of which they may be aware that might be - infringed by any implementation of the specification set forth in this - document, and to provide supporting documentation. -

-

- IMS takes no position regarding the validity or scope of any - intellectual property or other rights that might be claimed to pertain - implementation or use of the technology described in this document or - the extent to which any license under such rights might or might not be - available; neither does it represent that it has made any effort to - identify any such rights. Information on IMS's procedures with respect - to rights in IMS specifications can be found at the IMS Intellectual - Property Rights webpage: - - http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf . -

-

- The following participating organizations have made explicit license - commitments to this specification: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Org nameDate election madeNecessary claimsType
Concentric SkyOctober 24, 2019NoRF RAND (Required & Optional Elements)
Digital KnowledgeOctober 11, 2019NoRF RAND (Required & Optional Elements)
Washington State Board for Community and Technical Colleges (WSBCTC)October 4, 2019NoRF RAND (Required & Optional Elements)
CredlyOctober 3, 2019NoRF RAND (Required & Optional Elements)
-

- Use of this specification to develop products or services is governed by - the license with IMS found on the IMS website: - - http://www.imsglobal.org/speclicense.html. -

-

- Permission is granted to all parties to use excerpts from this document - as needed in producing requests for proposals. -

-

- The limited permissions granted above are perpetual and will not be - revoked by IMS or its successors or assigns. -

-

- THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND - IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. - ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE - IMPLEMENTER'S OWN RISK, AND NEITHER THE CONSORTIUM, NOR ANY OF ITS - MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY - IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, - DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION. -

-

- Public contributions, comments and questions can be posted here: - - http://www.imsglobal.org/forums/ims-glc-public-forums-and-resources - . -

-
-
-

- © 2022 IMS Global Learning Consortium, Inc. All - Rights Reserved. -

-

- Trademark information: - http://www.imsglobal.org/copyright.html - -

-
-
- -

Abstract

This is a proposal to recharter the Open Badges Workgroup to develop a new version of the IMS Global Open Badges Specification to align it to the conventions of the W3C Verifiable Credentials Data Model for the use cases of Defined Achievement Claim and a Skill Claim. The credentials that would be produced under this proposal could easily be bundled into Comprehensive Learner Records and Verifiable Presentations. Portability and learner data privacy may be improved by expanding the usage of cryptographic proofs/signatures, because this format will be compatible with a growing array of proof schemas that are developed for the Verifiable Credentials Data Model.

- -

1. Introduction

1.1 Audiences

The target readers for this document are:

1.2 Document Set

The Open Badges Specification has several related documents and artifacts shown below. Together they make up the specification.

1.2.1 OpenAPI 3.0 Files for the Badge Connect API

-

The Open API Specification (OAS) defines a standard, programming language-agnostic interface description for HTTP APIs, which allows both humans and computers to discover and understand the capabilities of a service without requiring access to source code, additional documentation, or inspection of network traffic. When properly defined via OpenAPI, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. Similar to what interface descriptions have done for lower-level programming, the OpenAPI Specification removes guesswork in calling a service.

-

-- OpenAPI Specification

-

This standard has OpenAPI 3.0 files for the Badge Connect API in both JSON and YAML format:

1.2.2 JSON-LD Context File

-

When two people communicate with one another, the conversation takes place in a shared environment, typically called "the context of the conversation". This shared context allows the individuals to use shortcut terms, like the first name of a mutual friend, to communicate more quickly but without losing accuracy. A context in JSON-LD works in the same way. It allows two applications to use shortcut terms to communicate with one another more efficiently, but without losing accuracy.

-

Simply speaking, a context is used to map terms to IRIs. Terms are case sensitive and any valid string that is not a reserved JSON-LD keyword can be used as a term.

-

-- JSON-LD 1.1

-

This specification includes this JSON-LD Context file:

1.2.3 JSON Schema

This specification includes JSON Schema files for every class in the data model and every payload in the API.

1.3 Conformance Statements

- As well as sections marked as non-normative, all authoring guidelines, - diagrams, examples, and notes in this specification are non-normative. - Everything else in this specification is normative. -

- The key words MAY, MUST, MUST NOT, NOT RECOMMENDED, NOT REQUIRED, OPTIONAL, RECOMMENDED, REQUIRED, SHALL, SHALL NOT, SHOULD, and SHOULD NOT in this document - are to be interpreted as described in - [RFC2119]. -

- An implementation of this specification that fails to implement a - MUST/REQUIRED/SHALL requirement or fails to abide by a MUST NOT/SHALL NOT - prohibition is considered nonconformant. SHOULD/SHOULD NOT/RECOMMENDED - statements constitute a best practice. Ignoring a best practice does not - violate conformance but a decision to disregard such guidance should be - carefully considered. MAY/OPTIONAL statements indicate that implementers - are entirely free to choose whether or not to implement the option. -

- The Conformance and Certification Guide - for this specification may introduce greater normative constraints than - those defined here for specific service or implementation categories. -

1.4 Terminology

1.5 Conceptual Model

This conceptual model describes Open Badges concepts and the relationship between those concepts. The data model in appendix § B.2 org.1edtech.ob.v3p0.model below is the normative reference for the classes and properties that are used to implement the concepts.

The conceptual model is targeted for all § 1.1 Audiences, while the data model is targeted for Solution Architects and Product Developers.

In the diagram below, the concepts are shown in gray boxes (e.g. Assertion). Please see § 1.4 Terminology for definitions of the concepts.

Starting with this version of the Open Badges Specification, an Assertion is also a Verifiable Credential (VC) as defined by the Verifiable Credentials Data Model v1.1 specification. The diagram includes labels that show the relationships between VC terminology and Open Badges terminology (e.g. Issuer is identified by the VC "issuer").

- Diagram show the major conceptual components of an Open Badge Verifiable Credential -
Figure 1 Diagram show the major conceptual components of an Open Badge Verifiable Credential
-
- -

2. Overview

This section is non-normative.

2.1 What is the problem this solves for?

Verifiable Credentials (VCs) are a format that is used to publish a limitless variety of claims about a subject person or other entity, typically through a cryptographic proof. VCs can be collected and delivered as part of a presentation whereby authorship of each VC from the same or multiple issuers can be trusted via cryptographic verification. The presentation can also be cryptographically signed to demonstrate that the holder has assembled and sent the collection of VCs.

These layers of cryptographic proof can provide security and privacy enhancements to Open Badges that are not yet available in version 2.0. Adoption of Verifiable Credentials can increase market penetration and use of Open Badges by addressing market needs for trustworthy machine-ready data to power connected ecosystems in education and workforce. This can unlock the door for Open Badges credentials to be included in a growing number of multi-purpose digital credential wallets entering the market. Stepping further into signed VCs and another associated technology, decentralized identifiers (DIDs), unlocks increased longevity and resilience of Open Badges that can describe achievements even more expressively than they do today.

2.2 What does adopting Verifiable Credentials entail?

This proposal is for a reasonable change to the structure of the Open Badges Assertion class, to adopt the conventions of the Verifiable Credential Data Model. This means that badges issued under the proposed version would not be conformant to all of the existing 2.x data model requirements.

An existing Open Badges Assertion, illustrated in the graphic below, structures its objects like this: -An Assertion identifies a recipient with a "recipient" relationship to an IdentityObject that contains identifying properties. It identifies which badge it represents with a "badge" relationship to a BadgeClass. It identifies its verification information with a "verification" relationship to a VerificationObject. It identifies its issuer with an "issuer" relationship between the BadgeClass and the Issuer.

- Open Badges 2.0 Diagram -
Figure 2 Open Badges 2.0 Diagram
-

The proposed Verifiable Credentials structure depicted below offers the same information with a slightly different structure: A Verifiable Credential identifies its recipient with a "credentialSubject" relationship to a subject class that is identified by an identifier. It identifies its issuer with an "issuer" relationship directly to an Issuer. The Credential claims the subject has met the criteria of a specific BadgeClass (also known by its CLR alias as an "Achievement") with a "hasCredential" relationship to that defined achievement. It identifies its verification information with a "proof" relationship to an instance of a proof that follows a standardized schema.

- Open Badges 3.0 Proposed Diagram -
Figure 3 Open Badges 3.0 Proposed Diagram
-

2.3 Benefits and Opportunities

It can be risky to make breaking changes to a specification used as broadly as Open Badges, but there are a range of benefits to making this move now while the Verifiable Credentials ecosystem is young and growing fast. There are strong use cases for digital credentials for learning and skill achievements across the nexus of education and employment, as we have seen from the broad adoption of Open Badges and the proliferation of industry groups making connections between educational institutions and the employment market around digital credentials. Technical compatibility is in a more favorable position when faced with rapid ecosystem growth than competition between large communities issuing these learning credentials and other communities focused on different market verticals from government identity documents, commercial payments, and international trade, to name a few.

This proposal opens a path forward for a unified concept of digital credentials in the IMS Global community, collapsing the relevant differences between Open Badges and CLR, and addressing a clear set of single achievement use cases with a robust, flexible, and future-proof solution that can easily be integrated with the set-of-multiple credentials use cases familiar to Comprehensive Learner Record.

Below, we present a selection of benefits related to the proposed restructuring of Open Badges, and compare the opportunities opened by becoming compatible with Verifiable Credentials to the limitations that the Open Badges community has encountered with today's version of Open Badges and CLR.

2.3.1 Interoperability with Digital Wallets, Verifiable Presentations, and Learner Experiences

Open Badges as VCs are designed to be issued and offered to learners who may accept them into their digital wallet. Wallets are software that runs on either the web or as a native app on a mobile device or desktop environment. A web wallet is another term to describe the application role known under 2.0 as a "Host". There is an existing and growing ecosystem of deployed technology to support VCs; integration with these becomes possible if Open Badges adopts VCs along the lines of this proposal. For example, a number of generic Verifiable Credential wallet implementations are available from a variety of vendors as native mobile apps. From a wallet, recipients may package their badges along with their other VCs into verifiable presentations. A presentation contains the credentials that the learner wishes to share with a relying party. The digital wallet application digitally signs the presentation using the key of the learner. The verifying third-parties can cryptographically verify that the presentation came unmodified directly from the credential holder as well as the integrity of each of the VCs included in the presentation as credentials signed by each of their respective issuers.

It is possible from a wallet to package credentials into a verifiable presentation in response to a request from a relying party who seeks credentials for a certain purpose. For example, a potential employer seeking to fill an internship role, may need to verify that a student is over 18, has completed a course on communication, and is a current student. A student could use their wallet to package three VCs (driver's license, course completion badge, and student ID) into a presentation that is signed by their private key. When the presentation is sent to the employer's website, the employer can verify that the VCs belong to the student and that the VCs are authentic. Protocols and interoperability around making and fulfilling requests are still at an early stage, but when these technologies are tested in the wild, it would be a good idea to already have educational credentials claim schemas available for the claim types ("defined achievement" and "skill assertion") possible to make with Open Badges.

The growing collection of VC wallets is an example of how adopting a Verifiable Credentials-based approach allows Open Badges to grow in impact and take advantage of existing momentum in the digital credentials space around tooling that is entering the market and heading towards maturity.

2.3.2 Verifiable Credentials Support Increases Learner Data Privacy and Trustworthiness of Open Badges

The W3C Verifiable Credentials Data Model specification describes how technologies can be used to present cryptographically verifiable and tamper-evident claims. Verifiable Credentials (VCs) can be verified through up-to-date and broadly interoperable schemas for verification. This can provide security and privacy enhancements to IMS Global Open Badges that are not available in Open Badges 2.0.

Currently, Open Badges 2.0 data can be verified via either (a) publicly accessible hosted JSON badge data or (b) JWS digitally signed badges with a limited number of algorithms and key types, depending on the verification method chosen by the issuer. In order to keep up with evolving cryptographic standards without taking on the burden of writing cryptographic suites as a community not specializing in that function, adopting Verifiable Credentials proofs allows experts to update algorithms to keep up with improvements to cryptography-breaking processing power.

Publicly hosted badge data has been the preferred method of many Open Badges issuers. This method can risk the privacy of badge recipients who are reliant on the issuers to host their data leaving them with no direct control over its accessibility. There is also the potential that data about individuals is publicly accessible without their knowledge. Most Open Badges don't contain significant amounts of personally identifiable information, but they are subject to correlation. This could lead to on-site identification, email spam, and also cause badges to be correlatable with other personally identifying data on the web.

Hosted badge data is also not tamper-evident since it is hosted on web servers typically as dynamically-generated JSON files populated by queries made to relational databases or static JSON files. This makes the data easy to change without any historic reference or preservation. This can be convenient for issuers but not assuring for relying third-parties seeking to put the data to use. Changes to badge metadata such as criteria, the issuedOn date, and recipient email can reduce the perceived quality of data and reflect incorrect information about the learners' experiences. Digitally signed 2.0 badges provide more assurances and privacy than the hosted badges but are not commonly issued and are not interoperable with VC wallets.

There's been very little evidence that badge JSON data has been readily consumed by machines, but technologies and the education and workforce markets have evolved since Open Badges 2.0 was released 4 years ago. Machine learning and AI uses have expanded alongside blockchain and other decentralized technologies creating opportunity for connecting learners to opportunities, more accurate skills-based hiring, and updated curricula more equitably reflecting the needs of students. The market is demanding that the achievement data be trustworthy. This means that it should be accessible, protected, have integrity, and communicate what was intended including that the issuer and subjects of the data can be authenticated and that the data has not been tampered with since it was issued. Shifting Open Badges to align with the VC conventions to verify learner achievements meets these expectations and provides learners with more agency over their achievement data by giving them immediate access to it for as long as they need it, allowing them to choose which data they share, protecting it, and making it work with other credentials in and outside of education and workforce.

2.3.3 Decentralized Identifiers and Self-Sovereign Identity

With Open Badges up to 2.0, email addresses have been used as identifiers far more commonly than the other available options. This has been problematic because email addresses may be used by more than one person, are often revoked when an individual leaves a job or school, are insecure, and aren't intended to be identifiers. Identifiers in VCs commonly are HTTP-based URLs, follow another scheme of IRI, or take the form of a Decentralized Identifier.

Decentralized identifiers (DIDs) are a type of identifier for people, organizations and any other entity, where each identifier is controlled independently of centralized registries. Each DID can be resolved through an operation described by its particular "DID Method" to reveal a DID document that describes the subject. Whereas previous versions of Open Badges required HTTP(s) identifiers for issuers and typically used email (or rarely URL) identifiers for learners, adoption of the Verifiable Credentials Data Model provides simple conventions for badge issuers and recipients to begin to use DIDs when they desire.

Verification of control of identifiers is an important concept within any type of digital credential, both with respect to the issuer and the subject (recipient) of the credential. For issuers, Open Badges has relied on its own bespoke rules for determining whether a hosted Assertion URL or cryptographic key URL is associated with an issuer profile identified by a particular URL. URLs used for recipient identifiers have no built-in mechanism for authentication. Email and telephone number based recipient identifier authentication are up to the relying party, but there are common methods for performing this task essential to establishing trusted proof of control of credentials presented by a subject.

DIDs typically offer cryptographic proof of control, based on authorized keys or other verification methods expressed in the associated DID Document. While these protocols are not broadly implemented across domains today, the structure provides a forward-looking flexible and extensible mechanism to build the types of protocols needed to connect credentials back to the identities of their issuers and subjects. The Open Badges community may ultimately recommend use of only a small number of these capabilities in early releases or recommend them only for experimental use, like with cryptographic proof methods. But this is still an important step, because there is no reason for the Open Badges community to be closed to interoperability through the protocols being developed for use by the wallets and services coming into being elsewhere by delaying the option to use DIDs for recipient and issuer identifiers.

2.3.4 Aligning Open Badges and CLR with Common Assertion and Achievement Models

As described below, it is possible for Open Badges and CLR to produce coordinated specs particularly if both specs are aligned with Verifiable Credentials. Discussion of the components of individual achievements can occur within the Open Badges workgroup, and discussion of more complex use cases necessitating needs for bundling and association of multiple achievements on behalf of a publisher can occur within the CLR group. The cross-pollination of members of each effort will create opportunities to coordinate and ensure that all important use cases for single assertions and bundles of associated assertions are well-handled. The openness of the Open Badges Specification can be preserved so that the broader community can continue to be aware of and connected to the official developments.

At the core, Open Badges and CLR have similar objectives with the primary difference being single vs a collection of credentials. A common assertion model ensures that Open Badges can be included in CLR collections and that both CLRs and Open Badges can be held separately by learners in their Verifiable Credential wallets.

Both Open Badges and CLR make assertions about achievements and conceptually share many similar properties. With some judicious analysis and renaming of some properties, it is possible to have cross-alignment of achievement properties served by Open Badges and used by CLR. Examples include but are not limited to achievementType which describes the type of achievement being represented, and Result/ResultDescription which can describe possible levels of mastery associated to specific achievements. This will enrich Open Badges data and increase the perceived significance and usage of Open Badges to deliver verifiable single achievements such as certifications, licenses, courses, etc. Using a common model across Open Badges and CLR specifications for the core ideas of assertion and achievement will enable the CLR specification to focus on the more complex requirements of bundling collected assertions and expressing the associations between the achievements.

2.3.5 Differentiating Issuers and Creators

In Open Badges and CLR, the issuer is assumed to be the creator. Over the years, the Open Badges community has requested capabilities to distinguish between the issuer and creator of a badge. This is because there are plenty of examples where the assessor is the issuer but not the creator of the badge. The Original Creator Extensions is a step in this direction but provides no properties to describe the eligibility of issuers trusted by the original creator to duplicate and issue their own assertions of the badge.

In order to open up a wide swath of use cases for shared issuing responsibility of common credentials, we must do more. Conveniently, an issuer property for the entity that is digitally signing the credential is included in the VC assertion. Because of this, the issuer property referenced in the BadgeClass is redundant. This property is a logical placement for new properties to describe a creator(s) and the eligibility of potential outside issuers to share or have delegated responsibility for badge issuance. This will enable the use cases and give relying third-parties more contextual information about the achievement and the parties involved.

2.4 Skill Assertions

Many of the use cases for Open Badges and CLR involve describing "defined achievements" with the Achievement/BadgeClass data class. These achievements may sometimes be aligned to skills or competencies, as a means of indicating that those who earn them have achieved the aligned skills. As part of this proposal, we also introduce the concept of a Skill Assertion, showing how the Open Badges Specification can be expanded to assert achievement of single skills in a more flexible manner that is complementary to these use cases and that opens up a wide range of new use cases. A Skill Assertion offers a lightweight structure for issuers to make a claim that a learner has a skill, with a particular assessment result if desired.

A Skill Assertion is an Open Badges assertion that contains a "skill result." The idea of a skill result fits perfectly with the concept from CLR of a Result that is paired against the ResultDescription defined in an Achievement/BadgeClass, but a skill result targets a skill that may have been defined by a third-party organization, such as an industry group. This is a separate claim that may be composed alongside a "hasCredential" claim that identifies which Achievement/BadgeClass criteria has been met, or it could appear in an Open Badges Verifiable Credential without the defined achievement claim. This means that an issuer could easily make an assertion that a learner has achieved the criteria of a certain badge, or that they have achieved a specific skill, or both (whether or not the skill is specifically identified in the alignments of the badge).

The following diagram shows how these concepts are connected for a use case in which an issuer asserts that a credential subject has achieved a particular skill, using a "results" claim to establish a relationship with a Result class that identifies which skill is recognized and may describe other aspects of the skill achievement, such as the level at which it was assessed and a degree of confidence. Specific use cases for how this data needs to be consumed will drive the specific skill-specific properties of the Result class that may be added to give issuers the options they need. In this example, a Skill Definition that is identified by a unique URL at which information about the skill is published is referenced by the Result. This pattern, named by the Open Skills Network as a Rich Skill Descriptor (RSD), makes it possible for skills to be precisely referenced in other entities, such as credentials. Here, the RSD was published by an industry organization, and included in this credential by a different issuer. There is no need for the skill author and the credential issuer to have a pre-existing or discoverable relationship in order for a Skill Assertion to be valid. Evidence may also be included, just like in any Assertion.

- Skill Assertion with Evidence Diagram -
Figure 4 Skill Assertion with Evidence Diagram
-

The notion of skill results can be combined with a defined achievement assertion claim "hasCredential". In this example, the same Skill Assertion appears, but additional criteria that the learner has met is described in the Achievement/BadgeClass as in many of our other examples. The Achievement aligns to the same skill that is recognized, but the Result allows the issuer to describe specifics about the assessment results relative to the skill.

- Defined Achievement Assertion with Skill Result Diagram -
Figure 5 Defined Achievement Assertion with Skill Result Diagram
-

The inclusion of Skill Assertion claims makes a natural, ergonomic fit with defined achievement claims and evidence claims. Business logic to process each of the available claims can look for just the data a relying party needs, and extraneous claims do not get in the way.

- -

3. Use Cases

This section is non-normative.

The use cases below drive the design of Open Badges 3.0 specification.

3.1 Revocation of an Issued Credential

Gigantic State University is a badge issuer. It has awarded a badge to a student in the form of a verifiable credential. Some time after issuing the credential, GSU discovers academic misconduct on the part of the student and needs to revoke the credential's status. GSU updates a list of revoked credential IDs, noting the reason why it was revoked. Future verifications of the issued badge by consumers detect that the credential is now revoked and do not erroneously accept it.

Goal of the Primary Actor: Revoke a credential they have already awarded.

Actors: Credential issuer, Credential Subject, Consumer/Verifier

Preconditions for this Use Case:

    -
  1. Issuer creates a badge class
  2. -
  3. Issuer issues a credential to a subject
  4. -
  5. Credential references a revocation list
      -
    1. Uses the credentialStatus property
    2. -
    3. OB 3.0 standard comes to consensus on what to use.
    4. -
    -
  6. -
  7. Issuer has access to a revocation list to update
  8. -
  9. Verification process of badge credentials checks associated list
  10. -

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.2 Online Course Completion Assertion Issuance to Wallet

Maya has completed an online course for an "Introduction to Web QA" at her local community college. The community college issues a course completion assertion. When Maya is ready to accept the assertion, she presents her wallet's location to the community college, which generates a request that Maya approves to receive the credential. Maya stores the assertion in her Verifiable Credentials enabled digital wallet with her other credentials.

Goal of the Primary Actor: Issue a verifiable credential to a student that she can use to take the next steps in her education journey.

Actors: Community college, Maya (student)

Preconditions for this Use Case:

    -
  1. Community college creates badge for course completion
  2. -
  3. Maya completes the course
  4. -
  5. Maya downloads and installs a VC enabled digital wallet
  6. -
  7. Maya has an identifier she uses for educational badges
  8. -
  9. Maya is able to connect her wallet to the community college's issuing platform (assuming community college is using a platform) through authentication with the platform
  10. -
  11. The community college has established an issuer profile, relevant cryptographic keys, and has published an Achievement corresponding to completion of the "Introduction to Web QA" course.
  12. -
  13. Maya has provided an identifier to the college that it has accepted (or controls an identifier that the college has assigned to her)
  14. -

Flow of Events:

    -
  1. Maya completes course requirements, receives a grade and is marked as complete for the "Introduction to Web QA" course.
  2. -
  3. Maya provides or selects an identifier to use as her identifier for badges while enrolled at the community college, and proves the identifier represents her to the college if necessary, and through mechanisms appropriate to the identifier type.
  4. -
  5. The community college issues an assertion of the previously defined achievement to Maya's identifier and cryptographically signs it
  6. -
  7. Maya accepts the credential into her wallet.
  8. -

Post-Conditions/Success Criteria:

Points of Failure:

3.3 Assertion Issuance without mobile VC Wallet (email)

A professional development/training vendor Training, Inc. recognizes Dawson's mastery of a competency by issuing an assertion to Dawson's email address.

Goal of the Primary Actor: Training, Inc. wishes to provide a verifiable record that Dawson may use to present proof of competency-based professional development.

Actors: Training, Inc (professional development/training vendor), Dawson (student)

Preconditions for this Use Case:

    -
  1. Dawson is authenticated, associated with a particular email address to the vendor's platform.
  2. -
  3. The vendor has established an issuer profile, defined an Achievement and has the capability to create and deliver assertions to Dawson via Badge Connect
  4. -

Flow of Events:

    -
  1. Dawson authenticates to the vendor platform, proving control of a chosen email address.
  2. -
  3. Dawson connects a Badge Connect backpack to the vendor platform, resulting in the platform holding an auth token on his behalf scoped to allow pushing assertions to his backpack.
  4. -
  5. Dawson engages with a learning opportunity, gains new knowledge, skills, and abilities, and successfully completes an assessment demonstrating mastery of a specific competency.
  6. -
  7. Training, Inc. creates an assertion of the achievement that recognizes the competency.
  8. -
  9. Training, Inc. transmits the assertion to Dawson's backpack via Badge Connect API.
  10. -

Post-Conditions/Success Criteria:

Points of Failure:

3.4 Assertion Issuance to Custodian/Guardian Wallet (custodian/guardian)

Kalamazoo Elementary School holds a schoolwide spelling bee and recognizes the achievement of a minor student, Maddie, for winning third place in said spelling bee. Kalamazoo delivers the assertion to Maddie's guardian, Cole, to maintain the assertion until such a time that Maddie can take control of that assertion.

Goal of the Primary Actor: Kalamazoo K-12 wishes to award an assertion that Maddie may eventually use, with the understanding that she may not be able to control a wallet on her own behalf today.

Actors: Kalamazoo K-12 district (issuer), Maddie (student), Cole (guardian)

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.5 Assertion Issuance without Wallet (QR code)

Jade takes a Standard First Aid course offered by a Red Cross authorized training company, ABC Corp., and receives a printed certificate including their name and certificate number to show that they are certified for SFA + CPR valid for 3 years. The certificate also includes a QR code that is a representation of an OB 3.0 assertion embedded with Jade's name, certificate number, and expiry date. Jade's employer then scans the QR code and verifies that Jade is now qualified to be a first aid attendant in the office (which gives Jade a $2/hr raise).

Goal of the Primary Actor: To be able to show that they hold current certification for SFA from the Red Cross which qualifies them to be a workplace first aid attendant and gives them a raise for the extra job role.

Actors: Organisation that does Red Cross training, course participant, participant's employer

Preconditions for this Use Case:

    -
  1. The Red Cross has defined an Achievement for the certification.
  2. -
  3. The vendor is authorized by the Red Cross to do training and issue certification certificates for the SFA and CPR courses.
  4. -
  5. The vendor has established an issuer profile and has the capability to create and print certificates.
  6. -
  7. The participant's employer has an application that can view and verify VCs that are printed as QR codes.
  8. -

Flow of Events:

    -
  1. Jade shows a piece of government issued ID to the vendor while taking the course.
  2. -
  3. Jade completes and passes the SFA + CPR first aid course.
  4. -
  5. ABC Corp. prints out a wallet sized and wall sized certificate to say that Jade is certified.
  6. -
  7. The certificate is presented to Jade's employer and Jade gets an additional work role due to being qualified as a workplace first aid attendant.
  8. -

Post-Conditions/Success Criteria:

Points of Failure:

3.6 Recipient Presentation of Assertion

Maya registers for an advanced course and she is asked to provide proof that she completed a prerequisite course. From her wallet, Maya presents the course assertion as a verifiable presentation to the MOOC, which cryptographically verifies the issuer of the assertion, that Maya is the recipient, and that the assertion data has not been altered since it was issued. Upon verification, she is registered for the MOOC.

Editor's note
-New to v3.0: Verifiable Credentials (VC) is a W3C specification that describes how to issue tamper-evident credentials that can be cryptographically verified. Maya's digital wallet has the capabilities to create a DID, read the VC data, and store it. From the wallet, Maya can present her credentials and prove that she is the recipient because it was issued to a DID that she created and has the digital keys that demonstrates her control of the Verifiable Credential (VC). This functionality is not specific to the Open Badges standard but using this verification functionality and using a decentralized identifier (DID) to identify the badge recipient instead of an email address is part of the v3.0 update. Maya's badge recognizes a course completion and being able to specify that in the badge is a new aspect of v3.0. As with the CLR, v3.0 will be able to specify the type of achievement that a badge is representing. -

Goal of the Primary Actor: Register for advanced "Web QA" course

Actors: Maya, MOOC

Preconditions for this Use Case:

    -
  1. Maya completed prerequisite course
  2. -
  3. Issuer issued a verifiable assertion (i.e. completion of prerequisite course) to Maya
  4. -
  5. Maya has a VC-compatible wallet
  6. -
  7. Maya has received the VC representing her competion of the prerequisite course
  8. -
  9. The MOOC is capable of receiving the verifiable presentation of the badge
  10. -

Flow of Events:

    -
  1. Maya authenticates to the MOOC platform
  2. -
  3. The MOOC platform requests a credential matching a certain criteria (completion of a prerequisite course option)
  4. -
  5. Maya prepares and transmits a presentation of her assertion to the MOOC platform
  6. -
  7. The MOOC platform verifies the assertion is valid and fitting its needs
  8. -
  9. The MOOC platform grants the authenticated user Maya access to the advanced course
  10. -

Post-Conditions/Success Criteria:

Points of Failure:

    -
  1. Maya's wallet and the MOOC platform must be capable of establishing a transmission channel for the assertion.
  2. -
  3. The MOOC platform must be capable of expressing a request for a credential that matches the assertion that Maya holds.
  4. -
  5. There must be a mutual capability between the wallet and the MOOC platform to prove Maya's is represented by recipient identifier
  6. -

3.7 License Issuance

After Jeremy takes his electrician licensure exam, he accesses the online system for his state's licensure department to see his results and download his license. After he proves his identity by presenting his government issued ID from his digital wallet, he is informed that he passed the exam. The electrician license badge is issued to the DID Jeremy provided and is stored in his digital wallet with his other digital credentials.

Editor's note
-New to v3.0: Similar to Maya's course completion badge, Jeremy's electrician license badge is also issued to a DID that Jeremy provides from his wallet and can also be cryptographically verified following the Verifiable Credentials model. The government issued ID in this use case is not an Open Badge but because it is a Verifiable Credential it can be stored in the same wallet as the electrician's license badge demonstrating interoperability of the verification models. -

Goal of the Primary Actor:

Actors:

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.8 Mapping Skills

Syd is shifting careers after many years working in construction. In their digital wallet they had several skill badges describing their mastery of skills in construction but also in teamwork, communication, and organizational skills. Syd also had badges from some courses they'd taken in science and math over the last few years. After they uploaded the skill and course badges from their wallet to a career planning site, they were offered several opportunities to apply for work in software sales and cybersecurity.

Editor's note
-New to v3.0: In addition to badges recognizing courses, this use case mentions skill badges. In v3.0, a badge can claim that the recipient has attained a single skill. The assertion references a Rich Skill Descriptor (RSD) instead of a badge class. Skill badges can also be cryptographically verified following the Verifiable Credentials model and stored in digital wallets. -

Goal of the Primary Actor:

Actors:

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.9 Verifying Continuing Education

Denise was offered a new job at a hospital as a physician's assistant. Before starting, her continuing education training and license to practice needed to be verified. The last time she switched hospitals, the verification process took three weeks. This time, she was able to provide her badges to prove her training and license. Within minutes her credentials were verified and she was issued a new digital staff credential.

Editor's note
-New to v3.0: As with the other use case, this use case emphasizes that Open Badges v3.0 can recognize many different achievement types and be cryptographically verified following the Verifiable Credentials model. -

Goal of the Primary Actor:

Actors:

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.10 Self-assertion

Stacy has created a mobile app that demonstrates her abilities as a coder, designer, and product manager. She creates an account on a badging platform and designs the badge to include alignments to the skills that the badge recognizes. With her digital wallet app, she connects to the badging platform and issues this badge to herself which includes screenshots and a link to the mobile app as evidence. Stacy uses this badge and others like it as verifiable portfolio items.

Editor's note
-New to v3.0: In previous versions of Open Badges, it was possible to make self-assertion badges and issue badges to peers, however the issuer profile properties were organization specific. With 3.0, the issue properties can be modified to reference either an organization or an individual. It could be considered that both the issuer and recipient profile have similar optional properties so that there is flexibility in describing both profiles. This way, an organization could also be described as the recipient. -

Goal of the Primary Actor:

Actors:

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.11 Endorsement

Ralph has been issued a verifiable credential badge for his most recent position at the hospital where he works by the hospital. The badge contains alignments to the skills related to his role. He requests that his peers endorse the skills he has acquired. A platform is able to communicate this request to peers, facilitate review of the skills, and process the issuance of endorsement VC badges that reference the original badge, colleagues as endorsers, and Ralph as the recipient.

Editor's note
-New to v3.0: In 2.0, an endorsement is its own type of badge. This could be the same in 3.0 but also, an endorsement could be a response from a verifier. In the example above, the platform verifies the badge the data and then acts as an issuer of endorsements on behalf of its users. This would be closer to how endorsements are used in 2.0 but applicable to 3.0. It could also be that the platform uses AI to process the badge and sends an endorsement back to Ralph as a proof of acceptance and an evaluation of his badge. -

Goal of the Primary Actor:

Actors:

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.12 Single Skill Assertion

From her school's LMS, Dr. Cara chooses which skills and competencies will be taught in her class. These skills and competencies are aligned with the rubric in the syllabus that is presented to her students. Once the students have successfully completed the course, Dr. Cara assesses each student's assignments and participation and selects which skills and competencies were met and at what level. The selection of skills and competencies triggers an issuing of a skill assertion for each one and includes the assessment results in the evidence and results. The skill assertions are associated with the student's IDs, the students are notified and informed how they can use these skill assessments to inform their choice of classes in the future.

Editor's note
-New to v3.0: Single skill assertions are new to 3.0. They do not require a badge class, badge image, etc. -

Goal of the Primary Actor:

Actors:

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.13 Re-issue a <= 3.0 Badge to a 3.0 Badge

Leo earned several badges while in highschool and graduates soon. The email address used as the recipient identity for these badges was an email address provided by his high school and he will no longer have access to it. Leo downloads a digital wallet and requests that the school reissue the badges to the identifier he created in the wallet.

Editor's note
-New to v3.0: The use of VC wallets, and decentralized identifiers are different in 3.0. -

Goal of the Primary Actor:

Actors:

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.14 Badge Class Status

An institution has issued hundreds of badges in the form of VCs. A situation has arisen that requires the badge class to be effectively deleted or purged from the ecosystem. It is impractical (and arguably inaccurate) to revoke each assertion with individual records in perpetuity. The institution would like to set a status such that the badge class itself is treated as invalid.

Goal of the Primary Actor:

Actors:

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

3.15 Authorization to Issue Given by Creator to Issuer

The data model attributes the issuer of a VC and the creator of the badge class separately.

Standards Organization X (SOX) has created a number of badges related to competencies they certify. SOX wants to authorize an accredited, certified training organization (CTO) to issue their credentials. An Open Badge Platform manages the granting of issuing rights to CTO by SOX and can issue verifiable credentials where CTO is the issuer and SOX is the creator inside the badge class.

Employer receives a credential from a graduate. Employer, in addition to verifying the VC in general, can review and verify that SOX did in fact authorize CTO to issue this badge.

Goal of the Primary Actor:

Actors:

Preconditions for this Use Case:

Flow of Events:

Post-Conditions/Success Criteria:

Points of Failure:

- -

4. Getting Started

This section is non-normative.

4.1 New to Open Badges

If you are new to Open Badges, please start here.

Note
-@@@TBD -

4.2 Migrating from Open Badges 2.x

If you are migrating from Open Badges 2.0 [OB-20] or 2.1 [OB-21] to OB 3.0, please start here.

Note
-@@@TBD -

4.2.1 Differences Between Version 2.0 and 3.0

4.2.2 Differences Between Version 2.1 and 3.0

- -

5. Open Badges Document Formats

Open Badges can be exchanged as JSON-LD documents as defined in this section, or by using the Open Badges API. Open Badges documents can be exchanged as a file or web resource, displayed as a QR code, or embedded in an image. The contents of an Open Badge document MUST meet the following criteria:

-
- Example 1: Sample AssertionCredential file contents -
{
-  "@context": [
-    "https://www.w3.org/2018/credentials/v1",
-    "https://imsglobal.github.io/openbadges-specification/context.json"
-  ],
-  "id": "http://example.edu/credentials/3732",
-  "type": ["VerifiableCredential", "AssertionCredential"],
-  "issuer": {
-    "id": "https://example.edu/issuers/565049",
-    "type": "Profile",
-    "name": "Example University"
-  },
-  "issuanceDate": "2010-01-01T00:00:00Z",
-  "credentialSubject": {
-    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21"
-  },
-  "credentialSchema": [{
-    "id": "https://imsum2.herokuapp.com/jsonschema?classId=org.1edtech.ob.v3p0.assertioncredential.class",
-    "type": "JsonSchemaValidator2020"
-  }]
-}
-

5.1 File Format

5.2 Web Resource

When the id of an Assertion is a URL, a GET request to that URL MUST return JSON representing an AssertionCredential as described above.

5.3 QR Code Format

Some Assertions are quite long. Due to the large size of the resulting JSON string, the string MUST be compressed prior to rendering the QR Code. To ensure interoperability, the string MUST be compressed using Concise Binary Object Representation (CBOR) [RFC8949].

Issue 2
- Is this even practical? -

5.4 Image Format

Issue 3: Baking an ObPresentation
-

- Can an ObPresentation be baked into an image? What are the implications? -

-

Assertions may be exchanged as image files with assertions encoded within. This allows assertions to be portable wherever image files may be stored or displayed.

"Baking" is the process of taking an AssertionCredential and embedding it into the image, so that when a user displays the image on a page, software that is Open Badges or CLR-aware can automatically extract that Assertion data and perform the checks necessary to see if a person legitimately earned the achievement within the image. The image must be in either PNG or SVG format in order to support baking.

5.4.1 Technical Details

5.4.1.1 PNGs
5.4.1.1.1 Baking

An iTXt chunk should be inserted into the PNG with keyword openbadges. The text MUST be the JSON for the #org.1edtech.ob.v3p0.assertioncredential.class. Compression MUST NOT be used.

-
- Example 2: An example of creating a chunk (assuming an iTXt constructor) -
var chunk = new iTXt({
-  keyword: 'openbadges',
-  compression: 0,
-  compressionMethod: 0,
-  languageTag: '',
-  translatedKeyword: '',
-  text: JSON.stringify(assertion)
-})
-

An iTXt chunk with the keyword openbadges MUST NOT appear in a PNG more than once. When baking an image that already contains assertion data, the implementor may choose whether to pass the user an error or overwrite the existing chunk.

5.4.1.1.2 Extracting

Parse the PNG datastream until the first iTXt chunk is found with the keyword openbadges. The rest of the stream can be safely discarded. The text portion of the iTXt will be the JSON representation of a #org.1edtech.ob.v3p0.assertioncredential.class.

5.4.1.2 SVGs
5.4.1.2.1 Baking

First, Add an xmlns:openbadges attribute to the <svg> tag with the value "https://purl.imsglobal.org/ob/v3p0". Directly after the <svg> tag, add an <openbadges:assertion> tag.

The JSON representation of the AssertionCredential MUST go into the body of the tag, wrapped in <![CDATA[...]]>.

-
- Example 3: An example of a well baked SVG -
<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg"
-  xmlns:clr="https://purl.imsglobal.org/ob/v3p0"
-  viewBox="0 0 512 512">
-  <openbadges:assertion>
-    <![CDATA[
-      {
-        "@context": [
-          "https://www.w3.org/2018/credentials/v1",
-          "https://www.w3.org/2018/credentials/examples/v1"
-        ],
-        "id": "http://example.edu/credentials/3732",
-        "type": ["VerifiableCredential", "OpenBadge"],
-        "issuer": {
-          "id": "https://example.edu/issuers/565049",
-          "type": "IssuerProfile",
-          "name": "Example University"
-        },
-        "issuanceDate": "2010-01-01T00:00:00Z",
-        "credentialSubject": {
-          "id": "did:example:ebfeb1f712ebc6f1c276e12ec21"
-        }
-      }
-    ]]>
-  </openbadges:assertion>
-
-  <!-- rest-of-image -->
-</svg>
-

There MUST be only one <openbadges:assertion> tag in an SVG. When baking an image that already contains assertion data, the implementor may choose whether to pass the user an error or overwrite the existing tag.

5.4.1.2.2 Extracting

Parse the SVG until you reach the first <openbadges:assertion> tag. The rest of the SVG data can safely be discarded.

- - - -
-

6. Open Badges API

- -

- Open Badges can be exchanged using the API (application programming interface) defined here, or as - documents. -

-

- This specification defines a RESTful API protocol to be implemented by applications serving in the roles of - Client and Resource Server. The API uses OAuth 2.0 for authentication and granular resource-based permission - scopes. Please see the Open Badges Specification Conformance and Certification Guide v3.0 for a list of which endpoints must be implemented for certification. -

- -

- In addition to the documentation in this section, there are OpenAPI files for the - Open Badges API in both JSON and YAML format: -

- - -
-

6.1 Architecture

-
- Diagram showing the major components of the Open Badges API -
Figure 6 Diagram showing the major components of the Open Badges API
-
-

- There are five key components to the API architecture. -

-
-
User
-
- This is the user that owns the resources (badges) that are on the resource server. Also called a - Resource Owner. -
-
Web Browser
-
This is the web browser the user interacts with.
-
Client
-
- This is the web application that interacts with the resource server on behalf of the user. Also called - Consumer in the IMS Global Security Framework v1.1. -
-
Authorization Server
-
- This is a server that implements the OAuth 2.0 endpoints on behalf of - the resource server. In many systems, the authorization server and the resource server are - combined. -
-
Resource Server
-
- This is the server that has the protected resources (badges). Also called Provider in the IMS Global Security Framework v1.1. -
-
-

- The role of each component during Registration, Obtaining Tokens, and Authenticating with Tokens are described - below. -

-
- -
-

6.2 Security

-

- All of the API endpoints are protected by OAuth 2.0 access tokens as described in § 7. Open Badges API Security. -

- -

Scopes

- -

- Each endpoint requires an access token with a specific Open Badges scope as shown below. -

- - - - - - - - - - - - - - - - - - - - - - - - - -
OperationScope
getAssertions - https://purl.imsglobal.org/spec/ob/v3p0/scope/assertion.readonly - - Permission to read assertions for the authenticated entity. -
postAssertion - https://purl.imsglobal.org/spec/ob/v3p0/scope/assertion.create - - Permission to create assertions for the authenticated entity. -
getProfile - https://purl.imsglobal.org/spec/ob/v3p0/scope/profile.readonly - - Permission to read the profile for the authenticated entity. -
postProfile - https://purl.imsglobal.org/spec/ob/v3p0/scope/profile.update - - Permission to update the profile for the authenticated entity. -
-
- -
-

6.3 REST Endpoints

- -

All endpoint requests MUST be made over secure TLS 1.2 or 1.3 protocol.

- - -
-

6.3.1 getAssertions

-

- Fetch Assertions from the resource server for the supplied parameters and access token. -

- -

Request Format

- -

GET {baseUrl}/ims/ob/v3p0/assertions?limit={limit}&offset={offset}&since={since}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
URL ParameterParameter TypeDescriptionRequired
baseUrlURLThe HTTP scheme (which MUST be "https"), domain name, and any other path - elements required by the resource server (e.g. "https://example.com/tenant"). - Required
limitPositiveIntegerThe maximum number of Assertions to return.Optional
offsetNonNegativeInteger - The index of the first Assertion to return. (zero indexed)Optional
sinceDateTimeOnly include Assertions issued after this timestamp.Optional
- -

Request Headers

- - - - - - - - - - - - - - - - - - - - - -
Request HeaderDescriptionRequired
Authorization: Bearer <access_token>See § 7. Open Badges API Security for information on how to obtain an access_token.Required
Accept: application/ld+json - If the content type application/ld+json is not not included in the Accept - header, the resource server MUST respond with 406 Not Acceptable. - Required
- -

Request Payload

- -

There is no request payload.

- -

Sample Request

- -
-
- Example 4: Sample getAssertions Request -
GET {tenant}/ims/ob/v3p0/assertions?limit=2&offset=0 HTTP/1.1
-Host: example.com
-Authorization: Bearer 863DF0B10F5D432EB2933C2A37CD3135A7BB7B07A68F65D92
-Accept: application/ld+json
-
- -

Responses

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP Status CodePayload TypeDescriptionPayload Required
200ObPresentation'OK' - The assertions are returned in the payload.Required
400Imsx_StatusInfo - 'Bad Request' - The request was invalid or cannot be served. The exact error should be explained - in the response payload. - Required
401Imsx_StatusInfo'Unauthorized' - The request requires user authentication.Required
403Imsx_StatusInfo - 'Forbidden' - The resource server understood the request, but is refusing it or the access - is - not allowed. - Required
404Imsx_StatusInfo'Not Found' - There is no CLR behind the URI.Required
406Imsx_StatusInfo - 'Not Acceptable' - The request did not include 'application/ld+json' in the Accept - header. - Required
421Imsx_StatusInfo - 'Misdirected Request' - The request was not made over secure TLS 1.2 or 1.3 protocol. - Required
- -

Response Headers

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Response HeaderDescriptionRequired
Content-Type: application/ld+jsonThe content type MUST be application/ld+json.Required
X-Total-Count: <total_count> - The resource server MUST include an X-Total-Count response header if the total result - count is known. If the total result count is not known, the total count header MUST be ommitted. - Conditionally Required for 200 OK Response
Link: <pagination_links> - The resource server MUST include a - Link response - header if the list of assertions in the response is incomplete; and MAY include the Link - header if the response is complete. - Conditionally Required for 200 OK Response
-

- If present, the Link header MUST support all of the following link relations (rel - values): -

- - - - - - - - - - - - - - - - - - - - - - - - - -
RelationDescription
next - The link relation for the immediate next page of results. This MUST appear when the current list - response - is incomplete. -
lastThe link relation for the last page of results. This MUST always appear.
firstThe link relation for the first page of results. This MUST always appear.
prev - The link relation for the immediate previous page of results. This MUST appear when the - offset is greater than zero. -
- -

Sample Response

- -
-
- Example 5: Sample getAssertions Response (line breaks for clarity) -
HTTP/1.1 200 OK
-Content-Type: application/ld+json
-X-Total-Count: 1
-Link: <https://www.imsglobal.org/ims/ob/v3p0/assertions?limit=2&offset=1>; rel="next",
-      <https://www.imsglobal.org/ims/ob/v3p0/assertions?limit=2&offset=0>; rel="last",
-      <https://www.imsglobal.org/ims/ob/v3p0/assertions?limit=2&offset=0>; rel="first",
-      <https://www.imsglobal.org/ims/ob/v3p0/assertions?limit=2&offset=0>; rel="prev"
-
-{
-  "@context": [
-    "https://www.w3.org/2018/credentials/v1",
-    "https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.jsonld"
-  ],
-  "type": ["VerifiablePresentation", "ObPresentation"],
-  "verifiableCredential": [
-    {
-      "@context": [
-        "https://www.w3.org/2018/credentials/v1",
-        "https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.jsonld"
-      ],
-      "id": "http://example.edu/credentials/3732",
-      "type": ["VerifiableCredential", "AssertionCredential"],
-      "issuer": {
-        "id": "https://example.edu/issuers/565049",
-        "type": "Issuer",
-        "name": "Example University"
-      },
-      "issuanceDate": "2010-01-01T00:00:00Z",
-      "credentialSubject": {
-        "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
-        "achievement": "urn:uuid:dd887f0a-56cb-11ec-bf63-0242ac130002",
-      }
-    }
-  ]
-}
-
-
- - -
-

6.3.2 postAssertion

-

Create or update an Assertion on the resource server.

-

- If the resource server is holding an Assertion with the same id, it will be updated. Otherwise - the Assertion will be created and held by the resource server. Note that "created" is not the same - as "issued". The resource server will simply store the Assertion in the request payload as a - resource. -

- -

Request Format

- -

POST {baseUrl}/ims/ob/v3p0/assertions

- - - - - - - - - - - - - - - - - -
URL ParameterParameter TypeDescriptionRequired
baseUrlURL - The HTTP scheme (which MUST be "https"), the domain name, and any other path elements required - by the resource server (e.g. "https://example.com/tenant"). - Required
- -

Request Headers

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Request HeaderDescriptionRequired
Authorization: Bearer <access_token>See § 7. Open Badges API Security for information on how to obtain an access_token.Required
Accept: application/ld+json - If the content type application/ld+json is not not included in the Accept - header, the resource server MUST respond with 406 Not Acceptable. - Required
Content-Type: application/ld+json - If the Content-Type is not application/ld+json, the resource server MUST - respond with 406 Not Acceptable. - Required
- -

Request Payload

- - - - - - - - - - - - - - - - -
Request Payload TypeDescriptionRequired
AssertionCredential - The Assertion to be updated or created on the resource server. -
Issue 4
- Should the payload be a VerifiablePresentation that contains the AssertionCredential? -
-
Required
- -

Sample Request

- -
-
- Example 6: Sample postAssertion Request -
POST {tenant}/ims/ob/v3p0/assertions HTTP/1.1
-Host: example.com
-Authorization: Bearer 863DF0B10F5D432EB2933C2A37CD3135A7BB7B07A68F65D92
-Accept: application/ld+json
-Content-Type: application/ld+json
-
-{
-  "@context": [
-    "https://www.w3.org/2018/credentials/v1",
-    "https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.jsonld"
-  ],
-  "id": "http://example.edu/credentials/3732",
-  "type": ["VerifiableCredential", "AssertionCredential"],
-  "issuer": {
-    "id": "https://example.edu/issuers/565049",
-    "type": "Publisher",
-    "name": "Example University"
-  },
-  "issuanceDate": "2010-01-01T00:00:00Z",
-  "credentialSubject": {
-    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
-    "achievement": "urn:uuid:a7467ef6-56cb-11ec-bf63-0242ac130002"
-  }
-}
-
- -

Responses

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP Status CodePayload TypeDescriptionPayload Required
200AssertionCredential - 'OK' - The Assertion was successfully updated. The response payload MUST be the Assertion that - was - posted. - Required
201AssertionCredential - 'Created' - The Assertion was successfully created. The response payload MUST be the Assertion - that was posted. - Required
400Imsx_StatusInfo - 'Bad Request' - The request was invalid or cannot be served. The exact error should - be explained in the response payload. - Required
401Imsx_StatusInfo'Unauthorized' - The request requires user authentication.Required
403Imsx_StatusInfo - 'Forbidden' - The resource server understood the request, but is refusing it or the access - is - not allowed. - Required
405Imsx_StatusInfo'Method Not Allowed' - The resource server does not support this operation.Required
406Imsx_StatusInfo - 'Not Acceptable' - The request did not include 'application/ld+json' in the Accept - header. - Required
421Imsx_StatusInfo - 'Misdirected Request' - The request was not made over secure TLS 1.2 or 1.3 protocol. - Required
- -

Response Headers

- - - - - - - - - - - - - - - - -
Response HeaderDescriptionRequired
Content-Type: application/ld+jsonThe content type MUST be application/ld+json.Required
- -

Sample Response

- -
-
- Example 7: Sample postAssertion Response -
{
-  "@context": [
-    "https://www.w3.org/2018/credentials/v1",
-    "https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.jsonld"
-    ],
-  "id": "http://example.edu/credentials/3732",
-  "type": ["VerifiableCredential", "AssertionCredential"],
-  "issuer": {
-    "id": "https://example.edu/issuers/565049",
-    "type": "Publisher",
-    "name": "Example University"
-  },
-  "issuanceDate": "2010-01-01T00:00:00Z",
-  "credentialSubject": {
-    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
-    "achievement": "urn:uuid:a7467ef6-56cb-11ec-bf63-0242ac130002"
-  }
-}
-
-
- - - -
-

6.3.3 getProfile

- -

- Fetch the profile from the resource server for the supplied access token. -

- -

Request Format

- -

GET {baseUrl}/ims/ob/v3p0/profile

- - - - - - - - - - - - - - - - - -
URL ParameterParameter TypeDescriptionRequired
baseUrlURLThe HTTP scheme (which MUST be "https"), domain name, and any other path - elements required by the resource server (e.g. "https://example.com/tenant"). - Required
- -

Request Headers

- - - - - - - - - - - - - - - - - - - - - -
Request HeaderDescriptionRequired
Authorization: Bearer <access_token>See § 7. Open Badges API Security for information on how to obtain an access_token.Required
Accept: application/ld+json - If the content type application/ld+json is not not included in the Accept - header, the resource server MUST respond with 406 Not Acceptable. - Required
- -

Request Payload

- -

There is no request payload.

- -

Sample Request

- -
-
- Example 8: Sample getProfile Request -
GET {tenant}/ims/ob/v3p0/profile HTTP/1.1
-Host: example.com
-Authorization: Bearer 863DF0B10F5D432EB2933C2A37CD3135A7BB7B07A68F65D92
-Accept: application/ld+json
-
- -

Responses

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP Status CodePayload TypeDescriptionPayload Required
200Profile'OK' - The matching profile.Required
400Imsx_StatusInfo - 'Bad Request' - The request was invalid or cannot be served. The exact error should be explained - in the response payload. - Required
401Imsx_StatusInfo'Unauthorized' - The request requires user authentication.Required
403Imsx_StatusInfo - 'Forbidden' - The resource server understood the request, but is refusing it or the access - is - not allowed. - Required
404Imsx_StatusInfo'Not Found' - There is no matching profile.Required
406Imsx_StatusInfo - 'Not Acceptable' - The request did not include 'application/ld+json' in the Accept - header. - Required
421Imsx_StatusInfo - 'Misdirected Request' - The request was not made over secure TLS 1.2 or 1.3 protocol. - Required
- -

Response Headers

- - - - - - - - - - - - - - - - -
Response HeaderDescriptionRequired
Content-Type: application/ld+jsonThe content type MUST be application/ld+json.Required
- -

Sample Response

- -
-
- Example 9: Sample getProfile Response -
HTTP/1.1 200 OK
-Content-Type: application/ld+json
-
-{
-  "@context": [
-    "https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.jsonld"
-  ],
-  "type": "Profile",
-  "id": "https://example.edu/issuers/565049",
-  "name": "Example University"
-}
-
-
- - -
-

6.3.4 postProfile

- -

Update the Profile on the resource server for the authenticated entity.

-

- The request SHOULD only include profile identifier properties to be added to the profile, not any existing data. - The values may never become part of the published profile. -

- -

Request Format

- -

POST {baseUrl}/ims/ob/v3p0/profile

- - - - - - - - - - - - - - - - - -
URL ParameterParameter TypeDescriptionRequired
baseUrlURL - The HTTP scheme (which MUST be "https"), the domain name, and any other path elements required - by the resource server (e.g. "https://example.com/tenant"). - Required
- -

Request Headers

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Request HeaderDescriptionRequired
Authorization: Bearer <access_token>See § 7. Open Badges API Security for information on how to obtain an access_token.Required
Accept: application/ld+json - If the content type application/ld+json is not not included in the Accept - header, the resource server MUST respond with 406 Not Acceptable. - Required
Content-Type: application/ld+json - If the Content-Type is not application/ld+json, the resource server MUST - respond with 406 Not Acceptable. - Required
- -

Request Payload

- - - - - - - - - - - - - - - - -
Request Payload TypeDescriptionRequired
Profile - The profile to be updated resource server. The profile SHOULD only include properties to be added to - the profile, not any existing data. - Required
- -

Sample Request

- -
-
- Example 10: Sample postProfile Request -
POST {tenant}/ims/ob/v3p0/profile HTTP/1.1
-Host: example.com
-Authorization: Bearer 863DF0B10F5D432EB2933C2A37CD3135A7BB7B07A68F65D92
-Accept: application/ld+json
-Content-Type: application/ld+json
-
-{
-  "@context": [
-    "https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.jsonld"
-  ],
-  "telephone": "111-222-3333"
-}
-
- -

Responses

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP Status CodePayload TypeDescriptionPayload Required
200Profile - 'OK' - The Profile will be updated. The response payload MUST be the same as GET Profile and may - not include the patched values (as the resource server may be waiting for asynchronous processes to - complete before accepting the values). - Required
400Imsx_StatusInfo - 'Bad Request' - The request was invalid or cannot be served. The exact error should be explained - in the response payload. A resource server MAY respond with 400 Bad Request to reject - data that is known immediately to not be acceptable by the platform, e.g. to reject a "telephone" - property - if the Provider cannot validate telephone numbers. - Required
401Imsx_StatusInfo'Unauthorized' - The request requires user authentication.Required
403Imsx_StatusInfo - 'Forbidden' - The resource server understood the request, but is refusing it or the access - is - not allowed. - Required
405Imsx_StatusInfo'Method Not Allowed' - The resource server does not support this operation.Required
406Imsx_StatusInfo - 'Not Acceptable' - The request did not include 'application/ld+json' in the Accept - header. - Required
421Imsx_StatusInfo - 'Misdirected Request' - The request was not made over secure TLS 1.2 or 1.3 protocol. - Required
- -

Response Headers

- - - - - - - - - - - - - - - - -
Response HeaderDescriptionRequired
Content-Type: application/ld+jsonThe content type MUST be application/ld+json.Required
- -

Sample Response

- -
-
- Example 11: Sample postProfile Response -
{
-  "@context": [
-      "https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.jsonld"
-  ],
-  "type": "Profile",
-  "id": "https://example.edu/issuers/565049",
-  "name": "Example University"
-}
-
-
-
- -
-

6.4 Retry Behavior

-

- Receivers of requests MAY implement a Retry-After header to indicate a period of time to wait before - attempting the request again. -

-

- If no Retry-After header is present and the response is non-2XX, it is recommended to retry the - request in 30 minutes for an additional two attempts. After which, it MAY be desirable to alert the recipient that - there is an issue with the connection (e.g. perhaps they need to reauthenticate or manually trigger the request - when they believe services are back up). -

-
-
- - - - - -
-

7. Open Badges API Security

-

- In scenarios where the learner or another third party is the user that owns the resources (badges), - there will not be a pre-established trust relationship. Therefore you MUST use of OAuth 2.0 Authorization - Code Grant. -

-

- The Open Badges API endpoints use the method outlined in Section 4.2, "Using OAuth 2.0 Authorization Code - Grant" of the IMS Global Security Framework v1.1 to secure the API endpoints. This section describes the how Authorization - Code Grant is implemented for the Open Badges API. -

- - -
-

7.1 Using OAuth 2.0 Authorization Code Grant

-

- Making a secured Open Badges API request using authorization code grant comprises three steps: -

-
    -
  1. - § 7.1.1 Dynamic Client Registration - Share configuration information between the client and the server. - This is typically done only once unless the registration is revoked. -
  2. -
  3. - § 7.1.2 Obtaining Tokens - Obtain an authorization code using a choreography between the client, web browser, user, and authorization server. Then request an access token by sending a request, - using the previously obtained authorization code, to the Access Token service endpoint. -
  4. -
  5. - § 7.1.3 Authenticating with Tokens - Use the access token in the Authorization header of the API request. -
  6. -
- - -
-

7.1.1 Dynamic Client Registration

-

- To get started, the client and authorization server MUST share the four pieces of information - shown below using the OAuth 2.0 Dynamic Client Registration Protocol [RFC7591] as described in this - section. -

-
-
client_id
-
- This is the public identifier for the communication exchange. Also called a Secret in the - IMS Global Security Framework v1.1. -
-
client_secret
-
- This is the shared secret for the communication exchange. Also called a Secret in the IMS Global Security Framework v1.1. -
-
List of Scopes
-
- The list of scopes that identify the set of endpoints for which access permission is being - requested. -
-
OAuth 2.0 Access Token Service Endpoint
-
- The endpoint from which the approved, requesting client can obtain an access token. -
-
-

- If the client and authorization server support Token Revocation, they should also share: -

-
-
OAuth 2.0 Revocation Service Endpoint
-
- The endpoint a client can use to revoke an access token. -
-
-

There are two steps to dynamic client registration:

-
    -
  1. Request a Service Description Document (SDD) from the resource server
  2. -
  3. Register with the authorization server
  4. -
-
- Sequence diagram for registration -
Figure 7 Sequence diagram for dynamic client registration
-
-

- The client only needs to register a client_id with the authorization server - once. Each user will use the same client_id when they request their own - authorization code. -

- -

Request the Service Description Document

- -

- To start the registration process, the user supplies the client with the resource server's base URL. When presented with an unknown resource server the client MUST request - the resource server's Service Description Document (SDD) at the path - {baseUrl}/ims/ob/v3p0/discovery. Rate-limited access to this endpoint is RECOMMENDED. - An example request for an SDD takes the form of: -

-
-
- Example 12: Sample request for a service description document -
GET /tenant/ims/ob/v3p0/discovery HTTP/1.1
-Host: example.com
-Accept: application/json
-
-

- Access to the discovery endpoint MUST NOT be protected. The SDD MUST be provided over HTTPS with TLS - 1.2 or 1.3. -

-

- The response to this request is the SDD supplied as a JSON encoded payload. The structure and format - of this payload MUST follow that of the OpenAPI 3.0 Specification [OPENAPIS-3.0]. The SDD supplied - MUST be a profiled version of the OpenAPI 3.0 (JSON) file provided with this specification (see - § 1.2.1 OpenAPI 3.0 Files for the Badge Connect API). The profiled version contains all of the details about the supported set of - service end-points, the supported optional data fields, definitions of the proprietary data fields - supplied using the permitted extension mechanisms, definitions of the available proprietary - endpoints, and information about the security mechanisms. -

-

- The x-imssf-privacyPolicyUrl property is inserted into the securitySchemes - within the components section of the OpenAPI file structure. This is an IMS controlled - extension to the OpenAPI specification. -

- - - - - - - - - - - - - - - - - -
Property NameTypeDescriptionRequired
x-imssf-privacyPolicyUrlURLA fully qualified URL to the resource server's privacy policy.Required
-

- The x-imssf-image and x-imssf-privacyPolicy properties are inserted into - the info section of the OpenAPI file structure. These are also IMS controlled - extensions to the OpenAPI specification. Also note that the standard title and - termsOfService property is required in a Service Description Document. These may be - displayed to the user during the registration process. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Property NameTypeDescriptionRequired
x-imssf-imageURI - An image representing the resource server. May be a Data URI or the URL where the - image may be found. - Optional
x-imssf-privacyPolicyUrlURLA fully qualified URL to the resource server's privacy policy.Required
titleStringThe name of the resource server.Required
termsOfServiceURLA fully qualified URL to the resource server's terms of service.Required
-
-
- Example 13: Sample response with a Service Discovery Document -
HTTP/1.1 200 OK
-Content-Type: application/json; charset=utf-8
-
-...
-"info": {
-	"x-imssf-image": "https://example.com/logo",
-	"x-imssf-privacyPolicy": "https://example.com/privacy",
-	"title": "Example",
-	"termsOfService": "https://example.com/tos",
-	...
-},
-...
-"components": {
-	"securitySchemes": {
-		"OAuth2ACG": {
-			"type": "oauth2",
-			"description": "OAuth 2.0 Authorization Code Grant authorization",
-			"x-imssf-registrationUrl": "example.com/registration",
-			"flows": {
-				"authorizationCode": {
-					"tokenUrl": "example.com/token",
-					"authorizationUrl": "example.com/authorize",
-					"refreshUrl": "example.com/token",
-					"scopes": {
-						"https://purl.imsglobal.org/spec/ob/v3p0/scope/assertion.update" : "...",
-						"https://purl.imsglobal.org/spec/ob/v3p0/scope/assertion.readonly" : "...",
-						"https://purl.imsglobal.org/spec/ob/v3p0/scope/profile.readonly" : "...",
-						"https://purl.imsglobal.org/spec/ob/v3p0/scope/profile.update" : "..."
-					}
-				}
-			}
-		}
-	},
-	"schemas": {
-		...
-	}
-}
-...
-
-

- Upon receiving a SDD from a resource server, the client SHOULD respect the Cache-Control and - Expires headers if present in the response and configure local cache to match the directives it - declares. If directives include one of no-cache, no-store, the client - SHOULD NOT cache the data for future interactions. If directives include max-age or if - an Expires header is present, the client SHOULD cache the SDD data, if valid, up to the - expiration indicated, either at the time indicated by the Expires header or max-age seconds from - request time. -

-

- An Etag header MAY be offered with the SDD response. If so, after a resource's declared expiration, - a client MAY include an If-None-Match header containing the value of the Etag to - check if the resource is still fresh. If so the resource server may return a - 304 Not Modified response status code, and a new Expires or - Cache-Control header MAY be included, which the client SHOULD use to update the - cache expiration. -

- -

Register with Authorization Server

- -

- With the Registration URL in hand (the value of the x-imssf-registrationUrl property of - the SDD), the client SHOULD post a registration request to the authorization server. The - registration request MUST comply with OAuth 2.0 Dynamic Client Registration Protocol [RFC7591]. - The registration request MUST NOT require an Initial Access Token. Use of the 'Software Statement' - is NOT RECOMMENDED. The client registration request is sent to the Client Registration URL. The - request MUST be sent using HTTPS with TLS 1.2 or 1.3 protocol. -

-

- The properties of the JSON body MUST be implemented as described in the following table. All URLs - MUST use HTTPS (e.g. https://example.com/logo.png) and all URLs MUST have the same hostname. All - required properties MUST be present in the registration request in order for it to be accepted by - the authorization server. Arrays MUST be used even when a single value is to be sent. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionRequired
client_nameStringThe human-readable name of the client application.Required
client_uriURLA page that which describes the client application.Required
logo_uriURL - The logo of the client application. If present, the authorization server SHOULD - display this image to the end-user during approval. The value of this field MUST point - to a valid image file. - Required
tos_uriURL - The human-readable Terms of Service for the client application that describes a - contractural relationship between the end-user and the client that the end-user accepts - when authorizing the client. - Required
policy_uriURL - The human-readable Privacy Policy for the client application that describes how the - deployment organization collects, uses, retains, and discloses personal data. - Required
software_idString - A unique idenfitier assigned by the client application developer or software - published used by registration endpoints to identify the client application to be - dynamically registered. As described in [rfc7591], it SHOULD remain the same for all - instances of the client application software. - Required
software_versionString - A version identifier string for the client application software identifies by - software_id. The value of software_version SHOULD change on - any update to the client application software identified by the same - software_id. - Required
redirect_urisURL[]Array of redirection URI strings for use in the OAuth 2.0 flow.Required
scopeString - In the registration request, this is a string containing a space-separated list of scope - values that this client application may include when requesting access tokens. If - omitted, the authorization server MAY register a client application with a - default set of scopes. In the registration response, this is a list of scopes the - authorization server supports. -

- The list of scopes that can be requested are shown in § Scopes. -

-
Required
token_endpoint_auth_methodString - String indicator of the requested authentication method for the token endpoint. In this - specification only "client_secret_basic" is allowed: -
    -
  • - "client_secret_basic": The client application uses the HTTP Basic - authentication method as defined in OAuth 2.0. -
  • -
- If omitted, the default is "client_secret_basic". -
Optional
grant_typesString[] - Array of OAuth 2.0 grant type strings. In this specification only "authorization_code" - and refresh_token" are allowed: -
    -
  • - "authorization_code": The authorization code grant type defined in OAuth - 2.0. -
  • -
  • - "refresh_token": The refresh token grant type defined in OAuth 2.0. -
  • -
- If omitted, the default behavior is that the client will use only the - "authorization_code" grant type. -
Optional
response_typesString[] - Array of OAuth 2.0 response type strings. In this specification only "code" is allowed: -
    -
  • "code": The authorization code response type defined in OAuth 2.0.
  • -
- If omitted, the default is that the client will use only the "code" response type. -
Optional
contactsString[] - Array of strings representing ways to contact people responsible for this client, - typically email addresses. The authorization server MAY make these contact addresses - available to end-users for support requests for the client application. Privacy - constraints MUST be supported as applicable. - Optional
-
-
- Example 14: Sample registration request -
	POST /connect/register HTTP/1.1
-	Host: auth.example.com
-	Accept: application/json
-	Content-Type: application/json; charset=utf-8
-	
-	{
-		"client_name": "Example Client Application",
-		"client_uri": "https://client.example.com/",
-		"logo_uri": "https://client.example.com/logo.png",
-		"tos_uri": "https://client.example.com/terms",
-		"policy_uri": "https://client.example.com/privacy",
-		"software_id": "c88b6ed8-269e-448e-99be-7e2ff47167d1",
-		"software_version": "v4.0.30319",
-		"redirect_uris": [
-			"https://client.example.com/Authorize"
-		],
-		"token_endpoint_auth_method": "client_secret_basic",
-		"grant_types": [
-			"authorization_code",
-			"refresh_token"
-		],
-		"response_types": [
-			"code"
-		],
-		"scope": "https://purl.imsglobal.org/spec/ob/v3p0/scope/delete https://purl.imsglobal.org/spec/ob/v3p0/scope/assertion.readonly https://purl.imsglobal.org/spec/ob/v3p0/scope/replace offline_access"
-}
-
-

- If the authorization server accepts the registration request, it will store the information - provided in the request and respond HTTP 201 Created with a registration response that - includes a set of client credentials for the client application to use when requesting access - tokens. All the information provided by the client application MUST be returned to the - client application, including modifications to the properties as the authorization server - deems necessary. An example response looks like this: -

-
-
- Example 15: Sample registration response -
HTTP/1.1 201 Created
-Content-Type: application/json; charset=utf-8
-
-{
-	"client_id": "4ad36680810420ed",
-	"client_secret": "af7aa0d679778e12",
-	"client_id_issued_at": 1565715850,
-	"client_secret_expires_at": 1597338250,
-	"client_name": "Example Client Application",
-	"client_uri": "https://client.example.com/",
-	"logo_uri": "https://client.example.com/logo.png",
-	"tos_uri": "https://client.example.com/terms",
-	"policy_uri": "https://client.example.com/privacy",
-	"software_id": "c88b6ed8-269e-448e-99be-7e2ff47167d1",
-	"software_version": "v4.0.30319",
-	"redirect_uris": [
-		"https://client.example.com/Authorize"
-	],
-	"token_endpoint_auth_method": "client_secret_basic",
-	"grant_types": [
-		"authorization_code",
-		"refresh_token"
-	],
-	"response_types": [
-		"code"
-	],
-	"scope": "https://purl.imsglobal.org/spec/ob/v3p0/scope/delete https://purl.imsglobal.org/spec/ob/v3p0/scope/assertion.readonly https://purl.imsglobal.org/spec/ob/v3p0/scope/replace offline_access"
-}
-
-

- The following table describes the properties present in the client registration response that were - not included in the request. These are all REQUIRED properties. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionRequired
client_idString - An OAuth 2.0 client identifier string. The value SHOULD NOT be currently valid for any - other registered client. - Required
client_secretStringAn OAuth 2.0 client secret string.Required
client_id_issued_atNonNegativeInteger - - The time at which the client_id was issued. The time is represented as the number of - seconds from 1970-01-01T00:00:00Z as measured in UTC until the date/time of issuance. - Required
client_secret_expires_atNonNegativeInteger - - The time at which the client_secret will expire. MAY be 0 for no - expiration. The time is represented as the number of seconds from 1970-01-01T00:00:00Z - as measured in UTC until the date/time of expiration. - Required
-

- When a registration error condition occurs, the authorization server returns an HTTP 400 status code - (unless otherwise specified) with content type "application/json" consisting of a JSON object - describing the error in the response body. The properties used are: -

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionRequired
errorRegistrationErrorThe error.Required
errorASCII StringHuman-readable ASCII text description of the error used for debugging.Optional
- -
- - -
- -

7.1.2 Obtaining Tokens

- -
- Sequence diagram for obtaining access tokens when using the ACG flow -
Figure 8 Sequence diagram for obtaining access tokens when using the ACG flow
-
-

- Obtaining an access token using an authorization code has two steps: -

- -

- Once obtained, the client can freely re-use the access token up until the token's expiry time, so - that the client need not repeat steps of obtaining an authorization code and requesting an access - token for every API request. Token refresh is also available (see § Token Refresh Request). -

- -
Authorization Request
- -

- After the client application is registered with the authorization server as described in - § 7.1.1 Dynamic Client Registration, the client application then MAY initiate an authorization request - as described in Section 4.2 of the IMS Security Framework [SEC-11] by redirecting the user to the - authorizationUrl as declared in the resource server's Service Description Document - (SDD). -

-

- In the OAuth 2.0 Security Best Practices document [OAUTH2-SBP] the use of Proof Key for Code - Exchange (PKCE) [RFC7636] is recommended in order to (with the help of the authorization server) detect and prevent attempts to inject (replay) authorization codes into the authorization - response. When using IMS specifications, PKCE MUST be used to protect Authorization Code Grant based - access. The PKCE has two stages: -

    -
  • - First the client MUST supply a code_challenge and - code_challenge_method in the request for an authorization code. The authorization server is responsible for associating the code_challenge with the issued - authorization code. -
  • -
  • - Then the client MUST supply the code_verifier in the Access Token Request, and - the authorization server verifies the code_verifier. -
  • -
-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter NameTypeDescriptionRequired
response_typeStringValue MUST be set to "code".Required
client_idString - The client application identifier. MUST be the client_id provided - in - the Dynamic Client Registration § Register with Authorization Server response. - Required
redirect_uriURL - The client application's redirection endpoint. MUST match one of the - redirect_uris in the § 7.1.1 Dynamic Client Registration request. Although this is - optional in the IMS Security Framework [SEC-11], it is REQUIRED by this - specification. - Required
scopeString - The scope of the authorization request. The authorization server is responsible - for - validating the scopes identified in the request and the response MUST include a - scope - parameter which confirms this list or comprises a subset of the services requested. - Required
stateString - An opaque value used by the client application to maintain state between the - request - and callback. The authorization server includes this value when redirecting the - web browser back to the client. This parameter MUST be used for preventing - cross-site request forgery. - Required
code_challengeStringThis is BASE64URL-ENCODE(SHA256(ASCII(code_verifier))).Required
code_challenge_methodString - This MUST have a value of "S256" to indicate the SHA256 code verifier transformation - method is used. - Required
-

- All of the authorization request parameters are encoded in the authorization request as query - string parameters. The request MUST be made by redirecting the browser to the OAuth 2.0 - Authorization endpoint. The request MUST use HTTPS with TLS 1.2 or 1.3 protocol. -

-
-
- Example 16: Sample ACG authorization request (line breaks for clarity) -
HTTP/1.1 302 Found
-Location: https://auth.example.com/authorize?
-	client_id=4ad36680810420ed
-	&response_type=code
-	&scope=https%3A%2F%2Fpurl.imsglobal.org%2Fspec%ob%2Fv3p0%2Fscope%2Fassertion.readonly%20offline_access
-	&redirect_uri=https%3A%2F%client.example.com%2FAuthorize
-	&state=26357667-94df-4a14-bcb1-f55449ddd98d
-	&code_challenge=XeDw66i9FLjn7XaecT_xaFyUWWfUub02Kw118n-jbEs
-	&code_challenge_method=S256
-
- -
Authorization Response
- -

- If the redirect_uri matches a known client_id, the authorization server SHOULD present a UI asking the user to authenticate themself and grant the access - request. The authorization server SHOULD display the client_name, - client_uri, logo_uri, tos_uri, and policy_uri - collected during Dynamic Client Registration to the user to help them decide whether to grant - the access request. -

-

- If the user authorizes the client application to access their resources with the requested - scopes, the authorization server MUST redirect the browser back to the redirect_uri - with the code, scope, and state query string parameters. -

-

- The Authorization Code MUST be used only once. A lifetime for the authorization code of 600 seconds - (10 minutes) is RECOMMENDED. If an authorization code is used more than once, the authorization server MUST deny the request and SHOULD revoke (when possible) all tokens previously issued based - on that authorization code. The authorization code is bound to the client identifier and - redirection URI. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter NameTypeDescriptionRequired
codeStringThe authorization code.Required
scopeString - The authorized scope for the access request (this MAY be a subset of the scopes in the - request). The value is a space delimited set of scopes. - Required
stateString - The opaque value supplied by the client to maintain state between the request and - callback. - Required
-
-
- Example 17: Sample ACG authorization response (line breaks for clarity) -
HTTP/1.1 302 Found
-Location https://client.example.com/Authorize?
-	code=dcf95d196ae04d60aad7e19d18b9af755a7b593b680055158b8ad9c2975f0d86
-	&scope=https%3A%2F%2Fpurl.imsglobal.org%2Fspec%ob%2Fv3p0%2Fscope%2Fassertion.readonly%20offline_access
-	&state=26357667-94df-4a14-bcb1-f55449ddd98d
-
- -
Authorization Error Response
- -

- If the authorization server does not recognize the client applications's redirection - endpoint from a prior connection with this client application, the authorization server - SHOULD inform the user of the error and MUST NOT automatically redirect to the web browser - to the invalid redirection URI. -

-

- If the user denies the authorization request or if the request fails for reasons other than a - missing or invalid redirection URI, the authorization server informs the client by adding - the following parameters to the query component of the redirection URI. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter NameTypeDescriptionRequired
errorAuthorizationError - A single ASCII [RFC20] error code from the AuthorizationError vocabulary. - Required
error_descriptionString - Human-readable ASCII [RFC20] text providing additional information, used to assist the - client developer in understanding the error that occurred. Values for the - "error_description" parameter MUST NOT include characters outside the set %x20-21 / - %x23-5B / %x5D-7E. -
error_uriURI - A URI identifying a human-readable web page with information about the error, used to - provide the client developer with additional information about the error. Values for the - "error_uri" parameter MUST conform to the URI-reference syntax and thus MUST NOT include - characters outside the set %x21 / %x23-5B / %x5D-7E. -
stateString - The opaque value supplied by the client to maintain state between the request and - callback. - Required
-
-
- Example 18: Sample authorization error response -
HTTP/1.1 302 Found
-Location: https://client.example.com/cb?error=access_denied&state=xyz
-
- -
Access Token Request
-

- With the supplied code, the client application SHOULD attempt to exchange the - code for an access_token. The client application makes an - authorization grant POST request to the tokenUrl as declared in the resource server's Discovery Document. The HTTP POST request MUST include a Basic authorization header with - the client_id and client_secret provided in the registration response. The - body of the token request MUST include the following form fields: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field NameTypeDescriptionRequired
grant_typeStringValue MUST be set to "authorization_code".Required
codeStringThe authorization code received from the authorization server.Required
redirect_uriURLThe client application's redirection endpoint.Required
scopeStringThe scope of the access request.Required
code_verifierStringThe PKCE code verifier.Required
-
-
- Example 19: Sample ACG token request (line breaks for clarity) -
POST /token HTTP/1.1
-Host: auth.example.com
-Authorization: Basic NDE2ZjI1YjhjMWQ5OThlODoxNWQ5MDA4NTk2NDdkZDlm
-Content-Type: application/x-www-form-urlencoded
-
-grant_type=authorization_code
-	&code=7c7a73263ee14b2b48073d0615f286ec74f6636689046cb8dbede0b5e87a1338
-	&redirect_uri=https%3A%2F%client.example.com%2FAuthorize
-	&scope=https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fob%2Fv3p0%2Fscope%2Fassertion.readonly+offline_access
-	&code_verifier=mYUQfKNgI1lSbY8EqtvNHLPzu0x%2FcVKO3fpWnX4VE5I%3D
-
- -
Access Token Response
- -

- If the authorization server grants this request (see Section 5.1 in [RFC6749] for the detailed - description), it returns HTTP 200 OK status code with content type "application/json" - consisting of a JSON object containing the access token and its expiry lifetime (IMS recommends a - default expiry lifetime of 3600 seconds, one hour, for access tokens), optionally a refresh token, - and confirms the set of scopes supported by the access token: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Property NameTypeDescriptionRequired
access_tokenStringThe access token issued by the authorization server.Required
token_typeStringThe type of the token issued. The case insensitive value MUST be "bearer".Required
scopeStringThe scope of the access token. This is a space-separated list of scopes.Required
expires_inPositiveInteger - The lifetime in seconds of the access token. For example, the value "3600" denotes that - the access token will expire in one hour from the time the response was generated. IMS - recommends a default expiry lifetime of 3600 seconds, one hour, for access tokens. If - omitted, the authorization server SHOULD provide the expiration time via other means or - document the default value. - Optional
refresh_tokenString - The refresh token, which can be used to obtain new access tokens using the same - authorization grant as described in § Token Refresh Request. - Optional
-
-
- Example 20: Sample ACG token response -
HTTP/1.1 200 OK
-Cache-Control: no-store, no-cache, max-age=0
-Pragma: no-cache
-Content-Type: application/json; charset=UTF-8
-
-{
-	"access_token": "863DF0B10F5D432EB2933C2A37CD3135A7BB7B07A68F65D92",
-	"refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
-	"expires_in": 3600,
-	"token_type": "Bearer",
-	"scope": "https://purl.imsglobal.org/spec/ob/v3p0/scope/assertion.readonly offline_access"
-}
-
- -
Access Token Error Response
- -

- The authorization server MAY decide not to issue an access token. This could be because the - request scopes are invalid, the credentials from the client may be invalid, etc. In this case the - authorization server MUST return an HTTP 400 Bad Request status code with content - type "application/json" consisting of a JSON object describing the error in the response body. The - properties used to describe the error are: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Property NameTypeDescriptionRequired
errorTokenErrorA single ASCII [RFC20] error code]. See Section 5.2 of [RFC6749].Required
error_descriptionASCIIString - Human-readable ASCII [RFC20] text providing additional information, used to assist the - client developer in understanding the error that occurred. Values for the - "error_description" parameter MUST NOT include characters outside the set %x20-21 / - %x23-5B / %x5D-7E. - Optional
error_uriURI - A URI identifying a human-readable web page with information about the error, used to - provide the client developer with additional information about the error. Values for the - "error_uri" parameter MUST conform to the URI-reference syntax and thus MUST NOT include - characters outside the set %x21 / %x23-5B / %x5D-7E. - Optional
-
-
- Example 21: Sample access token error response -
HTTP/1.1 400 Bad Request
-Content-Type: application/json;charset=UTF-8
-Cache-Control: no-store
-Pragma: no-cache
-
-{
-	"error": "invalid_request"
-}
-
-
- - - -
- -

7.1.3 Authenticating with Tokens

- -

- After obtaining an access_token and optionally a refresh_token using the - method above, a client application MAY issue request that access resources controlled by the - user on the resource server using the access_token in the HTTP Authorization header - [RFC2617] with a Bearer Token [RFC6750]. For example, a "getAssertions" - would look like this: -

-
-
- Example 22: Sample getAssertions request -
GET /tenant/ims/ob/v3p0/assertions HTTP/1.1
-Host: example.com 
-Authorization: Bearer 863DF0B10F5D432EB2933C2A37CD3135A7BB7B07A68F65D92
-Accept: application/ld+json
-
-
- -
- - -
-

7.2 Token Refresh

-

- The recommended value of the access token's expires_in attribute is 3600 i.e. one hour. This - means that the validity of the access token expires one hour after the time it was issued. -

-

- When requesting an access token as part of the Authorization Code Grant process, an authorization server - MAY return a 'Refresh Token'. The refresh token can be used to obtain an access token using the same - authorization grant: this is described in Section 6 of [RFC6749]. The use of the Refresh Token avoids the - choreography for obtaining the credentials to gain access to the authorization server. -

-

- An Authorization Server is NOT REQUIRED to support token refresh. -

- -

Token Refresh Request

- -

- If the access_token is expired or about to expire, and the client application received - a refresh_token, the client application can use OAuth 2.0 Token Refresh to get a new - access_token and refresh_token. -

-

- The client makes a refresh POST request to the token endpoint by adding the following parameters - using the "application/x-www-form-urlencoded" format in the HTTP request entity-body: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter NameTypeDescriptionRequired
grant_typeStringValue MUST be set to "refresh_token".Required
refresh_tokenStringThe refresh token issued to the client.Required
scopeString - The scope of the access request. The requested scope MUST NOT include any scope not - originally granted by the user, and if omitted is treated as equal to the scope - originally granted by the user. - Required
-
-
- Example 23: Sample ACG token refresh request (line breaks for clarity) -
POST /token HTTP/1.1
-Host: auth.example.com
-Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
-Content-Type: application/x-www-form-urlencoded
-
-grant_type=refresh_token
-	&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
-	&scope=https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fob%2Fv3p0%2Fscope%2assertion.readonly
-
- -

Token Refresh Response

- -

- If valid and authorized, the authorization server issues a new access token and optionally a new - refresh token as described earlier in § Access Token Response. If the request failed verification or - is invalid, the authorization server returns an error response as described earlier in - § Access Token Error Response. -

-
- - -
- -

7.3 Token Revocation

- -

- There may be deployments in which revocation of an access token is useful. The Token Revocation process is - based upon [RFC7009]. The client requests the revocation of a particular token by making an HTTP POST - request (using TLS) to the token revocation endpoint URL. Note that [RFC7009] states that implementations - MUST support the revocation of refresh tokens and SHOULD support the revocation of access tokens. -

- -

Token Revocation Request

- -

- The client constructs the request by including the following parameters using the - "application/x-www-form-urlencoded" format in the HTTP request entity-body: -

- - - - - - - - - - - - - - - - - - - - - - - -
Parameter NameTypeDescriptionRequired
tokenStringThe token that the client wants to get revoked.Required
token_type_hintStringMUST be set to either "access_token" or "refresh_token".Required
-
-
- Example 24: Sample token revocation request -
POST /revoke HTTP/1.1
-Host: auth.example.com
-Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
-Content-Type: application/x-www-form-urlencoded
-
-token=45ghiukldjahdnhzdauz&token_type_hint=refresh_token
-
- -

Token Revocation Response

- -

- The authorization server responds with HTTP 200 OK status code if the token has been - revoked successfully or if the client submitted an invalid token. -

-

- When the request for revocation is rejected, the authorization server returns an error response as - described earlier in § Access Token Error Response with an error code of "unsupported_token_type". -

-
- -
- - - -

8. Data Integrity

This section describes mechanisms for ensuring the authenticity and integrity of AssertionCredential documents and payloads. For general information about data integrity, please see Data Integrity 1.0.

8.1 Proofs

A data integrity proof is comprised of information about the proof, parameters required to verify it, and the proof value itself. Please see the Proof class for details.

To ensure interoperability, this specification requires conforming implementations support ...

8.1.1 [Proof One]

8.1.2 [Proof Two]

8.2 Algorithms

Issue 5
- See Algorithms. -

8.2.1 Proof Algorithm

Issue 6
- See Proof Algorithm. -

8.2.2 Proof Verification Algorithm

8.2.3 Create Verify Hash Algorithm

8.3 Security Considerations

- -

9. Best Practices and Implementation Guide

This section is non-normative.

9.1 Terminology

Some of the terms used in this section:

9.2 Support for Decentralized Identifiers (DIDs)

This specification supports the use of DID URLs as an identifier for the issuer and subject of a credential, and the holder of a presentation. This specification also supports the use of DID URLs to identify the public key used to verify verifiable credentials and verifiable presentations with Linked Data Proofs. Until the Decentralized Identifiers (DIDs) v1.0 specification is approved by W3C and this specification is updated, conformance will not require DID support.

- -

10. Conformance and Certification Guide

Note
-@@@TBD - Move to Open Badges Specification Conformance and Certification Guide v3.0 for Candidate Final -
- -

A. Serialization

The data model as described in Appendix § B. Data Model is the canonical structural representation of an Open Badges verifiable credential (AchievementCredential) and verifiable presentation (ObPresentation). All serializations are representations of that data model in a specific format. This section specifies how the data model is realized in JSON-LD and plain JSON.

A.1 JSON

The data model can be encoded in Javascript Object Notation (JSON) [RFC8259] by mapping property types in the Data Model to JSON types as follows:

When serializing the JSON, these rules MUST be followed:

A.2 JSON-LD

[JSON-LD] is a JSON-based format used to serialize Linked Data. The syntax is designed to easily integrate into deployed systems already using JSON, and provides a smooth upgrade path from JSON to [JSON-LD]. It is primarily intended to be a way to use Linked Data in Web-based programming environments, to build interoperable Web services, and to store Linked Data in JSON-based storage engines.

Instances of the data model are encoded in [JSON-LD] in the same way they are encoded in JSON (Section § A.1 JSON), with the addition of the @context property. The JSON-LD context is described in detail in the [JSON-LD] specification and its use is elaborated on in Section § C. Extensions.

Multiple contexts MAY be used or combined to express any arbitrary information about verifiable credentials in idiomatic JSON. The JSON-LD context for all verifiable credentials, available at https://www.w3.org/2018/credentials/v1, is a static document that is never updated and can therefore be downloaded and cached client side. The associated vocabulary document for the Verifiable Credentials Data Model is available at https://www.w3.org/2018/credentials. The JSON-LD context for Open Badges verifiable credentials is available at https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.jsonld. The associated vocabulary document for the Open Badges Data Model is available at https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.html. Open Badges verifiable credentials MUST be serialized with both JSON-LD contexts.

Note
- Though this specification requires that a @context property be present, it is not required that the value of the @context property be processed using JSON-LD. This is to support processing using plain JSON libraries, such as those that might be used when the verifiable credential is encoded as a JWT. All libraries or processors MUST ensure that the order of the values in the @context property is what is expected for the specific application. Libraries or processors that support JSON-LD can process the @context property using full JSON-LD processing as expected. -
-
- Example 25: JSON-LD @context serialization -
"@context": [
-  "https://www.w3.org/2018/credentials/v1",
-  "https://purl.imsglobal.org/spec/ob/v3p0/context/ob_v3p0.jsonld"
-]
-
- -
-

B. Data Model

- - -

B.1 org.1edtech.ob.v3p0.model

-

- The data models in this section are specific to Open Badges Specification v3.0. -

-
-

B.2 org.1edtech.ob.v3p0.model

-

- The data models in this section are shared by Open Badges Specification v3.0 and Comprehensive Learner Record Standard v2.0. -

-
-
-
- Example 26: Sample AssertionCredential -
{
-  "@context": [
-    "https://www.w3.org/2018/credentials/v1",
-    "https://imsglobal.github.io/openbadges-specification/context.json"
-  ],
-  "id": "http://example.edu/credentials/3732",
-  "type": ["VerifiableCredential", "AssertionCredential"],
-  "issuer": {
-    "id": "https://example.edu/issuers/565049",
-    "name": "Example University"
-  },
-  "issuanceDate": "2010-01-01T00:00:00Z",
-  "credentialSubject": {
-    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21"
-  },
-  "credentialSchema": [{
-    "id": "https://imsum2.herokuapp.com/jsonschema?classId=org.1edtech.ob.v3p0.assertioncredential.class",
-    "type": "JsonSchemaValidator2020"
-  }]
-}
-
-
-
-

B.3 org.1edtech.ob.v3p0.model

-

- The data models in this section are shared by all IMS service specifications. -

-
-

B.4 org.1edtech.ob.v3p0.model

-

- The data models in this section are shared by all IMS service specifications. -

-
-

B.5 org.1edtech.ob.v3p0.model

-

- The data models in this section are shared by all IMS specifications. -

-
-

B.6 org.1edtech.ob.v3p0.model

-

- The data models in this section are shared by all IMS specifications. -

-
- - -
- -

C. Extensions

C.1 Extending the Data Model

C.2 Extending Enumerated Vocabularies

C.3 Extending the API

- -

D. List of Figures

-

E. Issue Summary

-

Issue Summary

-
- -
-

F. Revision History

- - - - - - - - - - - - - - - - - -
StatusDoc VersionRelease DateComments
Base Document1.0Work in progress
-
- -
- This is a preview of the IMS Open Badges Specification v3.0 -

Do not attempt to implement this version of the specification. Do not - reference this version as authoritative in any way. -

-
- - - -

G. References

-

G.1 Normative references

-
[DATA-INTEGRITY]
Data Integrity 1.0. Manu Sporny; Dave Longley. Credentials Community Group. CG-DRAFT. URL: https://w3c-ccg.github.io/data-integrity-spec/
[OAUTH2-SBP]
OAuth 2.0 Security Best Current Practice (draft-ietf-oauth-security-topics-11. IETF. December 28, 2019. URL: https://datatracker.ietf.org/doc/draft-ietf-oauth-security-topics/
[OPENAPIS-3.0]
OpenAPI Specification 3.0. OpenAPI Initiative (Linux Foundation). July 2017. URL: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md
[RFC20]
ASCII format for network interchange. V.G. Cerf. IETF. October 1969. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc20
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC2617]
HTTP Authentication: Basic and Digest Access Authentication. J. Franks; P. Hallam-Baker; J. Hostetler; S. Lawrence; P. Leach; A. Luotonen; L. Stewart. IETF. June 1999. Draft Standard. URL: https://www.rfc-editor.org/rfc/rfc2617
[RFC6749]
The OAuth 2.0 Authorization Framework. D. Hardt, Ed.. IETF. October 2012. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6749
[RFC6750]
The OAuth 2.0 Authorization Framework: Bearer Token Usage. M. Jones; D. Hardt. IETF. October 2012. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6750
[RFC7009]
OAuth 2.0 Token Revocation. T. Lodderstedt, Ed.; S. Dronia; M. Scurtescu. IETF. August 2013. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7009
[RFC7591]
OAuth 2.0 Dynamic Client Registration Protocol. J. Richer, Ed.; M. Jones; J. Bradley; M. Machulak; P. Hunt. IETF. July 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7591
[RFC7636]
Proof Key for Code Exchange by OAuth Public Clients. N. Sakimura, Ed.; J. Bradley; N. Agarwal. IETF. September 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7636
[SEC-11]
IMS Global Security Framework v1.1. C. Smythe; C. Vervoort; M. McKell. IMS Global Learning Consortium. July 19th, 2021. IMS Final Release. URL: https://www.imsglobal.org/spec/security/v1p1/
-
-

G.2 Informative references

-
[CEDS]
Common Education Data Standards (CEDS) Version 7 Data Model Guide. URL: https://ceds.ed.gov/pdf/CEDS-7-0-Data-Model-Guide_for_508.pdf
[CLR-20]
Comprehensive Learner Record Standard v2.0. IMS Global Learning Consortium. IMS Base Document. URL: https://www.imsglobal.org/spec/clr/v2p0/
[did-core]
Decentralized Identifiers (DIDs) v1.0. Manu Sporny; Amy Guy; Markus Sabadello; Drummond Reed. W3C. 3 August 2021. W3C Proposed Recommendation. URL: https://www.w3.org/TR/did-core/
[did-use-cases]
Use Cases and Requirements for Decentralized Identifiers. Joe Andrieu; Phil Archer; Kim Duffy; Ryan Grant; Adrian Gropper. W3C. 17 March 2021. W3C Note. URL: https://www.w3.org/TR/did-use-cases/
[IEEE-754]
IEEE Standard for Floating-Point Arithmetic. Institute of Electrical and Electronics Engineers. 29 August 2008. URL: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933
[JSON-LD]
JSON-LD 1.0. Manu Sporny; Gregg Kellogg; Markus Lanthaler. W3C. 3 November 2020. W3C Recommendation. URL: https://www.w3.org/TR/json-ld/
[json-ld11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 16 July 2020. W3C Recommendation. URL: https://www.w3.org/TR/json-ld11/
[OB-20]
Open Badges v2.0. Otto, Nate; Bohrer, Jeff; Cook, Timothy; Gylling, Markus; Hripak, Alexander; Pitcher, Justin. IMS Global Learning Consortium. April 2018. IMS Final Release. URL: https://www.imsglobal.org/spec/ob/v2p0/
[OB-21]
Open Badges Specification v2.1. Jeff Bohrer; Andy Miller. IMS Global Learning Consortium. October 7, 2020. IMS Candidate Final Public. URL: https://www.imsglobal.org/spec/ob/v2p1/
[OB-30]
Open Badges Specification v3.0. IMS Global Learning Consortium. IMS Base Document. URL: https://www.imsglobal.org/spec/ob/v3p0/
[OB-CERT-30]
Open Badges Specification Conformance and Certification Guide v3.0. IMS Global Learning Consortium. IMS Base Document. URL: https://www.imsglobal.org/spec/ob/v3p0/cert/
[OB-JSON-30]
Open Badges Specification JSON Schema v3.0. IMS Global Learning Consortium. IMS Base Document. URL: https://www.imsglobal.org/spec/ob/v3p0/schema/json
[OPENAPIS]
OpenAPI Specification. Darrell Miller; Jeremy Whitlock; Marsh Gardiner; Mike Ralphson; Ron Ratovsky; Uri Sarid; Tony Tam; Jason Harmon. OpenAPI Initiative. URL: https://www.openapis.org/
[RFC3629]
UTF-8, a transformation format of ISO 10646. F. Yergeau. IETF. November 2003. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc3629
[RFC8259]
The JavaScript Object Notation (JSON) Data Interchange Format. T. Bray, Ed.. IETF. December 2017. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc8259
[RFC8949]
Concise Binary Object Representation (CBOR). C. Bormann; P. Hoffman. IETF. December 2020. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc8949
[RSD]
Rich Skill Descriptors. URL: https://www.openskillsnetwork.org/rsd
[vc-data-model]
Verifiable Credentials Data Model v1.1. Manu Sporny; Grant Noble; Dave Longley; Daniel Burnett; Brent Zundel; Kyle Den Hartog. W3C. 3 March 2022. W3C Recommendation. URL: https://www.w3.org/TR/vc-data-model/
-
-

H. List of Contributors

-

The following individuals contributed to the development of this document:

- - - - - - - - - -
NameOrganizationRole
Nate OttoConcentric SkyEditor
Kerri LemoieConcentric SkyEditor
Phillip LongConcentric SkyEditor
-
\ No newline at end of file diff --git a/extensions/aceExtension/v1p0/microsite/ob-ace-v1p0.md b/extensions/aceExtension/v1p0/microsite/v1p0.md similarity index 99% rename from extensions/aceExtension/v1p0/microsite/ob-ace-v1p0.md rename to extensions/aceExtension/v1p0/microsite/v1p0.md index 12bb55db..48a36e0f 100644 --- a/extensions/aceExtension/v1p0/microsite/ob-ace-v1p0.md +++ b/extensions/aceExtension/v1p0/microsite/v1p0.md @@ -3,7 +3,7 @@ author: 1Edtech Consortium category: Extension title: Open Badges American Council for Education (ACE) Extension shortcode: OB-ACE-10 -status: Candidate Final Public +status: PublicCandidateFinal lastUpdated: 2025-10-09 version: '1.0' nature: normative diff --git a/extensions/assessmentExtension/v2p0/microsite/ob-assess-v2p0.md b/extensions/assessmentExtension/v2p0/microsite/v2p0.md similarity index 99% rename from extensions/assessmentExtension/v2p0/microsite/ob-assess-v2p0.md rename to extensions/assessmentExtension/v2p0/microsite/v2p0.md index f1ec8e1d..bf59345b 100644 --- a/extensions/assessmentExtension/v2p0/microsite/ob-assess-v2p0.md +++ b/extensions/assessmentExtension/v2p0/microsite/v2p0.md @@ -3,11 +3,11 @@ author: 1Edtech Consortium category: Extension title: Open Badges Assessment Extension shortcode: OB-ASSESSMENT-20 -status: Candidate Final Public +status: PublicCandidateFinal lastUpdated: 2025-07-08 version: '2.0' nature: normative -docType: spec +docType: specification contributors: - name: Nate Otto affiliation: Skybridge Skills diff --git a/extensions/issuerAccreditationExtension/v2p0/index.html b/extensions/issuerAccreditationExtension/v2p0/index.html index d665ee8e..49424ec4 100644 --- a/extensions/issuerAccreditationExtension/v2p0/index.html +++ b/extensions/issuerAccreditationExtension/v2p0/index.html @@ -22,11 +22,11 @@ specTitle: "Open Badges Issuer Accreditation Extension", shortName: "ob-accred", specStatus: "Base Document", - specDate: "July 24th, 2024", + specDate: "April 2nd, 2025", specVersion: "2.0", specNature: "normative", specType: "spec", - docVersion: "1.0", + docVersion: "1.1", contributors: _contributors, localBiblio: _localBiblio, skipCertGuideConformanceRef : true, @@ -216,6 +216,11 @@

Version History

July 24th, 2024 Initial release. + + Base Document 1.1 + April 2nd, 2025 + Set multiplicity of accreditations to 0..*. + diff --git a/extensions/issuerAccreditationExtension/v2p0/microsite/ob-issuer-v2p0.md b/extensions/issuerAccreditationExtension/v2p0/microsite/v2p0.md similarity index 99% rename from extensions/issuerAccreditationExtension/v2p0/microsite/ob-issuer-v2p0.md rename to extensions/issuerAccreditationExtension/v2p0/microsite/v2p0.md index fde22660..974ec801 100644 --- a/extensions/issuerAccreditationExtension/v2p0/microsite/ob-issuer-v2p0.md +++ b/extensions/issuerAccreditationExtension/v2p0/microsite/v2p0.md @@ -3,11 +3,11 @@ author: 1Edtech Consortium category: Extension title: Open Badges Issuer Accreditation Extension shortcode: OB-ACCRED-20 -status: Base Document +status: Final lastUpdated: 2024-07-24 version: '2.0' nature: normative -docType: spec +docType: specification contributors: - name: Nate Otto affiliation: Skybridge Skills diff --git a/extensions/issuerAccreditationExtension/v2p0/ob-accred_v2p0.lines b/extensions/issuerAccreditationExtension/v2p0/ob-accred_v2p0.lines index 9dfae0e4..914ac4a7 100644 --- a/extensions/issuerAccreditationExtension/v2p0/ob-accred_v2p0.lines +++ b/extensions/issuerAccreditationExtension/v2p0/ob-accred_v2p0.lines @@ -3,7 +3,7 @@ Model ob-accred 2024-09-12 2.0 "s:IMS Base Document" "t:Open Badges Issuer Accre Package MainClasses DataModel Class IssuerAccreditationProfile Unordered false [] "Profile extension with accreditation information." - Property accreditations AccreditationProfile 0..1 "d:listing of accreditations." + Property accreditations AccreditationProfile 0..* "d:listing of accreditations." Class AccreditationProfile Unordered false [] "Profile extension with detailed information about an accrediting organization." Property type IRI 1 "d:MUST be the IRI 'AccreditationProfile'." diff --git a/ob_next/README.md b/ob_next/README.md deleted file mode 100644 index 5dfdf775..00000000 --- a/ob_next/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# OB Next Collection Box - -This folder is a place to store files related to **potential** new features of future versions of the Open Badges specification as approved by the IMS OB Project Group. diff --git a/ob_next/dids-in-badges.md b/ob_next/dids-in-badges.md deleted file mode 100644 index 6a5e0303..00000000 --- a/ob_next/dids-in-badges.md +++ /dev/null @@ -1,136 +0,0 @@ -# Introduction - -## Design Goals and Rationale - -This draft proposal adds to the [Open Badges specification](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html) to enable recipients of badges to use [Decentralized Identifiers (DIDs)](https://w3c.github.io/did-core/) in their [IdentityObject](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#IdentityObject). The use of DIDs will enable recipients to use a cryptographically verifiable pseudonymous identifier in their issued Badges. For other stakeholders such as Issuers or Consumers DIDs enable cryptographic verification capabilities to ensure control of the Recipient over their badges. - -## Use Cases - -_This section is non-normative._ - -* A recipient of a Badge wants to use a DID as a pseudonymous identifier. - -* A candidate recipient of a Badge provides their DID to a Badge Issuer - -* A Badge Issuer generates a DID for a recipient - -* An Issuer leverages DID infrastructure to cryptographically verify that a recipient controls a DID identifier. - -* A Consumer leverages DID infrastructure to cryptographically verify that a recipient controls a Badge. - - -## Terminology - -The following terms are used throughout this document: - -* *Badge Issuer*: A service that allows for the creation of [BadgeClasses](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#BadgeClass) and the subsequent issuing of [Assertions](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#Assertion) to recipients that conform to the Open Badges specification. Beginning with Open Badges 2.0, the candidate platform must issue a valid [Baked Badge](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#Baking) and demonstrate how the recipient retrieves the Badge. - -* *Badge Displayer*: An application that displays verified badges to viewers. Beginning with Open Badges 2.0, the candidate platform must display a minimum set of badge metadata and support viewer-initiated verification of a Badge. - -* *Badge Host*: An application that can import, aggregate, and publicly host [Assertions](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#Assertion) for recipients. It also supports export of Badges at user request. Beginning with Open Badges 2.0, the candidate platform must be able to import all formats of Open Badges as well as prove that Badge metadata is not lost upon export of the badge. - -* *DID*: [Decentralized Identifiers (DIDs)](https://w3c.github.io/did-core/) are a type of identifier that enables a verifiable, decentralized digital identity. - -* *ID*: Unique [IRI](https://tools.ietf.org/html/rfc3987) for the [Assertion](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#Assertion). If using [Hosted Verification](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#HostedBadge), this should be the [URI](https://tools.ietf.org/html/rfc3986) where the assertion is accessible. For [Signed Assertions](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#SignedBadge), it is recommended to use a [UUID in the urn:uuid namespace](https://tools.ietf.org/html/rfc4122). - -# Value Proposition - -## What Is a DID? - -[Decentralized Identifiers](https://w3c.github.io/did-core), or DIDs, "are a new type of identifier to provide verifiable, decentralized digital identity." In brief, DIDs are URLs, often backed by a distributed ledger, that can be resolved to a "DID Document" containing cryptographic key material of which the "controller" can prove ownership. The identity provides a mechanism for trustable interactions with the subject of a DID. - -Unlike email addresses — controlled by a provider such as Google, Apple, or another corporation, or telephone numbers — controlled by telecom companies such as a Verizon, AT&T, and regulated by government agencies, DIDs are intended to be controlled by individual entities (individuals or organizations). This restriction is applied by the source the DID is backed with, which could be a centralized website (see: [did:github](https://github.com/decentralized-identity/github-did)), or a public decentralized blockchain (see: [did:btcr](https://w3c-ccg.github.io/didm-btcr)). DIDs enable high-trust interactions by leveraging public key cryptography. - -DIDs are a key piece of decentralized infrastructure that are called out specifically in the [Verifiable Credentials Data Model](https://www.w3.org/TR/vc-data-model/) and [Identity Hub](https://github.com/decentralized-identity/identity-hub/blob/master/explainer.md) specifications among many others in the Self Sovereign and Digital Identity space. - -An example DID document, [taken from the spec](https://w3c.github.io/did-core/#example-2-minimal-self-managed-did-document), is provided below: -``` -{ - "@context": "https://www.w3.org/ns/did/v1", - "id": "did:example:123456789abcdefghi", - "authentication": [{ - "id": "did:example:123456789abcdefghi#keys-1", - "type": "RsaVerificationKey2018", - "controller": "did:example:123456789abcdefghi", - "publicKeyPem": "-----BEGIN PUBLIC KEY...END PUBLIC KEY-----\r\n" - }], - "service": [{ - "id":"did:example:123456789abcdefghi#vcs", - "type": "VerifiableCredentialService", - "serviceEndpoint": "https://example.com/vc/" - }] -} -``` - -A corresponding example Verifiable Credential, where the subject (who the credential is issued to) is a DID: - -``` -{ - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://www.w3.org/2018/credentials/examples/v1" - ], - "id": "http://example.edu/credentials/3732", - "type": ["VerifiableCredential", "UniversityDegreeCredential"], - "credentialSubject": { - "id": "did:example:123456789abcdefghi", - "degree": { - "type": "BachelorDegree", - "name": "Bachelor of Science and Arts" - } - }, - "proof": { ... } -} -``` - - -## How Does Someone Get a DID? - -There are two paths to get a DID: claim one yourself or join an Identity Platform that facilitates DIDs. A list of DID methods that are in development is [provided by the W3C](https://w3c.github.io/did-spec-registries/#did-methods). At present, there are over 50 DID methods! Each DIDs can be [“resolved”](https://w3c.github.io/did-core/#resolution) to a DID Document expressing information about the holder by resolvers that support the relevant DID method. Multiple DID resolution services have arisen, one such is hosted by the [DIF here](https://dev.uniresolver.io/). - -Typically, recipients will get a DID upon joining an Identity Platform supporting DIDs. There are a number of companies currently in or joining the Identity space to facilitate individuals getting DIDs. To obtain more information on a specific DID method, and how to attain a DID for that method, it is recommended to go to the [DID registry](https://w3c.github.io/did-spec-registries/#did-methods) and find the method-specific documentation. - -Recipients can have a single DID or multiple DIDs for greater privacy. DID management typically requires extensive infrastructure. When looking to claim a DID it is important to consider what a DID method, and Identity Platform provide for you: what security practices are being followed, what is the backing store for the DID, who makes up the organization(s) controlling the DID method, what are the legal implications of claiming such a DID, what DID operations are supported, and what control are you giving up, if any, in claiming a certain DID? - -## Why DIDs Make Open Badges Better - -The benefits of adding DIDs to Open Badges can be broken into three key points: security, portability, and interoperability. - -As of Open Badges v2.0, trust in Open Badges is obtained in two ways: signed assertions and hosting. Both are viable methods that allow for trusted interactions with Badges allowing Badges to be transmitted as JWTs and trust to be derived from a web host, often over TLS. Adding DIDs to Badges would allow new trust interactions. One could challenge a recipient to prove they control a DID, or, a Badge can be wrapped in a [Verifiable Presentation](https://w3c.github.io/vc-data-model/#presentations-0). Adding DIDs to Badges could even invite new signed assertion mechanisms using [Linked Data Proofs](https://w3c-ccg.github.io/ld-proofs). Giving DIDs to recipients enables individual attestation by design. Giving DIDs to issuers enables trusted issuance of Badges to trusted parties. - -Portability is the next important point. Most often, today, we see Badges in a Badge-host backpack. By adopting DIDs, Badges become more _[self sovereign](http://www.lifewithalacrity.com/2016/04/the-path-to-self-soverereign-identity.html)_ meaning that individuals can take control of their data without having to trust a corporation or other intermediary. With DIDs in a Badges, combined with innovations like the Badge Connect API, Badges could move freely between backpacks or other digital wallets a user controls. - -If we consider corporate email addresses, we find another portability benefit of moving to DIDs. With a corporate email address an individual may be issued an achievement in the form of a Badge that represents some training completed. Sometimes, this training may be useful to future employers; however, once an individual leaves a company they likely do not have access to their corporate email address, and consequently lose access to their Badge. If the Badge, instead, was issued to a DID, the individual would retain control of their DID and achievement independent of their employer. This is one such example, though many more can be imagined, that show the strength of user-centric identity that is decentralized and portable. - -Another strong benefits to DIDs is that they themselves are cryptographically verifiable. There are up-and-coming challenge protocols to better facilitate verifiability, but the concept is straight from a security textbook: if you claim to control a private key, I can challenge you to prove that control if I know your public key. DIDs expose public keys for exactly this purpose. Unlike email addresses, where other schemes like email-verification-links or seperate multi-factor-auth (MFA) solutions are needed, DIDs are verifiable out of the box. - -The last main benefit of adding DIDs to Open Badges is interoperability. Open Badges are an excellent technology for displaying achievement. There are other technologies that have complementary strengths like [Verifiable Credentials](https://w3c.github.io/vc-data-model), which aren't so user friendly or visually appealing, but do contain trusted data in a similar way to Badges. Verifiable Credentials are one of many technologies utilizing DIDs, that could interoperate with Open Badges should they share the same recipient type. Tie-ins to other DID-infrastructure both strengthens the capabilities and reach of Open Badges, while simultaneously building a stronger decentralized ecosystem. - -DIDs in Badges give new optionality to issuers and recipients operating in the Badging ecosystem, enabling, if one wishes, high-trust interactions, tie-in to other up-and-coming standards, and contributes to a narrative of user-centric data. - -## Considerations for DIDs in Open Badges - -Though Decentralized Identifiers are an official W3C specification, they have yet to see widespread adoption. Drawbacks in this sense are similar to drawbacks for all new, or up-and-coming technologies. We believe this drawback is minimized by the endorsement of the DID specification by the W3C, and a number of prominent technology companies and enthusiasts. - -Additionally, introducing DIDs welcomes complexity around trust interactions and dealing with cryptographic operations. It is not trivial to properly implement systems that handle key management, signing, and verification. Much dilligence and attention must be paid to properly adhereing to security standards and guidelines, and keeping an eye on the space for potential vulnerabilities, leaks, and the advancement of the technology at hand. - -Related to the previous point is the fact that not all DID methods are created equal. For example, if we take a look at the [did:key](https://w3c-ccg.github.io/did-method-key/) method we can see it is a fairly lightweight DID. The method is legitimate, and has appropriate uses, but, it lacks _key rotation_, _deactivation_, and numerous other properties of robustness that other DID methods offer. It may not be the best choice when advocating for _durable_ DIDs. This same scrutiny should be applied to all DID methods that implementers choose to support when incorporating DIDs in Badges. - -The proposal as it stands is an optional addition to the specification. Those who do not choose to uptake it will still be compliant with the Open Badge standard. However, as we see an increase in mobility for Badges, with the Connect API, there may be uptake required for Badging Platforms to support DIDs in Badges. - -# Sample Changes to Open Badge Specification - -## Modified Profile Identifier Properties -When [Profiles](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#Profile) are referenced elsewhere in the Open Badges Specification, they may be identified precisely by dereferenceable id, such as when a [BadgeClass](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#BadgeClass) links to an issuer Profile by its id URL. Other times, such as when identifying the recipient of an [Assertion](https://www.imsglobal.org/sites/default/files/Badges/OBv2p0Final/index.html#Assertion), Profiles may be identified by the value of a specific property unique to the individual or organization represented in a Profile. All properties that serve as profile identifiers must have values with a string datatype. - -Properties considered serviceable identifiers include: - -**email** - -**url** - -**telephone** - -**id** - -Many platforms that allow badge issuers and recipients to establish their identities as Profiles support only [email](https://schema.org/email) as an identifier property. diff --git a/ob_next/roadmap.md b/ob_next/roadmap.md deleted file mode 100644 index c73df9af..00000000 --- a/ob_next/roadmap.md +++ /dev/null @@ -1,68 +0,0 @@ - -# Roadmap - -This document outlines the steps we believe are required to gain acceptance of DIDs in Open Badges along with usecases that align with the roadmap. - - -## Tasks - -Tasks define tangible work items that accomplish use cases and progress the timeline. - - Task | Notes | Status | -|-----------------|----------------|----------| -| Document "What is a DID" | Present in [did-in-badges](dids-in-badges.md) | Draft | -| Document "How to get a DID" | Present in [did-in-badges](dids-in-badges.md) | Draft | -| Document DIDs in Badges Value Proposition | Present in [did-in-badges](dids-in-badges.md) | Draft | -| Document Spec Changes | Present in [did-in-badges](dids-in-badges.md) | Draft | -| Pilot Program Proposal | Propose a pilot program with a pilot roadmap, check-ins with IMS staff and workgroup, identified low-risk high-reward items, and piloting principles | TODO | -| Extension Example | Example Extension/Additional Properties Approach AND Example next version “pure OB 2.2” of what this could look like. | TODO | - - -## Use Cases - -The use cases listed below are what we believe to be the enumeration of problems to be solved in adding DIDs to Open Badges. The order reflect current prioritization and is subject to change. - - Capability | Complexity | Potential Value | Priority | -|-----------------|----------------|-------------------|----------| -| Prove ownership of a DID as a potential recipient | lg | lg | 1 | -| Provide a proof that a particular host account is held by the holder of a particular DID | lg | lg | 1 | -| Determine if a DID-based issuer identity is a trustworthy representation of a real-world (“meatspace”) organization | lg | lg | 1 | -| Award a badge to a DID-based recipient | sm | md | 2 | -| Claim a DID as a recipient and present it to issuer & host | med | med | 2 | -| Include DID-based profile identification in Badge Connect APIs | med | med | 3 | -| Use a DID as an issuer identifier, tied to signing keys for assertions | med | lg | 3 | -| Describe a Badge Connect service (SIOP?) that I use in my DID document | med | med | 3 | - -## Timeline - -The timeline proposed is broken into three stages of three month intervals. The timeline is subject to changes. - -### Stage 1 - -**August 2020 - October 2020** - -- Recipient brings a DID to an Issuer platform. Issuer platform verifies their control of DID -- Alternatively an Issuer can generate DID for a Recipient -- Consumer trusts Issuer validation for a Recipient’s control of DID -- Create first draft of the specification -- Create supporting documentation for working with DIDs -- Create working sample as an OB Extension - -### Stage 2 - -**October 2020 - December 2020** - -- Look to standardize on technical standard (e.g. OIDC SIOP) for Issuers to validate Recipient control of DID -- Support DIDs in Badge Connect -- Look for two Badge Platforms to trial use of DIDs -- Refine supported DIDs based on experiences from Stage 1 -- Update draft specification - -### Stage 3 - -**December 2020 - February 2021** - -- Look to standardize on technical standard for Open Badge stakeholders (Backpacks, Displayers, Consumers) to validate Recipient control of DID -- Finalize specification -- Create compliance tooling -- Make it into OB v.Next diff --git a/ob_next/use-cases.md b/ob_next/use-cases.md deleted file mode 100644 index 0230fc71..00000000 --- a/ob_next/use-cases.md +++ /dev/null @@ -1,40 +0,0 @@ -# Open Badges Next Use Cases - -This document contains use cases submitted by the members of the Open Badges Workgroup for consideration in the next -version of the Open Badges Specification. Each use case contains a title, user stories and/or information about a -specific problem or opportunity, information about the motivation or importance, and a description of a -specification-level capability or restriction that could serve the use case when implemented in the ecosystem. New use -cases may be submitted by pull request. All information submitted must be compatible with IMS Global intellectual -property rights policies for open implementation of specifications resulting from the contribution. - -When the next version of the specification is assigned a version number and drafted as draft documents, selected use -cases from this document will be incorporated, and this document will be deleted. - -## Describe a Rubric in a Badgeclass and associated Results in an Assertion -As an Issuer, I would like to augment a BadgeClass with a Rubric, which is a matrix of Rubric Criteria and Performance -Levels at which learners or recipients may be expected to perform. - -I would like to augment an Assertion of a BadgeClass that features a Rubric with a Result, which describes how a -particular learner or recipient performed in terms of an achieved Performance Level for one or more Rubric Criteria in -the BadgeClass that this Assertion recognizes. - -The related Comprehensive Learner Record specification added the concept of -[ResultDescription](https://www.imsglobal.org/sites/default/files/spec/clr/v1p0/InfoModel/clr_InfoModel.html#Data_ResultDescription) -and [Result](https://www.imsglobal.org/sites/default/files/spec/clr/v1p0/InfoModel/clr_InfoModel.html#Data_Result) to -CLR Achievements (BadgeClass) and Assertions, respectively. This concept is a natural fit with the matching Open Badges -classes and could be imported into the Open Badges Specification to enable badge issuers to describe the available -performance levels that assessments may recognize for a BadgeClass and the performance levels particular learners -achieved. Each ResultDescription has an identifier that is unique within the BadgeClass, and each Result in the -Assertion identifies which ResultDescription it applies to and which achievedLevel applies. - -This introduces the concept that an assertion may recognize an achievement that has not yet "passed" a threshold -"required level". The mere existence of an Assertion may no longer be enough to recognize that the Issuer's desired -criteria have been met to the full satisfaction of the Issuer, only that at least some progress toward those criteria -was made. This may pose complications with systems whose existing logic relies on the existence of an assertion. -Specific guidance for interpretation by inspectors or consumers should be provided in the specification for how such -assertions should be interpreted. - -The value of incorporating Rubrics into Open Badges comes from the ability to better describe achievement at a more -granular level. This potentially results in capabilities like understanding how an individual's skill has improved over -time across multiple Assertions of the same BadgeClass. Additionally, application forms and assessment forms within -applications that serve issuers might be automatically generated from Rubric data. diff --git a/ob_v3p0/api.html b/ob_v3p0/api.html index d08770b7..7bb17aed 100644 --- a/ob_v3p0/api.html +++ b/ob_v3p0/api.html @@ -34,13 +34,13 @@ + + Final + 1.4.2 + April 17, 2026 + + + + + + Final + 1.4.3 + April 22, 2026 + + + +