Repository files navigation

Introduction

Welcome to the python ishare package. This package implements helpers for the authentication flow between iSHARE services. Specifically, the part of the process where a json web token (per iSHARE specification) is transformed into an access token. This access token can then be used to communicate with the rest of a Role's service endpoints.

This package could be relevant for connecting to/from the following roles:

  • Satellite or Data Space Authorities
  • Authentication Registries
  • Identity Providers
  • Service or Data Provider
  • Service or Data Consumers

For more information on ISHARE;

Usage

Prerequisites

For a working connection with, for example, an iSHARE satellite you need a participant registration.

  • From the registration with an iSHARE Satellite.
    • (encryption) The registered Certificate's private RSA key. This must be kept SECRET!
    • (x509 header) The registered Certificate's public x509 certificate chain.
    • (client_id) The registered participant's EORI number
    • The registered participant adherence status is "Active".
  • For every participant Service you want to connect to:
    • (audience) The target service's EORI number
    • (decryption) Their public x509 (can be retrieved from an iSHARE Satellite)
    • The domain of the service you're connecting to

All of these are required to encrypt and decrypt communication between different the iSHARE services. For more detailed information refer to the private key jwt json web token flow here.

Installation

Install this package using pip;

pip install python-ishare

or using poetry;

poetry add python-ishare

The three-step methodology

  1. Create a json web token per iSHARE specification).
  2. Use a client interface to communicate with a role
  3. Use the ISHARESatelliteClient interface to verify a participant

I. Creating the json web token

There is a convenience method (python_ishare.create_jwt) in the package to help create the token.

frompathlibimportPathfromcryptography.x509importload_pem_x509_certificates, Certificatefromcryptography.hazmat.primitives.serializationimportload_pem_private_keyfromcryptography.hazmat.primitives.asymmetric.rsaimportRSAPrivateKeyfrompython_ishareimportcreate_jwtYOUR_PARTICIPANT_EORI="XXX"THEIR_PARTICIPANT_EORI="YYY"# Load your RSA key to an RSAPrivateKeywithPath("path/to/my/key.pem") asfile:
private_key: RSAPrivateKey=load_pem_private_key(
file.read_bytes(),
password=b"your_password_or_None"
)
withPath("path/to/my/certs.pem") asfile:
chain: list[Certificate] =load_pem_x509_certificates(
file.read_bytes()
) # Create the actual tokenmy_token=create_jwt(
payload={
"iss": YOUR_PARTICIPANT_EORI,
"sub": YOUR_PARTICIPANT_EORI,
"aud": THEIR_PARTICIPANT_EORI,
"jti": "your-unique-id"# optional
},
private_key=private_key,
x5c_certificate_chain=chain
)

This method is strictly seperated out from the client interfacing (next step). This is for two reasons;

  • It makes you responsible for loading the Certificate's from the chain and RSAPrivateKey as such that these important files can be stored anywhere.
  • It makes it possible to sign the json web token externally using an AWS asymmetric key for example. A great security solution.

II. Connecting to an iSHARE Satellite

To connect to an iSHARE satellite this package provides an ISHARESatelliteClient interface class.

frompython_ishareimportISHARESatelliteClient# From step 1YOUR_PARTICIPANT_EORI="XXX"my_token=create_jwt(...)
public_key= ...
client=ISHARESatelliteClient(
target_domain="satellite.ishare.com",
target_public_key=public_key,
client_eori=YOUR_PARTICIPANT_EORI,
json_web_token=my_token
)
# To retrieve the satellite's capabilitiescapabilities=client.get_capabilities()
print(capabilities)
# To retrieve the satellite's public capabilitiespublic_capabilities=client.get_capabilities(use_token=False)
print(public_capabilities)

The value of this interface class is that you never needed to worry about access tokens. This is handled for you underwater. Tokens are re-used whenever a new request is made.

III. Verifying an iSHARE participant

Verifying a participant is a key responsibility for a number of roles. The ISHARESatelliteClient has a method to do this for you.

# From step 2YOUR_PARTICIPANT_EORI="XXX"client=IShareSatelliteClient(...)
# Assuming you have some python web framework there will be a requestrequest= ...
# If you're a service provider, you can use this to verify other parties iSHARE tokensclient.verify_json_web_token(
audience=YOUR_PARTICIPANT_EORI,
client_id=request.param["client_id"],
client_assertion=request.param["client_assertion"],
client_assertion_type=request.param["client_assertion_type"],
grant_type=request.param["grant_type"],
scope=request.param["scope"],
)

Important

The verify_json_web_token currently does not implement full Certificate validation!

Developer Setup

Everything needed to start developing on this package.

Quick start || tl;dr

  1. Install the python package management tool; poetry.

    curl -sSL https://install.python-poetry.org | python3 -
  2. Install the local python project.

    poetry install
  3. Run the test suite and linters using tox.

    poetry run tox
  4. Run development commands inside the virtualenv.

    poetry run <my_command>

Setup

This project runs on a central pyproject.toml configuration. Here you can find the information for what python version to use and dependencies. Configuration for the various linters, testing frameworks is also defined there.

Poetry - Project installer

Poetry is a smooth dependency manager for Python that is seemingly taking over the market. The Documentation is of excellent quality.

Poetry installation:

curl -sSL https://install.python-poetry.org | python3 -

For a specific version of poetry:

curl -sSL https://install.python-poetry.org | python3 - --version <POETRY_VERSION>

For users of pipx:

pipx install poetry

Project Installation

Running poetry install will install the source code and all it's dependencies including development packages.

Pythonic Dependencies

Behind the scenes Poetry creates and manages the virtualenv with all the python package dependencies necessary for the project. This means that to access packages and scripts installed by Poetry you need to run commands in that environment.

There are two different ways, pick your favorite;

  • Wrap your command in a poetry run format. For example;

    # poetry run <my_sub_command>
    poetry run black
  • Activate the virtualenv in your shell, and all commands will run accordingly.

    # <my_sub_command>
    poetry shell
    # Spawns a shell with the venv activated
    black
    # (And all other commands after that)

💡 There are IDE's that understand Poetry and handle it for you so you don't have to do anything else. For instance in PyCharm, you can configure your interpreter to use Poetry.

Linting libraries used

The following packages are used to ensure code cody cleanliness and monitor some known/preventable security issues.

  • black is used to auto-format code.
  • isort is used to automatically sort imports.
  • flake8 is used enforce standard style guide conventions not automatically handled by black.
  • bandit is used to detect some common security issues.
  • mypy is used to validate python typehints for correctness.
  • safety is used to check dependencies for known security issues against a database.
  • tox is used to run all of the above commands inside an isolated python environment.

About

Python implementation of iSHARE Satellite and Authorization Registry APIs.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Introduction

