GA4GH Passport

Version: 1.2

Work Stream Name: Data Use and Researcher Identity (DURI)

Product Name: GA4GH Passport

Product Description: This document provides the GA4GH technical specification for a GA4GH Passport to be consumed by Passport Clearinghouses in a standardized approach to determine whether or not data access should be granted. Additionally, the specification provides guidance on encoding specific use cases, including Visas for Registered Access as described in the “Registered access: authorizing data access” publication. Refer to the Overview for an introduction to how data objects and services defined in this specification fit together.

Table of Contents

Terminology

Inherited Definitions

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.

This specification inherits terminology from the GA4GH AAI OIDC Profile specification, namely these terms:

Term Definitions

Passport Claim

Visa Identity

Visa Object

Visa Type

Overview

Please see the Flow of Assertions section in the GA4GH AAI OIDC Profile specification for an overview of interaction among the specified parties.

General Requirements

  1. Each Visa may have a different expiry.

  2. Visas MUST have an indication of which organization made the Visa Assertion (i.e. the “source” claim), but Visas do not generally indicate individual persons involved in making the assertion (i.e. who assigned/signed the assertion) as detailed identity information is not needed to make an access decision.

  3. Additional information about identity that is not needed to make an access decision SHOULD not be included in the Visas. Identity description, encoding audit details, other data for non-access purposes are not the intent of these Visas, and must be handled via other means beyond the scope of this specification should they be needed for entities and systems with sufficient authority to process such information.

  4. The Passport Claim MUST only be present in a response when Passport-Scoped Access Token is provided.

  5. If the Broker is the Visa Issuer, it MUST set the iss to itself and sign such Visas with an appropriate private key as described in the GA4GH AAI OIDC specification.

  6. Visas are designed for machine interpretation only in order to make an access decision and is a non-goal to support rich user interface requirements nor do these claims fully encode the audit trail.

  7. A Visa Object MAY contain the “conditions” claim to restrict the Visa to only be valid when the conditions are met.

    • For example, an identity can have several affiliations and a Visa with type “ControlledAccessGrants” MAY establish a dependency on one of them being present in the Passport by using the conditions claim.
  8. Processing a Passport within a Passport Clearinghouse MUST abide by the following:

    1. Passport Clearinghouses MUST reject all requests that include Passports that fail the necessary checks as described in the GA4GH AAI OIDC specification.

    2. A Passport Clearinghouse MUST ignore all Visas it does not need to process a particular request.

    3. Passport Clearinghouses MUST ignore Passports and Visas unless:

      1. The Passport Clearinghouse has sufficient trust relationships with all of: the Broker, Visa Assertion Source, Visa Issuer; or

      2. The Passport Clearinghouse can rely on a trusted service that provides sufficient trust of any of the Broker, Visa Assertion Source and/or Visa Issuer such that the Passport Clearinghouse can establish trust of all three such parties.

    4. When combining Visas with multiple Visa Identities for the purposes of evaluating authorization, a Passport Clearinghouse MUST check the LinkedIdentities Visas by trusted issuers and ensure that trusted sources have asserted that these Visa Identities represent the same end user.

Support for User Interfaces

(e.g. mapping a URI string to a human-readable description for a user interface.)

For example, a user interface mapping of “https://doi.org/10.1038/s41431-018-0219-y” to a human readable description such as “this person is a bona fide researcher as described by the ‘Registered access: authorizing data access’ publication”.

It is a non-goal for this specification to consider the processes and data for the purpose of supporting user interfaces.

Passport Claim Format

The Passport Claim name maps to an array of Visas.

Non-normative example of a set of Visas, encoded as JWS Compact Serialization strings:

{
  "ga4gh_passport_v1": [
    "<eyJhbGciOiJI...aaa>",
    "<eyJhbGciOiJI...bbb>"
  ]
}

For a more reader-friendly example, see the Example Passport Claim section of the specification.

Visa Requirements

Visa Format

Visas are signed JWTs encoded into strings using JWS Compact Serialization.
When decoded, their structure is:

