No project description provided
Project description
CERN Requests
Enables using requests without having to configure the CERN Root certificates or getting an API access token manually.
Inspired by certifi, requests-kerberos, cern-sso-python and api-access-examples.
The Root certificate bundle is copied from the linuxsoft cern page and can also be created manually by downloading the CERN Grid Certification Authority files from cafiles.cern.ch/cafiles.
Installation
Warning We are no longer supporting Python 2.7.
Requires Python 3.6+.
pip install cernrequests
Prerequisites
For sites requiring an SSL Grid certificate
Request a Grid User Certificate (with password) and convert into public and private key:
mkdir -p ~/private
openssl pkcs12 -in myCertificate.p12 -clcerts -nokeys -out ~/private/usercert.pem # Will ask for the certificate password
openssl pkcs12 -in myCertificate.p12 -nocerts -nodes -out ~/private/userkey.pem # Will ask for the certificate password
The .pem certificates have to be passwordless.
For CERN APIs using the ""new"" SSO
An .env file at the root of your project with the following variables set:
SSO_CLIENT_IDSSO_CLIENT_SECRET
(You can rename the .env_sample file to .env and add the values there).
To request them, you will need to register your application:
-
Create an SSO registration for your application on the CERN Application Portal:
-
Add an application identifier and description:
The
Application Identifiercan be anything, it's like a username for your application.tClick
Submit. -
Go back to the Application Portal and edit the SSO application (green button). Then, go to the
SSO Registrationtab and click the plus button: -
Fill out the form of the new SSO registration as follows:
- You can put any value in the
Redirect URI(s), e.g.http://localhost/* - Same for the
Base URL - Make sure you click
My application will need to get tokens using its own client ID and secret.
- You can put any value in the
-
Submit the form:
Note the
client idandclient secretthat the form will show you.
Usage
Example
With Grid Certificates
import cernrequests
url = "https://<your-cern-website>"
response = cernrequests.get(url)
With API Token
If you want to access a website which requires a (""new"") CERN Single Sign-on token you can do the following:
import cernrequests
url = "https://<your-cern-website-url>"
reponse = cernrequests.get_with_token(url, target_audience="<the SSO id of the target URL>")
Note The
target_audiencedepends on the SSO registration name of the target application. E.g. if you want to access the development instance of Run Registry,target_audienceshould bedev-cmsrunregistry-sso-proxy. In case of doubt, communicate with the app's developers directly.
The get_with_token method also accepts an api_token argument, in case you want to reuse an already issued and non-expired one that you got from get_api_token.
get_api_token
This is a method that needs a target_application parameter and will try and get an API token, using the SSO_CLIENT_ID and SSO_CLIENT_SECRET provided as environment variables.
A tuple is returned: api_token (str) and the expiration_datetime (datetime).
Note The
expiration_datetimeis not used internally, so it's returned to the user, if they need to check when the token expires.
Alternative usage
If you want to use requests directly without the CERN wrapper you can get the exact same functionality by doing:
import requests
from cernrequests import certs
url = "https://<your-cern-website>"
cert = certs.default_user_certificate_paths()
ca_bundle = certs.where()
response = requests.get(url, cert=cert, verify=ca_bundle)
Configuration
Grid certificates
The default user certificate paths are first ~\private\ and ~\.globus\ for fallback. The default public key file name is usercert.pem and the default private key file name is userkey.pem
You can configure the default grid user certificate path by setting the CERN_CERTIFICATE_PATH environment variable.
For example:
export CERN_CERTIFICATE_PATH=${HOME}/my_custom_folder
This will still assume that your filenames are usercert.pem and userkey.pem
Write this line in your .bashrc to make the configuration persistent.
Alternatively you can also specify the paths directly in your code:
import cernrequests
url = "https://<your-cern-website>"
cert = "my/custom/path/cert.pem" # Public key path
key = "my/custom/path/key.pem" # Private key path
cernrequests.get(url, cert=(cert,key))
This way you can even use custom names such as cert.pem and key.pem
Testing
Locally
python -m venv venv
source venv/bin/activate
pip install -e .
pip install -r testing-requirements.txt
pytest
GitHub actions
To run the tests on GitHub, we have uploaded a set of userkey.pem and usercert.pem files, encrypted with GPG. Those are decrypted, using a secret and then used normally.
See the yaml file for more details.
Note If the actions are failing, make sure that the Grid Certificates are still valid. You may need to recreate them. For instructions, see here. Create new grid certificates, encrypt them with a password and replace
tests/usercert.pem.gpgandtests/userkey.pem.gpg. You will also need to update theGPG_ENC_PASSWORDsecret with the password you used to encrypt them.
[Package developers] Updating the package on PyPI
python3 -m pip install --upgrade pip build twine
python3 -m build
python3 -m twine upload --skip-existing --repository pypi dist/*
Instructions from here.
FAQ
I'm getting certificate verify failed! What should I do?
The cernrequests/cern-cacerts.pem file has expired, and will need to be updated by the library maintainer.
-
git clone https://gitlab.cern.ch/linuxsupport/rpms/cern-ca-certs/ cd cern-ca-certs/src make
This will create aCERN-bundle.pemfile. - Rename it to
cern-cacerts.pemand replace the original.pemcertificate chain.
Verify that the certs work by running pytest.
I'm getting 403 Client Error: Forbidden for url: https://login.cern.ch/adfs/ls/auth/sslclient errors!1 What should I do?
- Your grid certificate may have expired. Try creating a new one.
- You may be trying to access a CERN webpage using a grid certificate, but this method may be deprecated. Make sure that the web page allows SSL certificate authentication.
References
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cernrequests-0.5.0.tar.gz.
File metadata
- Download URL: cernrequests-0.5.0.tar.gz
- Upload date:
- Size: 23.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f357dd982684c36c7dc871b1a4a004490aa0370e79c8f274d45980cf04f2459
|
|
| MD5 |
ae69330205de4b2435bf44c922cedf6c
|
|
| BLAKE2b-256 |
372c4de9a67317e89dbe78084d6fa92c1bf62a0b37aa4f66fec7e2bde3f2f8d8
|
File details
Details for the file cernrequests-0.5.0-py3-none-any.whl.
File metadata
- Download URL: cernrequests-0.5.0-py3-none-any.whl
- Upload date:
- Size: 21.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f903f88274a9c775c6d19a2f24247cf0a64330e731df5fcd1e895a68514bae2
|
|
| MD5 |
70c6a932a82564275d0fb300121ddae5
|
|
| BLAKE2b-256 |
d0ffbcbc4a61ef90752ecaeeb671c85b6f5343661d5fce53e9c0f2f88ea2dab1
|