Welcome to the python ishare package. This package implements helpers for the authentication flow between iSHARE services. Specifically, the part of the process where a json web token (per iSHARE specification) is transformed into an access token. This access token can then be used to communicate with the rest of a Role's service endpoints.

This package could be relevant for connecting to/from the following roles:

  • Satellite or Data Space Authorities
  • Authentication Registries
  • Identity Providers
  • Service or Data Provider
  • Service or Data Consumers

For more information on ISHARE;

Usage

Prerequisites

For a working connection with, for example, an iSHARE satellite you need a participant registration.

  • From the registration with an iSHARE Satellite.
    • (encryption) The registered Certificate's private RSA key. This must be kept SECRET!
    • (x509 header) The registered Certificate's public x509 certificate chain.
    • (client_id) The registered participant's EORI number
    • The registered participant adherence status is "Active".
  • For every participant Service you want to connect to:
    • (audience) The target service's EORI number
    • (decryption) Their public x509 (can be retrieved from an iSHARE Satellite)
    • The domain of the service you're connecting to

All of these are required to encrypt and decrypt communication between different the iSHARE services. For more detailed information refer to the private key jwt json web token flow here.

Installation

Install this package using pip;

pip install python-ishare

or using poetry;

poetry add python-ishare

The three-step methodology

  1. Create a json web token per iSHARE specification).
  2. Use a client interface to communicate with a role
  3. Use the ISHARESatelliteClient interface to verify a participant

I. Creating the json web token

There is a convenience method (python_ishare.create_jwt) in the package to help create the token.

frompathlibimportPathfromcryptography.x509importload_pem_x509_certificates, Certificatefromcryptography.hazmat.primitives.serializationimportload_pem_private_keyfromcryptography.hazmat.primitives.asymmetric.rsaimportRSAPrivateKeyfrompython_ishareimportcreate_jwtYOUR_PARTICIPANT_EORI="XXX"THEIR_PARTICIPANT_EORI="YYY"# Load your RSA key to an RSAPrivateKeywithPath("path/to/my/key.pem") asfile:
private_key: RSAPrivateKey=load_pem_private_key(
file.read_bytes(),
password=b"your_password_or_None"
)
withPath("path/to/my/certs.pem") asfile:
chain: list[Certificate] =load_pem_x509_certificates(
file.read_bytes()
) # Create the actual tokenmy_token=create_jwt(
payload={
"iss": YOUR_PARTICIPANT_EORI,
"sub": YOUR_PARTICIPANT_EORI,
"aud": THEIR_PARTICIPANT_EORI,
"jti": "your-unique-id"# optional
},
private_key=private_key,
x5c_certificate_chain=chain
)

This method is strictly seperated out from the client interfacing (next step). This is for two reasons;

  • It makes you responsible for loading the Certificate's from the chain and RSAPrivateKey as such that these important files can be stored anywhere.
  • It makes it possible to sign the json web token externally using an AWS asymmetric key for example. A great security solution.

II. Connecting to an iSHARE Satellite

To connect to an iSHARE satellite this package provides an ISHARESatelliteClient interface class.

frompython_ishareimportISHARESatelliteClient# From step 1YOUR_PARTICIPANT_EORI="XXX"my_token=create_jwt(...)
public_key= ...
client=ISHARESatelliteClient(
target_domain="satellite.ishare.com",
target_public_key=public_key,
client_eori=YOUR_PARTICIPANT_EORI,
json_web_token=my_token
)
# To retrieve the satellite's capabilitiescapabilities=client.get_capabilities()
print(capabilities)
# To retrieve the satellite's public capabilitiespublic_capabilities=client.get_capabilities(use_token=False)
print(public_capabilities)

The value of this interface class is that you never needed to worry about access tokens. This is handled for you underwater. Tokens are re-used whenever a new request is made.

III. Verifying an iSHARE participant

Verifying a participant is a key responsibility for a number of roles. The ISHARESatelliteClient has a method to do this for you.

# From step 2YOUR_PARTICIPANT_EORI="XXX"client=IShareSatelliteClient(...)
# Assuming you have some python web framework there will be a requestrequest= ...
# If you're a service provider, you can use this to verify other parties iSHARE tokensclient.verify_json_web_token(
audience=YOUR_PARTICIPANT_EORI,
client_id=request.param["client_id"],
client_assertion=request.param["client_assertion"],
client_assertion_type=request.param["client_assertion_type"],
grant_type=request.param["grant_type"],
scope=request.param["scope"],
)

Important

The verify_json_web_token currently does not implement full Certificate validation!

Developer Setup

Everything needed to start developing on this package.

Quick start || tl;dr

  1. Install the python package management tool; poetry.

    curl -sSL https://install.python-poetry.org | python3 -
  2. Install the local python project.

    poetry install
  3. Run the test suite and linters using tox.

    poetry run tox
  4. Run development commands inside the virtualenv.

    poetry run <my_command>

Setup

This project runs on a central pyproject.toml configuration. Here you can find the information for what python version to use and dependencies. Configuration for the various linters, testing frameworks is also defined there.

Poetry - Project installer

Poetry is a smooth dependency manager for Python that is seemingly taking over the market. The Documentation is of excellent quality.

Poetry installation:

curl -sSL https://install.python-poetry.org | python3 -

For a specific version of poetry:

curl -sSL https://install.python-poetry.org | python3 - --version <POETRY_VERSION>

For users of pipx:

pipx install poetry

Project Installation

Running poetry install will install the source code and all it's dependencies including development packages.

Pythonic Dependencies

Behind the scenes Poetry creates and manages the virtualenv with all the python package dependencies necessary for the project. This means that to access packages and scripts installed by Poetry you need to run commands in that environment.

There are two different ways, pick your favorite;

  • Wrap your command in a poetry run format. For example;

    # poetry run <my_sub_command>
    poetry run black
  • Activate the virtualenv in your shell, and all commands will run accordingly.

    # <my_sub_command>
    poetry shell
    # Spawns a shell with the venv activated
    black
    # (And all other commands after that)

💡 There are IDE's that understand Poetry and handle it for you so you don't have to do anything else. For instance in PyCharm, you can configure your interpreter to use Poetry.

Linting libraries used

The following packages are used to ensure code cody cleanliness and monitor some known/preventable security issues.

  • black is used to auto-format code.
  • isort is used to automatically sort imports.
  • flake8 is used enforce standard style guide conventions not automatically handled by black.
  • bandit is used to detect some common security issues.
  • mypy is used to validate python typehints for correctness.
  • safety is used to check dependencies for known security issues against a database.
  • tox is used to run all of the above commands inside an isolated python environment.

About

Python implementation of iSHARE Satellite and Authorization Registry APIs.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Introduction