{
  ["typ": "vnd.ga4gh.visa+jwt | at+jwt | JWT",]
  "alg": "<signing-algorithm>",
  ["jku": "<json-web-keys-set-URL>",]
  "kid": "<signing-key-identifier>"
}.
{
  "iss": "<issuer-URL>",
  "sub": "<subject-identifier>",
  ["scope": "openid ...",]
  "jti": "<token-identifier>",
  "iat": <seconds-since-epoch>,
  "exp": <seconds-since-epoch>,
  "ga4gh_visa_v1": {
    "type": "<visa-type>",
    "asserted": <seconds-since-epoch>,
    "value": "<value-string>",
    "source": "<source-URL>",
    ["conditions": [...],]
    ["by": "<by-identifier>"]
  }
}.<signature>

The standard JWT payload claims iss, sub, iat, exp are all REQUIRED.

One of scope or jku MUST be present as described in Conformance for Visa Issuers within the AAI specification.

Claims within the ga4gh_visa_v1 Visa Object are as described in the Visa Object Claims section of this specification.

typ

alg

exp

Visa Object Claims

Although standard claims within a Visa Object are defined in this section, other claims MAY exist within the object and should be ignored by any Passport Clearinghouse that is not familiar with the use of such claims. Claim names are reserved for definition by GA4GH (or a body it elects).

type

asserted

value

source

conditions

Pattern Matching

by

URL Claims

A Visa Object Claim that is defined as being of URL format (see RFC3986 section 1.1.3) with the following limitations:

  1. For the purposes of evaluating access, the URL MUST be treated as a simple unique persistent string identifier.

  2. The URL is a canonical identifier and as such it is important that Passport Clearinghouses MUST match this identifier consistently using a case-sensitive full string comparison.

    • If TLS is available on the resource, then its persistent identifier URL SHOULD use the “https” scheme even if the resource will also resolve using the “http” scheme.

    • When the URL is being used to represent an organization or a well defined child organization within a “source” claim, it is RECOMMENDED to use a URL as a persistent organizational ontology identifier, whether managed directly or by a third-party service such as GRID when reasonable to do so.

  3. The URL SHOULD also be as short as reasonably possible while avoiding collisions, and MUST NOT exceed 255 characters.

  4. The URL MUST NOT be fetched as part of policy evaluation when making an access decision. For policy evaluation, it is considered an opaque string.

  5. URLs SHOULD resolve to a human readable document for a policy maker to reason about.

GA4GH Standard Visa Type Definitions

Note: in addition to these GA4GH standard Visa Types, there is also the ability to for a Visa Issuer to encode Custom Visa Types.

AffiliationAndRole

AcceptedTermsAndPolicies

ResearcherStatus

ControlledAccessGrants

LinkedIdentities

Custom Visa Types

Encoding Use Cases

Use cases include, but are not limited to the following:

Registered Access

Controlled Access

Visa Expiry

In addition to any other policy restrictions that a Passport Clearinghouse may enforce, Passport Clearinghouses that provide access for a given duration provided by the user (excluding any revocation policies) MUST enforce one of the following algorithm options to ensure that Visa expiry is accounted for:

Option A: use the following algorithm to determine if the Visa is valid for the entire duration of the requested duration:

now()+requestedTTL < min(token.exp, token.ga4gh_visa_v1.asserted+maxAuthzTTL)

Where:

Option B: if tokens are sufficiently short lived and/or the authorization system has an advanced revocation scheme that does not need to specify a maxAuthzTTL as per Option A, then the check can be simplified:

now()+accessTokenTTL < token.exp

Where:

Expiry when using multiple Visas: if multiple Visas are required as part of an access policy evaluation, then the expiry to be used MUST be the minimum expiry timestamp, as calculated by the appropriate option above, across all Visas (token set) that were accepted as part of evaluating the access policy.

Token Revocation

As per the GA4GH AAI Specification on Token Revocation, the following mechanisms are available within Visa:

  1. Visa Objects have an “asserted” claim to allow downstream policies to limit the life, if needed, of how long assertions will be accepted for use with access and refresh tokens.

  2. Visas have an “exp” claim to allow Brokers and Passport Clearinghouses to limit the duration of access.