Welcome to the python ishare package. This package implements helpers for the authentication flow between iSHARE services. Specifically, the part of the process where a json web token (per iSHARE specification) is transformed into an access token. This access token can then be used to communicate with the rest of a Role's service endpoints.

This package could be relevant for connecting to/from the following roles:

  • Satellite or Data Space Authorities
  • Authentication Registries
  • Identity Providers
  • Service or Data Provider
  • Service or Data Consumers

For more information on ISHARE;

Usage

Prerequisites

For a working connection with, for example, an iSHARE satellite you need a participant registration.

  • From the registration with an iSHARE Satellite.
    • (encryption) The registered Certificate's private RSA key. This must be kept SECRET!
    • (x509 header) The registered Certificate's public x509 certificate chain.
    • (client_id) The registered participant's EORI number
    • The registered participant adherence status is "Active".
  • For every participant Service you want to connect to:
    • (audience) The target service's EORI number
    • (decryption) Their public x509 (can be retrieved from an iSHARE Satellite)
    • The domain of the service you're connecting to

All of these are required to encrypt and decrypt communication between different the iSHARE services. For more detailed information refer to the private key jwt json web token flow here.

Installation

Install this package using pip;

pip install python-ishare

or using poetry;

poetry add python-ishare

The three-step methodology

  1. Create a json web token per iSHARE specification).
  2. Use a client interface to communicate with a role
  3. Use the ISHARESatelliteClient interface to verify a participant

I. Creating the json web token

There is a convenience method (python_ishare.create_jwt) in the package to help create the token.

frompathlibimportPathfromcryptography.x509importload_pem_x509_certificates, Certificatefromcryptography.hazmat.primitives.serializationimportload_pem_private_keyfromcryptography.hazmat.primitives.asymmetric.rsaimportRSAPrivateKeyfrompython_ishareimportcreate_jwtYOUR_PARTICIPANT_EORI="XXX"THEIR_PARTICIPANT_EORI="YYY"# Load your RSA key to an RSAPrivateKeywithPath("path/to/my/key.pem") asfile:
private_key: RSAPrivateKey=load_pem_private_key(
file.read_bytes(),
password=b"your_password_or_None"
)
withPath("path/to/my/certs.pem") asfile:
chain: list[Certificate] =load_pem_x509_certificates(
file.read_bytes()
) # Create the actual tokenmy_token=create_jwt(
payload={
"iss": YOUR_PARTICIPANT_EORI,
"sub": YOUR_PARTICIPANT_EORI,
"aud": THEIR_PARTICIPANT_EORI,
"jti": "your-unique-id"# optional
},
private_key=private_key,
x5c_certificate_chain=chain
)

This method is strictly seperated out from the client interfacing (next step). This is for two reasons;

  • It makes you responsible for loading the Certificate's from the chain and RSAPrivateKey as such that these important files can be stored anywhere.
  • It makes it possible to sign the json web token externally using an AWS asymmetric key for example. A great security solution.

II. Connecting to an iSHARE Satellite

To connect to an iSHARE satellite this package provides an ISHARESatelliteClient interface class.

frompython_ishareimportISHARESatelliteClient# From step 1YOUR_PARTICIPANT_EORI="XXX"my_token=create_jwt(...)
public_key= ...
client=ISHARESatelliteClient(
target_domain="satellite.ishare.com",
target_public_key=public_key,
client_eori=YOUR_PARTICIPANT_EORI,
json_web_token=my_token
)
# To retrieve the satellite's capabilitiescapabilities=client.get_capabilities()
print(capabilities)
# To retrieve the satellite's public capabilitiespublic_capabilities=client.get_capabilities(use_token=False)
print(public_capabilities)

The value of this interface class is that you never needed to worry about access tokens. This is handled for you underwater. Tokens are re-used whenever a new request is made.

III. Verifying an iSHARE participant

Verifying a participant is a key responsibility for a number of roles. The ISHARESatelliteClient has a method to do this for you.

# From step 2YOUR_PARTICIPANT_EORI="XXX"client=IShareSatelliteClient(...)
# Assuming you have some python web framework there will be a requestrequest= ...
# If you're a service provider, you can use this to verify other parties iSHARE tokensclient.verify_json_web_token(
audience=YOUR_PARTICIPANT_EORI,
client_id=request.param["client_id"],
client_assertion=request.param["client_assertion"],
client_assertion_type=request.param["client_assertion_type"],
grant_type=request.param["grant_type"],
scope=request.param["scope"],
)

Important

The verify_json_web_token currently does not implement full Certificate validation!

Developer Setup

Everything needed to start developing on this package.

Quick start || tl;dr

  1. Install the python package management tool; poetry.

    curl -sSL https://install.python-poetry.org | python3 -
  2. Install the local python project.

    poetry install
  3. Run the test suite and linters using tox.

    poetry run tox
  4. Run development commands inside the virtualenv.

    poetry run <my_command>

Setup

This project runs on a central pyproject.toml configuration. Here you can find the information for what python version to use and dependencies. Configuration for the various linters, testing frameworks is also defined there.

Poetry - Project installer

Poetry is a smooth dependency manager for Python that is seemingly taking over the market. The Documentation is of excellent quality.

Poetry installation:

curl -sSL https://install.python-poetry.org | python3 -

For a specific version of poetry:

curl -sSL https://install.python-poetry.org | python3 - --version <POETRY_VERSION>

For users of pipx:

pipx install poetry

Project Installation

Running poetry install will install the source code and all it's dependencies including development packages.

Pythonic Dependencies

Behind the scenes Poetry creates and manages the virtualenv with all the python package dependencies necessary for the project. This means that to access packages and scripts installed by Poetry you need to run commands in that environment.

There are two different ways, pick your favorite;

  • Wrap your command in a poetry run format. For example;

    # poetry run <my_sub_command>
    poetry run black
  • Activate the virtualenv in your shell, and all commands will run accordingly.

    # <my_sub_command>
    poetry shell
    # Spawns a shell with the venv activated
    black
    # (And all other commands after that)

💡 There are IDE's that understand Poetry and handle it for you so you don't have to do anything else. For instance in PyCharm, you can configure your interpreter to use Poetry.

Linting libraries used

The following packages are used to ensure code cody cleanliness and monitor some known/preventable security issues.

  • black is used to auto-format code.
  • isort is used to automatically sort imports.
  • flake8 is used enforce standard style guide conventions not automatically handled by black.
  • bandit is used to detect some common security issues.
  • mypy is used to validate python typehints for correctness.
  • safety is used to check dependencies for known security issues against a database.
  • tox is used to run all of the above commands inside an isolated python environment.

About

Python implementation of iSHARE Satellite and Authorization Registry APIs.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Introduction

Welcome to the python ishare package. This package implements helpers for the authentication flow between iSHARE services. Specifically, the part of the process where a json web token (per iSHARE specification) is transformed into an access token. This access token can then be used to communicate with the rest of a Role's service endpoints.

This package could be relevant for connecting to/from the following roles:

  • Satellite or Data Space Authorities
  • Authentication Registries
  • Identity Providers
  • Service or Data Provider
  • Service or Data Consumers

For more information on ISHARE;

Usage

Prerequisites

For a working connection with, for example, an iSHARE satellite you need a participant registration.

  • From the registration with an iSHARE Satellite.
    • (encryption) The registered Certificate's private RSA key. This must be kept SECRET!
    • (x509 header) The registered Certificate's public x509 certificate chain.
    • (client_id) The registered participant's EORI number
    • The registered participant adherence status is "Active".
  • For every participant Service you want to connect to:
    • (audience) The target service's EORI number
    • (decryption) Their public x509 (can be retrieved from an iSHARE Satellite)
    • The domain of the service you're connecting to

All of these are required to encrypt and decrypt communication between different the iSHARE services. For more detailed information refer to the private key jwt json web token flow here.

Installation

Install this package using pip;

pip install python-ishare

or using poetry;

poetry add python-ishare

The three-step methodology

  1. Create a json web token per iSHARE specification).
  2. Use a client interface to communicate with a role
  3. Use the ISHARESatelliteClient interface to verify a participant

I. Creating the json web token

There is a convenience method (python_ishare.create_jwt) in the package to help create the token.

frompathlibimportPathfromcryptography.x509importload_pem_x509_certificates, Certificatefromcryptography.hazmat.primitives.serializationimportload_pem_private_keyfromcryptography.hazmat.primitives.asymmetric.rsaimportRSAPrivateKeyfrompython_ishareimportcreate_jwtYOUR_PARTICIPANT_EORI="XXX"THEIR_PARTICIPANT_EORI="YYY"# Load your RSA key to an RSAPrivateKeywithPath("path/to/my/key.pem") asfile:
private_key: RSAPrivateKey=load_pem_private_key(
file.read_bytes(),
password=b"your_password_or_None"
)
withPath("path/to/my/certs.pem") asfile:
chain: list[Certificate] =load_pem_x509_certificates(
file.read_bytes()
) # Create the actual tokenmy_token=create_jwt(
payload={
"iss": YOUR_PARTICIPANT_EORI,
"sub": YOUR_PARTICIPANT_EORI,
"aud": THEIR_PARTICIPANT_EORI,
"jti": "your-unique-id"# optional
},
private_key=private_key,
x5c_certificate_chain=chain
)

This method is strictly seperated out from the client interfacing (next step). This is for two reasons;

  • It makes you responsible for loading the Certificate's from the chain and RSAPrivateKey as such that these important files can be stored anywhere.
  • It makes it possible to sign the json web token externally using an AWS asymmetric key for example. A great security solution.

II. Connecting to an iSHARE Satellite

To connect to an iSHARE satellite this package provides an ISHARESatelliteClient interface class.

frompython_ishareimportISHARESatelliteClient# From step 1YOUR_PARTICIPANT_EORI="XXX"my_token=create_jwt(...)
public_key= ...
client=ISHARESatelliteClient(
target_domain="satellite.ishare.com",
target_public_key=public_key,
client_eori=YOUR_PARTICIPANT_EORI,
json_web_token=my_token
)
# To retrieve the satellite's capabilitiescapabilities=client.get_capabilities()
print(capabilities)
# To retrieve the satellite's public capabilitiespublic_capabilities=client.get_capabilities(use_token=False)
print(public_capabilities)

The value of this interface class is that you never needed to worry about access tokens. This is handled for you underwater. Tokens are re-used whenever a new request is made.

III. Verifying an iSHARE participant

Verifying a participant is a key responsibility for a number of roles. The ISHARESatelliteClient has a method to do this for you.

# From step 2YOUR_PARTICIPANT_EORI="XXX"client=IShareSatelliteClient(...)
# Assuming you have some python web framework there will be a requestrequest= ...
# If you're a service provider, you can use this to verify other parties iSHARE tokensclient.verify_json_web_token(
audience=YOUR_PARTICIPANT_EORI,
client_id=request.param["client_id"],
client_assertion=request.param["client_assertion"],
client_assertion_type=request.param["client_assertion_type"],
grant_type=request.param["grant_type"],
scope=request.param["scope"],
)

Important

The verify_json_web_token currently does not implement full Certificate validation!

Developer Setup

Everything needed to start developing on this package.

Quick start || tl;dr

  1. Install the python package management tool; poetry.

    curl -sSL https://install.python-poetry.org | python3 -
  2. Install the local python project.

    poetry install
  3. Run the test suite and linters using tox.

    poetry run tox
  4. Run development commands inside the virtualenv.

    poetry run <my_command>

Setup

This project runs on a central pyproject.toml configuration. Here you can find the information for what python version to use and dependencies. Configuration for the various linters, testing frameworks is also defined there.

Poetry - Project installer

Poetry is a smooth dependency manager for Python that is seemingly taking over the market. The Documentation is of excellent quality.

Poetry installation:

curl -sSL https://install.python-poetry.org | python3 -

For a specific version of poetry:

curl -sSL https://install.python-poetry.org | python3 - --version <POETRY_VERSION>

For users of pipx:

pipx install poetry

Project Installation

Running poetry install will install the source code and all it's dependencies including development packages.

Pythonic Dependencies

Behind the scenes Poetry creates and manages the virtualenv with all the python package dependencies necessary for the project. This means that to access packages and scripts installed by Poetry you need to run commands in that environment.

There are two different ways, pick your favorite;

  • Wrap your command in a poetry run format. For example;

    # poetry run <my_sub_command>
    poetry run black
  • Activate the virtualenv in your shell, and all commands will run accordingly.

    # <my_sub_command>
    poetry shell
    # Spawns a shell with the venv activated
    black
    # (And all other commands after that)

💡 There are IDE's that understand Poetry and handle it for you so you don't have to do anything else. For instance in PyCharm, you can configure your interpreter to use Poetry.

Linting libraries used

The following packages are used to ensure code cody cleanliness and monitor some known/preventable security issues.

  • black is used to auto-format code.
  • isort is used to automatically sort imports.
  • flake8 is used enforce standard style guide conventions not automatically handled by black.
  • bandit is used to detect some common security issues.
  • mypy is used to validate python typehints for correctness.
  • safety is used to check dependencies for known security issues against a database.
  • tox is used to run all of the above commands inside an isolated python environment.

About

Python implementation of iSHARE Satellite and Authorization Registry APIs.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Introduction