At a minimum, these Visa Claims MUST be checked by all Passport Clearinghouses and systems MUST be in place to begin to take action to remove access by the expiry timestamp or shortly thereafter. Propagation of these permission changes may also require some reasonable delay.

Systems employing Visas MUST provide mechanisms to limit the life of access, and specifically MUST conform to the GA4GH AAI Specification requirements in this regard. Systems utilizing Visas MAY also employ other mechanisms outlined in the GA4GH AAI Specification, such as Access Token Polling if the Visa is encoded as a Visa Access Token.

Example Passport Claim

This non-normative example illustrates a Passport Claim that has Visas representing Registered Access bona fide researcher status along with other Visas for access to specific Controlled Access data. The Visa Types for this example are:

Normally a Passport like this would include Visa Format entries as JWS Compact Serialization strings, however this example shows the result after the Visas have been unencoded into JSON (and reduced to include only the payload) to be more reader-friendly.

"ga4gh_passport_v1": [
    {
        "iat": 1580000000,
        "exp": 1581208000,
        ...
        "ga4gh_visa_v1": {
            "type": "AffiliationAndRole",
            "asserted": 1549680000,
            "value": "faculty@med.stanford.edu",
            "source": "https://grid.ac/institutes/grid.240952.8",
            "by": "so"
        }
    },
    {
        "iat": 1580000100,
        "exp": 1581168872,
        ...
        "ga4gh_visa_v1": {
            "type": "ControlledAccessGrants",
            "asserted": 1549632872,
            "value": "https://example-institute.org/datasets/710",
            "source": "https://grid.ac/institutes/grid.0000.0a",
            "by": "dac"
        }
    },
    {
        "iat": 1580000200,
        "exp": 1581168000,
        ...
        "ga4gh_visa_v1": {
            "type": "ControlledAccessGrants",
            "asserted": 1549640000,
            "value": "https://ega-archive.org/datasets/EGAD00000000432",
            "source": "https://ega-archive.org/dacs/EGAC00001000205",
            "by": "dac"
            "conditions": [
                [
                    {
                        "type": "AffiliationAndRole",
                        "value": "const:faculty@med.stanford.edu",
                        "source": "const:https://grid.ac/institutes/grid.240952.8",
                        "by": "const:so"
                    }
                ],
                [
                    {
                        "type": "AffiliationAndRole",
                        "value": "const:faculty@med.stanford.edu",
                        "source": "const:https://grid.ac/institutes/grid.240952.8",
                        "by": "const:system"
                    }
                ]
            ],
        }
    },
    {
        "iss": "https://issuer.example1.org/oidc",
        "sub": "10001",
        "iat": 1580000300,
        "exp": 1581208000,
        ...
        "ga4gh_visa_v1": {
            "type": "AcceptedTermsAndPolicies",
            "asserted": 1549680000,
            "value": "https://doi.org/10.1038/s41431-018-0219-y",
            "source": "https://grid.ac/institutes/grid.240952.8",
            "by": "self"
        }
    },
    {
        "iss": "https://other.example2.org/oidc",
        "sub": "abcd",
        "iat": 1580000400,
        "exp": 1581208000,
        ...
        "ga4gh_visa_v1": {
            "type": "ResearcherStatus",
            "asserted": 1549680000,
            "value": "https://doi.org/10.1038/s41431-018-0219-y",
            "source": "https://grid.ac/institutes/grid.240952.8",
            "by": "so"
        }
    },
    {
        "iss": "https://broker.example3.org/oidc",
        "sub": "999999",
        "iat": 1580000500,
        "exp": 1581208000,
        ...
        "ga4gh_visa_v1": {
            "type": "LinkedIdentities",
            "asserted": 1549680000,
            "value": "10001,https:%2F%2Fissuer.example1.org%2Foidc;abcd,https:%2F%2Fother.example2.org%2Foidc",
            "source": "https://broker.example3.org/oidc",
            "by": "system"
        }
    }
]
Edit on Github...