Welcome to the python ishare package. This package implements helpers for the authentication flow between iSHARE services. Specifically, the part of the process where a json web token (per iSHARE specification) is transformed into an access token. This access token can then be used to communicate with the rest of a Role's service endpoints.

This package could be relevant for connecting to/from the following roles:

  • Satellite or Data Space Authorities
  • Authentication Registries
  • Identity Providers
  • Service or Data Provider
  • Service or Data Consumers

For more information on ISHARE;

Usage

Prerequisites

For a working connection with, for example, an iSHARE satellite you need a participant registration.

  • From the registration with an iSHARE Satellite.
    • (encryption) The registered Certificate's private RSA key. This must be kept SECRET!
    • (x509 header) The registered Certificate's public x509 certificate chain.
    • (client_id) The registered participant's EORI number
    • The registered participant adherence status is "Active".
  • For every participant Service you want to connect to:
    • (audience) The target service's EORI number
    • (decryption) Their public x509 (can be retrieved from an iSHARE Satellite)
    • The domain of the service you're connecting to

All of these are required to encrypt and decrypt communication between different the iSHARE services. For more detailed information refer to the private key jwt json web token flow here.

Installation

Install this package using pip;

pip install python-ishare

or using poetry;

poetry add python-ishare

The three-step methodology

  1. Create a json web token per iSHARE specification).
  2. Use a client interface to communicate with a role
  3. Use the ISHARESatelliteClient interface to verify a participant

I. Creating the json web token

There is a convenience method (python_ishare.create_jwt) in the package to help create the token.

frompathlibimportPathfromcryptography.x509importload_pem_x509_certificates, Certificatefromcryptography.hazmat.primitives.serializationimportload_pem_private_keyfromcryptography.hazmat.primitives.asymmetric.rsaimportRSAPrivateKeyfrompython_ishareimportcreate_jwtYOUR_PARTICIPANT_EORI="XXX"THEIR_PARTICIPANT_EORI="YYY"# Load your RSA key to an RSAPrivateKeywithPath("path/to/my/key.pem") asfile:
private_key: RSAPrivateKey=load_pem_private_key(
file.read_bytes(),
password=b"your_password_or_None"
)
withPath("path/to/my/certs.pem") asfile:
chain: list[Certificate] =load_pem_x509_certificates(
file.read_bytes()
) # Create the actual tokenmy_token=create_jwt(
payload={
"iss": YOUR_PARTICIPANT_EORI,
"sub": YOUR_PARTICIPANT_EORI,
"aud": THEIR_PARTICIPANT_EORI,
"jti": "your-unique-id"# optional
},
private_key=private_key,
x5c_certificate_chain=chain
)

This method is strictly seperated out from the client interfacing (next step). This is for two reasons;

  • It makes you responsible for loading the Certificate's from the chain and RSAPrivateKey as such that these important files can be stored anywhere.
  • It makes it possible to sign the json web token externally using an AWS asymmetric key for example. A great security solution.

II. Connecting to an iSHARE Satellite

To connect to an iSHARE satellite this package provides an ISHARESatelliteClient interface class.

frompython_ishareimportISHARESatelliteClient# From step 1YOUR_PARTICIPANT_EORI="XXX"my_token=create_jwt(...)
public_key= ...
client=ISHARESatelliteClient(
target_domain="satellite.ishare.com",
target_public_key=public_key,
client_eori=YOUR_PARTICIPANT_EORI,
json_web_token=my_token
)
# To retrieve the satellite's capabilitiescapabilities=client.get_capabilities()
print(capabilities)
# To retrieve the satellite's public capabilitiespublic_capabilities=client.get_capabilities(use_token=False)
print(public_capabilities)

The value of this interface class is that you never needed to worry about access tokens. This is handled for you underwater. Tokens are re-used whenever a new request is made.

III. Verifying an iSHARE participant

Verifying a participant is a key responsibility for a number of roles. The ISHARESatelliteClient has a method to do this for you.

# From step 2YOUR_PARTICIPANT_EORI="XXX"client=IShareSatelliteClient(...)
# Assuming you have some python web framework there will be a requestrequest= ...
# If you're a service provider, you can use this to verify other parties iSHARE tokensclient.verify_json_web_token(
audience=YOUR_PARTICIPANT_EORI,
client_id=request.param["client_id"],
client_assertion=request.param["client_assertion"],
client_assertion_type=request.param["client_assertion_type"],
grant_type=request.param["grant_type"],
scope=request.param["scope"],
)

Important

The verify_json_web_token currently does not implement full Certificate validation!

Developer Setup

Everything needed to start developing on this package.

Quick start || tl;dr

  1. Install the python package management tool; poetry.

    curl -sSL https://install.python-poetry.org | python3 -
  2. Install the local python project.

    poetry install
  3. Run the test suite and linters using tox.

    poetry run tox
  4. Run development commands inside the virtualenv.

    poetry run <my_command>

Setup

This project runs on a central pyproject.toml configuration. Here you can find the information for what python version to use and dependencies. Configuration for the various linters, testing frameworks is also defined there.

Poetry - Project installer

Poetry is a smooth dependency manager for Python that is seemingly taking over the market. The Documentation is of excellent quality.

Poetry installation:

curl -sSL https://install.python-poetry.org | python3 -

For a specific version of poetry:

curl -sSL https://install.python-poetry.org | python3 - --version <POETRY_VERSION>

For users of pipx:

pipx install poetry

Project Installation

Running poetry install will install the source code and all it's dependencies including development packages.

Pythonic Dependencies

Behind the scenes Poetry creates and manages the virtualenv with all the python package dependencies necessary for the project. This means that to access packages and scripts installed by Poetry you need to run commands in that environment.

There are two different ways, pick your favorite;

  • Wrap your command in a poetry run format. For example;

    # poetry run <my_sub_command>
    poetry run black
  • Activate the virtualenv in your shell, and all commands will run accordingly.

    # <my_sub_command>
    poetry shell
    # Spawns a shell with the venv activated
    black
    # (And all other commands after that)

💡 There are IDE's that understand Poetry and handle it for you so you don't have to do anything else. For instance in PyCharm, you can configure your interpreter to use Poetry.

Linting libraries used

The following packages are used to ensure code cody cleanliness and monitor some known/preventable security issues.

  • black is used to auto-format code.
  • isort is used to automatically sort imports.
  • flake8 is used enforce standard style guide conventions not automatically handled by black.
  • bandit is used to detect some common security issues.
  • mypy is used to validate python typehints for correctness.
  • safety is used to check dependencies for known security issues against a database.
  • tox is used to run all of the above commands inside an isolated python environment.

About

Python implementation of iSHARE Satellite and Authorization Registry APIs.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Introduction

Welcome to the python ishare package. This package implements helpers for the authentication flow between iSHARE services. Specifically, the part of the process where a json web token (per iSHARE specification) is transformed into an access token. This access token can then be used to communicate with the rest of a Role's service endpoints.

This package could be relevant for connecting to/from the following roles:

  • Satellite or Data Space Authorities
  • Authentication Registries
  • Identity Providers
  • Service or Data Provider
  • Service or Data Consumers

For more information on ISHARE;

Usage

Prerequisites

For a working connection with, for example, an iSHARE satellite you need a participant registration.

  • From the registration with an iSHARE Satellite.
    • (encryption) The registered Certificate's private RSA key. This must be kept SECRET!
    • (x509 header) The registered Certificate's public x509 certificate chain.
    • (client_id) The registered participant's EORI number
    • The registered participant adherence status is "Active".
  • For every participant Service you want to connect to:
    • (audience) The target service's EORI number
    • (decryption) Their public x509 (can be retrieved from an iSHARE Satellite)
    • The domain of the service you're connecting to

All of these are required to encrypt and decrypt communication between different the iSHARE services. For more detailed information refer to the private key jwt json web token flow here.

Installation

Install this package using pip;

pip install python-ishare

or using poetry;

poetry add python-ishare

The three-step methodology

  1. Create a json web token per iSHARE specification).
  2. Use a client interface to communicate with a role
  3. Use the ISHARESatelliteClient interface to verify a participant

I. Creating the json web token

There is a convenience method (python_ishare.create_jwt) in the package to help create the token.

frompathlibimportPathfromcryptography.x509importload_pem_x509_certificates, Certificatefromcryptography.hazmat.primitives.serializationimportload_pem_private_keyfromcryptography.hazmat.primitives.asymmetric.rsaimportRSAPrivateKeyfrompython_ishareimportcreate_jwtYOUR_PARTICIPANT_EORI="XXX"THEIR_PARTICIPANT_EORI="YYY"# Load your RSA key to an RSAPrivateKeywithPath("path/to/my/key.pem") asfile:
private_key: RSAPrivateKey=load_pem_private_key(
file.read_bytes(),
password=b"your_password_or_None"
)
withPath("path/to/my/certs.pem") asfile:
chain: list[Certificate] =load_pem_x509_certificates(
file.read_bytes()
) # Create the actual tokenmy_token=create_jwt(
payload={
"iss": YOUR_PARTICIPANT_EORI,
"sub": YOUR_PARTICIPANT_EORI,
"aud": THEIR_PARTICIPANT_EORI,
"jti": "your-unique-id"# optional
},
private_key=private_key,
x5c_certificate_chain=chain
)

This method is strictly seperated out from the client interfacing (next step). This is for two reasons;

  • It makes you responsible for loading the Certificate's from the chain and RSAPrivateKey as such that these important files can be stored anywhere.
  • It makes it possible to sign the json web token externally using an AWS asymmetric key for example. A great security solution.

II. Connecting to an iSHARE Satellite

To connect to an iSHARE satellite this package provides an ISHARESatelliteClient interface class.

frompython_ishareimportISHARESatelliteClient# From step 1YOUR_PARTICIPANT_EORI="XXX"my_token=create_jwt(...)
public_key= ...
client=ISHARESatelliteClient(
target_domain="satellite.ishare.com",
target_public_key=public_key,
client_eori=YOUR_PARTICIPANT_EORI,
json_web_token=my_token
)
# To retrieve the satellite's capabilitiescapabilities=client.get_capabilities()
print(capabilities)
# To retrieve the satellite's public capabilitiespublic_capabilities=client.get_capabilities(use_token=False)
print(public_capabilities)

The value of this interface class is that you never needed to worry about access tokens. This is handled for you underwater. Tokens are re-used whenever a new request is made.

III. Verifying an iSHARE participant

Verifying a participant is a key responsibility for a number of roles. The ISHARESatelliteClient has a method to do this for you.

# From step 2YOUR_PARTICIPANT_EORI="XXX"client=IShareSatelliteClient(...)
# Assuming you have some python web framework there will be a requestrequest= ...
# If you're a service provider, you can use this to verify other parties iSHARE tokensclient.verify_json_web_token(
audience=YOUR_PARTICIPANT_EORI,
client_id=request.param["client_id"],
client_assertion=request.param["client_assertion"],
client_assertion_type=request.param["client_assertion_type"],
grant_type=request.param["grant_type"],
scope=request.param["scope"],
)

Important

The verify_json_web_token currently does not implement full Certificate validation!

Developer Setup

Everything needed to start developing on this package.

Quick start || tl;dr

  1. Install the python package management tool; poetry.

    curl -sSL https://install.python-poetry.org | python3 -
  2. Install the local python project.

    poetry install
  3. Run the test suite and linters using tox.

    poetry run tox
  4. Run development commands inside the virtualenv.

    poetry run <my_command>

Setup

This project runs on a central pyproject.toml configuration. Here you can find the information for what python version to use and dependencies. Configuration for the various linters, testing frameworks is also defined there.

Poetry - Project installer

Poetry is a smooth dependency manager for Python that is seemingly taking over the market. The Documentation is of excellent quality.

Poetry installation:

curl -sSL https://install.python-poetry.org | python3 -

For a specific version of poetry:

curl -sSL https://install.python-poetry.org | python3 - --version <POETRY_VERSION>

For users of pipx:

pipx install poetry

Project Installation

Running poetry install will install the source code and all it's dependencies including development packages.

Pythonic Dependencies

Behind the scenes Poetry creates and manages the virtualenv with all the python package dependencies necessary for the project. This means that to access packages and scripts installed by Poetry you need to run commands in that environment.

There are two different ways, pick your favorite;

  • Wrap your command in a poetry run format. For example;

    # poetry run <my_sub_command>
    poetry run black
  • Activate the virtualenv in your shell, and all commands will run accordingly.

    # <my_sub_command>
    poetry shell
    # Spawns a shell with the venv activated
    black
    # (And all other commands after that)

💡 There are IDE's that understand Poetry and handle it for you so you don't have to do anything else. For instance in PyCharm, you can configure your interpreter to use Poetry.

Linting libraries used

The following packages are used to ensure code cody cleanliness and monitor some known/preventable security issues.

  • black is used to auto-format code.
  • isort is used to automatically sort imports.
  • flake8 is used enforce standard style guide conventions not automatically handled by black.
  • bandit is used to detect some common security issues.
  • mypy is used to validate python typehints for correctness.
  • safety is used to check dependencies for known security issues against a database.
  • tox is used to run all of the above commands inside an isolated python environment.

About

Python implementation of iSHARE Satellite and Authorization Registry APIs.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Introduction

Welcome to the python ishare package. This package implements helpers for the authentication flow between iSHARE services. Specifically, the part of the process where a json web token (per iSHARE specification) is transformed into an access token. This access token can then be used to communicate with the rest of a Role's service endpoints.

This package could be relevant for connecting to/from the following roles:

  • Satellite or Data Space Authorities
  • Authentication Registries
  • Identity Providers
  • Service or Data Provider
  • Service or Data Consumers

For more information on ISHARE;

Usage

Prerequisites

For a working connection with, for example, an iSHARE satellite you need a participant registration.

  • From the registration with an iSHARE Satellite.
    • (encryption) The registered Certificate's private RSA key. This must be kept SECRET!
    • (x509 header) The registered Certificate's public x509 certificate chain.
    • (client_id) The registered participant's EORI number
    • The registered participant adherence status is "Active".
  • For every participant Service you want to connect to:
    • (audience) The target service's EORI number
    • (decryption) Their public x509 (can be retrieved from an iSHARE Satellite)
    • The domain of the service you're connecting to

All of these are required to encrypt and decrypt communication between different the iSHARE services. For more detailed information refer to the private key jwt json web token flow here.

Installation

Install this package using pip;

pip install python-ishare

or using poetry;

poetry add python-ishare

The three-step methodology

  1. Create a json web token per iSHARE specification).
  2. Use a client interface to communicate with a role
  3. Use the ISHARESatelliteClient interface to verify a participant

I. Creating the json web token

There is a convenience method (python_ishare.create_jwt) in the package to help create the token.

frompathlibimportPathfromcryptography.x509importload_pem_x509_certificates, Certificatefromcryptography.hazmat.primitives.serializationimportload_pem_private_keyfromcryptography.hazmat.primitives.asymmetric.rsaimportRSAPrivateKeyfrompython_ishareimportcreate_jwtYOUR_PARTICIPANT_EORI="XXX"THEIR_PARTICIPANT_EORI="YYY"# Load your RSA key to an RSAPrivateKeywithPath("path/to/my/key.pem") asfile:
private_key: RSAPrivateKey=load_pem_private_key(
file.read_bytes(),
password=b"your_password_or_None"
)
withPath("path/to/my/certs.pem") asfile:
chain: list[Certificate] =load_pem_x509_certificates(
file.read_bytes()
) # Create the actual tokenmy_token=create_jwt(
payload={
"iss": YOUR_PARTICIPANT_EORI,
"sub": YOUR_PARTICIPANT_EORI,
"aud": THEIR_PARTICIPANT_EORI,
"jti": "your-unique-id"# optional
},
private_key=private_key,
x5c_certificate_chain=chain
)

This method is strictly seperated out from the client interfacing (next step). This is for two reasons;

  • It makes you responsible for loading the Certificate's from the chain and RSAPrivateKey as such that these important files can be stored anywhere.
  • It makes it possible to sign the json web token externally using an AWS asymmetric key for example. A great security solution.

II. Connecting to an iSHARE Satellite

To connect to an iSHARE satellite this package provides an ISHARESatelliteClient interface class.

frompython_ishareimportISHARESatelliteClient# From step 1YOUR_PARTICIPANT_EORI="XXX"my_token=create_jwt(...)
public_key= ...
client=ISHARESatelliteClient(
target_domain="satellite.ishare.com",
target_public_key=public_key,
client_eori=YOUR_PARTICIPANT_EORI,
json_web_token=my_token
)
# To retrieve the satellite's capabilitiescapabilities=client.get_capabilities()
print(capabilities)
# To retrieve the satellite's public capabilitiespublic_capabilities=client.get_capabilities(use_token=False)
print(public_capabilities)

The value of this interface class is that you never needed to worry about access tokens. This is handled for you underwater. Tokens are re-used whenever a new request is made.

III. Verifying an iSHARE participant

Verifying a participant is a key responsibility for a number of roles. The ISHARESatelliteClient has a method to do this for you.

# From step 2YOUR_PARTICIPANT_EORI="XXX"client=IShareSatelliteClient(...)
# Assuming you have some python web framework there will be a requestrequest= ...
# If you're a service provider, you can use this to verify other parties iSHARE tokensclient.verify_json_web_token(
audience=YOUR_PARTICIPANT_EORI,
client_id=request.param["client_id"],
client_assertion=request.param["client_assertion"],
client_assertion_type=request.param["client_assertion_type"],
grant_type=request.param["grant_type"],
scope=request.param["scope"],
)

Important

The verify_json_web_token currently does not implement full Certificate validation!

Developer Setup

Everything needed to start developing on this package.

Quick start || tl;dr

  1. Install the python package management tool; poetry.

    curl -sSL https://install.python-poetry.org | python3 -
  2. Install the local python project.

    poetry install
  3. Run the test suite and linters using tox.

    poetry run tox
  4. Run development commands inside the virtualenv.

    poetry run <my_command>

Setup

This project runs on a central pyproject.toml configuration. Here you can find the information for what python version to use and dependencies. Configuration for the various linters, testing frameworks is also defined there.

Poetry - Project installer

Poetry is a smooth dependency manager for Python that is seemingly taking over the market. The Documentation is of excellent quality.

Poetry installation:

curl -sSL https://install.python-poetry.org | python3 -

For a specific version of poetry:

curl -sSL https://install.python-poetry.org | python3 - --version <POETRY_VERSION>

For users of pipx:

pipx install poetry

Project Installation

Running poetry install will install the source code and all it's dependencies including development packages.

Pythonic Dependencies

Behind the scenes Poetry creates and manages the virtualenv with all the python package dependencies necessary for the project. This means that to access packages and scripts installed by Poetry you need to run commands in that environment.

There are two different ways, pick your favorite;

  • Wrap your command in a poetry run format. For example;

    # poetry run <my_sub_command>
    poetry run black
  • Activate the virtualenv in your shell, and all commands will run accordingly.

    # <my_sub_command>
    poetry shell
    # Spawns a shell with the venv activated
    black
    # (And all other commands after that)

💡 There are IDE's that understand Poetry and handle it for you so you don't have to do anything else. For instance in PyCharm, you can configure your interpreter to use Poetry.

Linting libraries used

The following packages are used to ensure code cody cleanliness and monitor some known/preventable security issues.

  • black is used to auto-format code.
  • isort is used to automatically sort imports.
  • flake8 is used enforce standard style guide conventions not automatically handled by black.
  • bandit is used to detect some common security issues.
  • mypy is used to validate python typehints for correctness.
  • safety is used to check dependencies for known security issues against a database.
  • tox is used to run all of the above commands inside an isolated python environment.

About

Python implementation of iSHARE Satellite and Authorization Registry APIs.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Introduction

Welcome to the python ishare package. This package implements helpers for the authentication flow between iSHARE services. Specifically, the part of the process where a json web token (per iSHARE specification) is transformed into an access token. This access token can then be used to communicate with the rest of a Role's service endpoints.

This package could be relevant for connecting to/from the following roles:

  • Satellite or Data Space Authorities
  • Authentication Registries
  • Identity Providers
  • Service or Data Provider
  • Service or Data Consumers

For more information on ISHARE;

Usage

Prerequisites

For a working connection with, for example, an iSHARE satellite you need a participant registration.

  • From the registration with an iSHARE Satellite.
    • (encryption) The registered Certificate's private RSA key. This must be kept SECRET!
    • (x509 header) The registered Certificate's public x509 certificate chain.
    • (client_id) The registered participant's EORI number
    • The registered participant adherence status is "Active".
  • For every participant Service you want to connect to:
    • (audience) The target service's EORI number
    • (decryption) Their public x509 (can be retrieved from an iSHARE Satellite)
    • The domain of the service you're connecting to

All of these are required to encrypt and decrypt communication between different the iSHARE services. For more detailed information refer to the private key jwt json web token flow here.

Installation

Install this package using pip;

pip install python-ishare

or using poetry;

poetry add python-ishare

The three-step methodology

  1. Create a json web token per iSHARE specification).
  2. Use a client interface to communicate with a role
  3. Use the ISHARESatelliteClient interface to verify a participant

I. Creating the json web token

There is a convenience method (python_ishare.create_jwt) in the package to help create the token.

frompathlibimportPathfromcryptography.x509importload_pem_x509_certificates, Certificatefromcryptography.hazmat.primitives.serializationimportload_pem_private_keyfromcryptography.hazmat.primitives.asymmetric.rsaimportRSAPrivateKeyfrompython_ishareimportcreate_jwtYOUR_PARTICIPANT_EORI="XXX"THEIR_PARTICIPANT_EORI="YYY"# Load your RSA key to an RSAPrivateKeywithPath("path/to/my/key.pem") asfile:
private_key: RSAPrivateKey=load_pem_private_key(
file.read_bytes(),
password=b"your_password_or_None"
)
withPath("path/to/my/certs.pem") asfile:
chain: list[Certificate] =load_pem_x509_certificates(
file.read_bytes()
) # Create the actual tokenmy_token=create_jwt(
payload={
"iss": YOUR_PARTICIPANT_EORI,
"sub": YOUR_PARTICIPANT_EORI,
"aud": THEIR_PARTICIPANT_EORI,
"jti": "your-unique-id"# optional
},
private_key=private_key,
x5c_certificate_chain=chain
)

This method is strictly seperated out from the client interfacing (next step). This is for two reasons;

  • It makes you responsible for loading the Certificate's from the chain and RSAPrivateKey as such that these important files can be stored anywhere.
  • It makes it possible to sign the json web token externally using an AWS asymmetric key for example. A great security solution.

II. Connecting to an iSHARE Satellite

To connect to an iSHARE satellite this package provides an ISHARESatelliteClient interface class.

frompython_ishareimportISHARESatelliteClient# From step 1YOUR_PARTICIPANT_EORI="XXX"my_token=create_jwt(...)
public_key= ...
client=ISHARESatelliteClient(
target_domain="satellite.ishare.com",
target_public_key=public_key,
client_eori=YOUR_PARTICIPANT_EORI,
json_web_token=my_token
)
# To retrieve the satellite's capabilitiescapabilities=client.get_capabilities()
print(capabilities)
# To retrieve the satellite's public capabilitiespublic_capabilities=client.get_capabilities(use_token=False)
print(public_capabilities)

The value of this interface class is that you never needed to worry about access tokens. This is handled for you underwater. Tokens are re-used whenever a new request is made.

III. Verifying an iSHARE participant

Verifying a participant is a key responsibility for a number of roles. The ISHARESatelliteClient has a method to do this for you.

# From step 2YOUR_PARTICIPANT_EORI="XXX"client=IShareSatelliteClient(...)
# Assuming you have some python web framework there will be a requestrequest= ...
# If you're a service provider, you can use this to verify other parties iSHARE tokensclient.verify_json_web_token(
audience=YOUR_PARTICIPANT_EORI,
client_id=request.param["client_id"],
client_assertion=request.param["client_assertion"],
client_assertion_type=request.param["client_assertion_type"],
grant_type=request.param["grant_type"],
scope=request.param["scope"],
)

Important

The verify_json_web_token currently does not implement full Certificate validation!

Developer Setup

Everything needed to start developing on this package.

Quick start || tl;dr

  1. Install the python package management tool; poetry.

    curl -sSL https://install.python-poetry.org | python3 -
  2. Install the local python project.

    poetry install
  3. Run the test suite and linters using tox.

    poetry run tox
  4. Run development commands inside the virtualenv.

    poetry run <my_command>

Setup

This project runs on a central pyproject.toml configuration. Here you can find the information for what python version to use and dependencies. Configuration for the various linters, testing frameworks is also defined there.

Poetry - Project installer

Poetry is a smooth dependency manager for Python that is seemingly taking over the market. The Documentation is of excellent quality.

Poetry installation:

curl -sSL https://install.python-poetry.org | python3 -

For a specific version of poetry:

curl -sSL https://install.python-poetry.org | python3 - --version <POETRY_VERSION>

For users of pipx:

pipx install poetry

Project Installation

Running poetry install will install the source code and all it's dependencies including development packages.

Pythonic Dependencies

Behind the scenes Poetry creates and manages the virtualenv with all the python package dependencies necessary for the project. This means that to access packages and scripts installed by Poetry you need to run commands in that environment.

There are two different ways, pick your favorite;

  • Wrap your command in a poetry run format. For example;

    # poetry run <my_sub_command>
    poetry run black
  • Activate the virtualenv in your shell, and all commands will run accordingly.

    # <my_sub_command>
    poetry shell
    # Spawns a shell with the venv activated
    black
    # (And all other commands after that)

💡 There are IDE's that understand Poetry and handle it for you so you don't have to do anything else. For instance in PyCharm, you can configure your interpreter to use Poetry.

Linting libraries used

The following packages are used to ensure code cody cleanliness and monitor some known/preventable security issues.

  • black is used to auto-format code.
  • isort is used to automatically sort imports.
  • flake8 is used enforce standard style guide conventions not automatically handled by black.
  • bandit is used to detect some common security issues.
  • mypy is used to validate python typehints for correctness.
  • safety is used to check dependencies for known security issues against a database.
  • tox is used to run all of the above commands inside an isolated python environment.

About

Python implementation of iSHARE Satellite and Authorization Registry APIs.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages