From 70690834b7350478661fd27a6c97c6109d126b70 Mon Sep 17 00:00:00 2001 From: moauto <54212639+mo-auto@users.noreply.github.com> Date: Thu, 16 Jan 2025 23:30:36 +0000 Subject: [PATCH] Deployed b531cd85ec to nightly with MkDocs 1.4.1 and mike 1.1.2 --- nightly/CONTRIBUTING/index.html | 4 ++-- .../administration/quick-start/index.html | 2 +- .../developer/add-authn-methods/index.html | 4 ++-- nightly/casa/developer/overview/index.html | 8 +++---- nightly/casa/index.html | 4 ++-- nightly/casa/plugins/2fa-settings/index.html | 4 ++-- .../account-linking-index/index.html | 6 ++--- .../accts-linking-agama/index.html | 4 ++-- nightly/casa/plugins/bioid/index.html | 2 +- .../plugins/consent-management/index.html | 2 +- .../casa/plugins/custom-branding/index.html | 2 +- nightly/casa/plugins/email-otp/index.html | 4 ++-- nightly/cedarling/cedarling-authz/index.html | 16 ++++++------- .../cedarling-policy-store/index.html | 10 ++++---- nightly/cedarling/python/sidecar/index.html | 16 +++++++------ nightly/contribute/developer-faq/index.html | 2 +- .../auth-server/client-management/index.html | 2 +- .../endpoints/access-evaluation/index.html | 2 +- .../authorization-challenge/index.html | 2 +- .../endpoints/authorization/index.html | 2 +- .../endpoints/clientinfo/index.html | 2 +- .../endpoints/end-session/index.html | 2 +- .../global-token-revocation/index.html | 2 +- .../endpoints/introspection/index.html | 2 +- .../auth-server/endpoints/par/index.html | 2 +- .../endpoints/session-revocation/index.html | 2 +- .../auth-server/endpoints/ssa/index.html | 2 +- .../endpoints/token-revocation/index.html | 2 +- .../auth-server/endpoints/token/index.html | 2 +- .../auth-server/endpoints/userinfo/index.html | 2 +- .../json-web-key-config/index.html | 2 +- .../oauth-umaresources-config/index.html | 2 +- .../config-tools/config-api/index.html | 2 +- .../config-api/plugins/index.html | 2 +- .../docker-install/quick-start/index.html | 2 +- .../install/helm-install/local/index.html | 2 +- .../vm-install/dynamic-download/index.html | 2 +- .../install/vm-install/rhel/index.html | 10 ++++---- .../install/vm-install/suse/index.html | 8 +++---- .../install/vm-install/ubuntu/index.html | 22 +++++++++--------- .../kubernetes-ops/backup-restore/index.html | 4 ++-- .../kubernetes-ops/cert-management/index.html | 6 ++--- .../kubernetes-ops/tui-k8s/index.html | 2 +- .../kubernetes-ops/upgrade/index.html | 2 +- .../planning/benchmarking/index.html | 4 ++-- .../self-service-password-2fa/index.html | 2 +- .../recipes/benchmark/index.html | 18 +++++++------- .../reference/openapi/index.html | 8 +++---- .../janssen-server/vm-ops/upgrade/index.html | 8 +++---- .../OpenBanking/Registration.py | 6 ++--- .../client-registration/index.html | 2 +- .../sample-script/SampleScript.py | 6 ++--- .../sample-script/ConsentGatheringSample.py | 2 +- .../idp/idp-extension/index.html | 2 +- .../idp/sample-script/SampleScript.py | 2 +- .../persistence/index.html | 4 ++-- .../apple-external-authenticator/index.html | 4 ++-- .../duo-external-authenticator/index.html | 6 ++--- .../fido2-external-authenticator/index.html | 12 +++++----- .../google-external-authenticator/index.html | 8 +++---- .../other/obconnect/README.me | 2 +- .../other/obconnect/documentation/README.txt | 2 +- .../uaf/Properties description/index.html | 2 +- .../other/uaf/index.html | 2 +- .../index.html | 6 ++--- .../twilio-2fa/index.html | 4 ++-- .../ropc/index.html | 8 +++---- nightly/search/search_index.json | 2 +- nightly/sitemap.xml.gz | Bin 4866 -> 4866 bytes 69 files changed, 156 insertions(+), 152 deletions(-) diff --git a/nightly/CONTRIBUTING/index.html b/nightly/CONTRIBUTING/index.html index 15a052c804b..3485dcd88c6 100644 --- a/nightly/CONTRIBUTING/index.html +++ b/nightly/CONTRIBUTING/index.html @@ -8727,11 +8727,11 @@
Above command contains references to the release number at two places. v1.1.4
in the URL and 1.1.4
as part of the file
name. There are many such places throughout the documentation when release numbers need to be mentioned. Whenever we
make a new release, these numbers need to change as they point to the latest release number. This becomes a manual task.
To avoid this manual, error-prone approach the Janssen Project uses a release marker, 0.0.0-nightly
instead
+
To avoid this manual, error-prone approach the Janssen Project uses a release marker, replace-janssen-version
instead
of writing actual release numbers in the head
(latest) documentation branch. So, when there is a need to mention the release number, instead of
writing the actual release number, use the release marker. Let's see how to document the above command (at the head
version)
so that it stays up-to-date release after release.
wget https://github.com/JanssenProject/jans/releases/download/nightly/jans_0.0.0-nightly.ubuntu20.04_amd64.deb -P /tmp
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans_replace-janssen-version.ubuntu20.04_amd64.deb -P /tmp
Warning
diff --git a/nightly/casa/administration/quick-start/index.html b/nightly/casa/administration/quick-start/index.html
index 00c2772f363..dedbee8539a 100644
--- a/nightly/casa/administration/quick-start/index.html
+++ b/nightly/casa/administration/quick-start/index.html
@@ -8665,7 +8665,7 @@ Jans Casa Quick Start GuideInstallation#
-
Jans Casa can be used with Janssen Server or Gluu Flex Server. At installation time (applies to any of these two products), you will be prompted if you desire to include Casa. If you want to add Casa post-installation, you will simply have to re-run the installer and ensure to select Casa.
+Jans Casa can be used with Janssen Server or Gluu Flex Server. At installation time (applies to any of these two products), you will be prompted if you desire to include Casa. If you want to add Casa post-installation, you will simply have to re-run the installer and ensure to select Casa.
Configuration#
Enable authentication methods#
The "out-of-the-box" login experience in Casa consists of the usual username and password prompt. To start leveraging a stronger authentication login to Casa with an administrative account (visit https://<your-server-name>/jans-casa
) and activate the methods you want to offer Casa users.
diff --git a/nightly/casa/developer/add-authn-methods/index.html b/nightly/casa/developer/add-authn-methods/index.html
index cd78a36e903..434798da0ed 100644
--- a/nightly/casa/developer/add-authn-methods/index.html
+++ b/nightly/casa/developer/add-authn-methods/index.html
@@ -8804,7 +8804,7 @@ About Casa authentication flowFlow requisites#
-To code the flow corresponding to the authentication method to add, you can use the Agama project found here as a canvas. Ensure the following conditions are met so that it properly integrates in the main Casa flow:
+To code the flow corresponding to the authentication method to add, you can use the Agama project found here as a canvas. Ensure the following conditions are met so that it properly integrates in the main Casa flow:
The flow will be passed an Agama map containing information of the person attempting the authentication. This input parameter will contain at least three keys: uid
, inum
, and name
. uid
and inum
map directly to attributes stored in the user's profile and are never empty, name
is a displayable name which may come from attribute givenName
or displayName
. All values are strings.
The flow should terminate with a true
outcome if the user successfully passes the challenge, presents the expected credential, etc. In any other case, false
must be returned and an optional error message can be included for the caller flow (io.jans.casa.authn.main
) to show it in the screen. Any additional data attached in the Finish
instruction will not be processed.
If for some reason your flow crashes, the corresponding exception will be printed to the logs, the caller will continue running, and the browser taken to the selector page where an error message will be displayed.
@@ -8883,7 +8883,7 @@ Key questions
Depending on the answers, you may like to start instead with plugin development first. This is not always the case though, however, getting your hands on the plugin might help unclutter the path.
Enrollment plugin#
-Coding a Casa plugin is mainly a Java development task. You can use the "Sample credential" plugin as a template to start the work. Ensure you have:
+Coding a Casa plugin is mainly a Java development task. You can use the "Sample credential" plugin as a template to start the work. Ensure you have:
-
A Jans Server installation that includes Jans Casa - prefer a VM environment over the CN edition for development purposes. Also, you'll need a way to connect to your server via SSH
diff --git a/nightly/casa/developer/overview/index.html b/nightly/casa/developer/overview/index.html
index 3c220ce4e0e..2c5b7ea1ce5 100644
--- a/nightly/casa/developer/overview/index.html
+++ b/nightly/casa/developer/overview/index.html
@@ -8758,11 +8758,11 @@ Tools#
- The underlying database engine used by your Jans Server installation, e.g. PostgreSQL, MySQL, etc.
Sample plugins#
-The best way to start learning Casa plugin development is by playing with the sample plugins you can find here. Clone the repository (a shallow clone of main
branch is fine), cd
to one of the directories in the folder and run mvn package
, then upload the resulting jar-with-dependencies
through the administration console.
+The best way to start learning Casa plugin development is by playing with the sample plugins you can find here. Clone the repository (a shallow clone of main
branch is fine), cd
to one of the directories in the folder and run mvn package
, then upload the resulting jar-with-dependencies
through the administration console.
Configuration management#
-Most aspects of Casa that are configurable through the admin console UI can be programmatically operated using the configuration API. A formal description can be found here. Note all endpoints are protected by OAuth tokens which must have the https://jans.io/casa.config
scope.
+Most aspects of Casa that are configurable through the admin console UI can be programmatically operated using the configuration API. A formal description can be found here. Note all endpoints are protected by OAuth tokens which must have the https://jans.io/casa.config
scope.
Credentials enrollment#
-Casa has enrollment capabilities built-in but there are use cases where credential enrollment needs to happen elsewhere in your app ecosystem. A typical scenario is in a user registration application, where users are asked to enroll strong authentication credentials during account creation. To facilitate these tasks, Casa exposes APIs for enrolling the following types of authenticators:
+Casa has enrollment capabilities built-in but there are use cases where credential enrollment needs to happen elsewhere in your app ecosystem. A typical scenario is in a user registration application, where users are asked to enroll strong authentication credentials during account creation. To facilitate these tasks, Casa exposes APIs for enrolling the following types of authenticators:
- Phone numbers for SMS OTP
- OTP apps or tokens
@@ -8797,7 +8797,7 @@ Casa ACR updateRequisites#
Regardless of the customization required, it is desirable to get acquaintance with Agama framework. This is a good time to go through the Agama developer guide pages found in the Administration section of Jans Server docs. Specifically, several of the Agama advanced usages will help you materialize your requirements.
-Extract the Agama project to your development machine. It is useful to get an idea of how and what the out-of-the-box project does. Also, keep the Freemarker manual at hand.
+Extract the Agama project to your development machine. It is useful to get an idea of how and what the out-of-the-box project does. Also, keep the Freemarker manual at hand.
Page customizations#
The UI pages of the default Casa flow resemble the design of the Casa app itself. Also, modifications applied through the "custom branding" functionalities are automatically reflected in flow pages without any sort of intervention. This is neat, but if you need to go further, you will have to code the UI pages your own based on the existing ones.
For this purpose, create a new Agama project with one flow in it. Pick one of the pages you want to change from the original project and build your own - initially keep it really simple: a dummy page is OK. From your new flow, use the Trigger
directive to launch flow io.jans.casa.authn.main
. Add an Override templates
directive to your Trigger
so the page in Casa project is superseded by the page you are creating. This is explained here.
diff --git a/nightly/casa/index.html b/nightly/casa/index.html
index dac7d731ba6..fa86e9a7207 100644
--- a/nightly/casa/index.html
+++ b/nightly/casa/index.html
@@ -8612,14 +8612,14 @@ Two-factor authenticationcustom plugins.
2FA enrollment APIs#
-
To facilitate 2FA device enrollment during account registration, or elsewhere in an application ecosystem, Casa exposes APIs for enrolling the following types of authenticators:
+To facilitate 2FA device enrollment during account registration, or elsewhere in an application ecosystem, Casa exposes APIs for enrolling the following types of authenticators:
- Phone numbers for SMS OTP
- OTP apps, cards, or dongles
- FIDO security keys
Configuration via APIs#
-Besides a comprehensive graphical admin console, application settings can also be manipulated by means of a configuration API.
+Besides a comprehensive graphical admin console, application settings can also be manipulated by means of a configuration API.
Existing plugins#
Casa is a plugin-oriented, Java web application. Existing functionality can be extended and new functionality and APIs can be introduced through plugins. Currently, there are plugins available for the following:
diff --git a/nightly/casa/plugins/2fa-settings/index.html b/nightly/casa/plugins/2fa-settings/index.html
index 8756270d7f5..dec48c521b7 100644
--- a/nightly/casa/plugins/2fa-settings/index.html
+++ b/nightly/casa/plugins/2fa-settings/index.html
@@ -8667,7 +8667,7 @@ RequirementsInstallation#
-
-
+
-
Log in to Casa using an administrator account
@@ -8689,7 +8689,7 @@ How to use
API#
-
Configurations provided by this plugin can also be applied by means of the API exposed for this purpose. A formal description of the API can be found in this swagger file. Note all endpoints are protected by tokens which must have the https://jans.io/casa.config
OAuth scope.
+Configurations provided by this plugin can also be applied by means of the API exposed for this purpose. A formal description of the API can be found in this swagger file. Note all endpoints are protected by tokens which must have the https://jans.io/casa.config
OAuth scope.
diff --git a/nightly/casa/plugins/accts-linking/account-linking-index/index.html b/nightly/casa/plugins/accts-linking/account-linking-index/index.html
index fa9aaaf6a0d..f7a9d396f39 100644
--- a/nightly/casa/plugins/accts-linking/account-linking-index/index.html
+++ b/nightly/casa/plugins/accts-linking/account-linking-index/index.html
@@ -8623,10 +8623,10 @@ Components deploymenthttps://<your-jans-host>/jans-casa/pl/acct-linking/user/interlude.zul. Replace the name of your Jans server accordingly
@@ -8643,7 +8643,7 @@ Components deploymentOverview
-The tables shown in this page list all possible properties to configure a provider. Particularly, two properties deserve the most detail:
+The tables shown in this page list all possible properties to configure a provider. Particularly, two properties deserve the most detail:
-
flowQname
. Agama projects are made up of flows - think of small "web journeys". This property must contain the name of an existing flow capable of interfacing with the identity provider of interest. Often, there is no need to write such "interfacing" flow. The below are ready-to-use and cover most of real-world cases, specifically OpenId/OAuth providers that support the authorization code grant (see section 1.3 of rfc6749):
@@ -8649,7 +8649,7 @@ Overview
Configuring attribute mappings#
-An introduction to attribute mapping can be found here. Unless an elaborated processing of attributes is required, a basic knowledge of Java language suffices to write a useful mapping.
+An introduction to attribute mapping can be found here. Unless an elaborated processing of attributes is required, a basic knowledge of Java language suffices to write a useful mapping.
To write a mapping, you can use the samples provided as a guideline (see folder lib/io/jans/casa/acctlinking
in the Agama accounts linking project). You can add your mapping in the same file or create a new Java class for this purpose. Then save your changes, re-package (zip) the project, re-deploy, and update (re-import) the configuration if necessary.
Specifically, for Casa accounts linking, the mapping must include an attribute named ID
. While ID
is not part of the Jans database, here it is used to supply what could be understood as the identifier of the user at the external site. For instance, in a social site this may be the username or email. The example below shows how to set ID
assuming the username was returned by the external site in an attribute named userId
:
profile -> {
diff --git a/nightly/casa/plugins/bioid/index.html b/nightly/casa/plugins/bioid/index.html
index 34c3a904ea3..7fa954e0ae7 100644
--- a/nightly/casa/plugins/bioid/index.html
+++ b/nightly/casa/plugins/bioid/index.html
@@ -8631,7 +8631,7 @@ Requirements
Installation#
-- Download the plugin jar.
+- Download the plugin jar.
- Log into Casa as an administrator, navigate to
Administration Console > Casa plugins
and add the plugin jar
- Restart the casa service:
sudo systemctl restart jans-casa
- Using the TUI, navigate to
Auth Server
> Clients
, open the details for Client for Casa
, and add the following redirect URI: https://<hostname>/jans-casa/pl/bioid-plugin/user/interlude.zul
. Replace <hostname>
with the hostname of your server, and save the client.
diff --git a/nightly/casa/plugins/consent-management/index.html b/nightly/casa/plugins/consent-management/index.html
index 033e714fb24..189cdcf33ab 100644
--- a/nightly/casa/plugins/consent-management/index.html
+++ b/nightly/casa/plugins/consent-management/index.html
@@ -8616,7 +8616,7 @@ RequirementsInstallation#
-
-
+
-
Login to Casa using an administrator account
diff --git a/nightly/casa/plugins/custom-branding/index.html b/nightly/casa/plugins/custom-branding/index.html
index 3a27154c9a5..041a83f5c62 100644
--- a/nightly/casa/plugins/custom-branding/index.html
+++ b/nightly/casa/plugins/custom-branding/index.html
@@ -8616,7 +8616,7 @@ RequirementsInstallation#
-
-
+
-
Login to Casa using an administrator account
diff --git a/nightly/casa/plugins/email-otp/index.html b/nightly/casa/plugins/email-otp/index.html
index 5f44139ed69..ea0ce01a71e 100644
--- a/nightly/casa/plugins/email-otp/index.html
+++ b/nightly/casa/plugins/email-otp/index.html
@@ -8671,7 +8671,7 @@ InstallationPlugin#
-
-
Download the plugin jar file
+Download the plugin jar file
-
Login to Casa using an administrative account
@@ -8693,7 +8693,7 @@ PluginAgama project#
-
-
Download the project archive
+Download the project archive
-
Deploy the project onto the server - you can use TUI for this task
diff --git a/nightly/cedarling/cedarling-authz/index.html b/nightly/cedarling/cedarling-authz/index.html
index 176854848a7..bc191537a36 100644
--- a/nightly/cedarling/cedarling-authz/index.html
+++ b/nightly/cedarling/cedarling-authz/index.html
@@ -8665,14 +8665,14 @@ Authorization Using Cedarlingdecision_result = await cedarling(input)
Automatically Adding Entity References to the Context#
-Cedarling simplifies context creation by automatically including certain entities. This means you don't need to manually pass their references when using them in your policies. The following entities are automatically added to the context, along with their naming conventions in lower_snake_case
format:
+Cedarling simplifies context creation by automatically including certain entities. This means you don't need to manually pass their references when using them in your policies. The following entities are automatically added to the context.
-- Workload Entity:
workload
-- User Entity:
user
-- Resource Entity:
resource
-- Access Token Entity:
access_token
-- ID Token Entity:
id_token
-- Userinfo Token Entity:
userinfo_token
+- Workload Entity
+- User Entity
+- Resource Entity
+- Access Token Entity
+- ID Token Entity
+- Userinfo Token Entity
Example Policy#
Below is an example policy schema that illustrates how entities are used:
@@ -8747,7 +8747,7 @@ Example Policy2025-01-13
+ 2025-01-16
Created:
diff --git a/nightly/cedarling/cedarling-policy-store/index.html b/nightly/cedarling/cedarling-policy-store/index.html
index ce0795bcb67..c2d39099591 100644
--- a/nightly/cedarling/cedarling-policy-store/index.html
+++ b/nightly/cedarling/cedarling-policy-store/index.html
@@ -8947,13 +8947,15 @@ Trusted Issuers Schemadescription : (String) A brief description of the trusted issuer, providing context for administrators.
- openid_configuration_endpoint : (String) The HTTPS URL for the OpenID Connect configuration endpoint (usually found at
/.well-known/openid-configuration
).
- identity_source : (Object, optional) Metadata related to the tokens issued by this issuer.
-access_tokens
, id_tokens
, userinfo_tokens
, and tx_tokens
: See: Token Metadata Schema.
+
+Notes:
+
+- The
access_tokens
, id_tokens
, userinfo_tokens
, and tx_tokens
fields will follow the Token Metadata Schema.
+- The
access_tokens
will contain a trusted
and principal_identifier
field in addition to the fields from the Token Metadata Schema
.
Token Metadata Schema#
The Token Entity Metadata Schema defines how tokens are mapped, parsed, and transformed within Cedarling. It allows you to specify how to extract user IDs, roles, and other claims from a token using customizable parsers.
{
- "trusted": bool,
- "principal_identifier": "str",
"user_id": "<field name in token (e.g., 'email', 'sub', 'uid', etc.) or '' if not used>",
"role_mapping": "<field for role assignment (e.g., 'role', 'memberOf', etc.) or '' if not used>",
"claim_mapping": {
@@ -9141,7 +9143,7 @@ Note on test fixtures2024-12-24
+ 2025-01-16
Created:
diff --git a/nightly/cedarling/python/sidecar/index.html b/nightly/cedarling/python/sidecar/index.html
index ff915973999..f37d3737e7b 100644
--- a/nightly/cedarling/python/sidecar/index.html
+++ b/nightly/cedarling/python/sidecar/index.html
@@ -8588,7 +8588,7 @@ Docker setupEnsure that you have installed docker and docker compose.
- Clone the Janssen repository
- Navigate to
jans/jans-cedarling/flask-sidecar
-- Edit the provided
secrets/bootstrap.json
file to your specifications. The configuration keys are described here.
+- Edit the provided
secrets/bootstrap.json
file to your specifications. The configuration keys are described here.
- Run
docker compose up
- For cloud deployments, please use the provided Dockerfile and pass your bootstrap configuration via the environment variable
CEDARLING_BOOTSTRAP_CONFIG_FILE
.
- The sidecar runs on port 5000. OpenAPI documentation is available at
http://0.0.0.0:5000/swagger-ui
@@ -8598,8 +8598,13 @@ Usage#
Example request to the evaluation endpoint:
{
"subject": {
- "type": "string",
- "id": "string"
+ "type": "JWT",
+ "id": "cedarling",
+ "properties": {
+ "access_token": "",
+ "id_token": "",
+ "userinfo_token": ""
+ }
},
"resource": {
"type": "Jans::Application",
@@ -8618,9 +8623,6 @@ Usage#
"name": "Jans::Action::\"Read\""
},
"context": {
- "access_token": "...",
- "id_token": "...",
- "userinfo_token": "...",
"device_health": [
"Healthy"
],
@@ -8667,7 +8669,7 @@ Usage#
Last update:
- 2024-12-06
+ 2025-01-16
Created:
diff --git a/nightly/contribute/developer-faq/index.html b/nightly/contribute/developer-faq/index.html
index bc80554f6ac..d9c5a3dda24 100644
--- a/nightly/contribute/developer-faq/index.html
+++ b/nightly/contribute/developer-faq/index.html
@@ -8816,7 +8816,7 @@ How to install Ja
This installation uses Gluu Testing certificate.
Download Installer#
-wget https://raw.githubusercontent.com/JanssenProject/jans/nightly/jans-linux-setup/jans_setup/install.py -O install.py
+wget https://raw.githubusercontent.com/JanssenProject/jans/vreplace-janssen-version/jans-linux-setup/jans_setup/install.py -O install.py
Execute Installer#
python3 install.py --profile=openbanking --args="-ob-key-fn=/opt/jans/jans-setup/openbanking/static/ob-gluu-test.key -static-kid=ob-gluu-test -jwks-uri=https://ox.gluu.org/icrby8xcvbcv/ob/ob-gluu-test.jwks --disable-ob-auth-script -ob-alias=ob-gluu-test"
diff --git a/nightly/janssen-server/auth-server/client-management/index.html b/nightly/janssen-server/auth-server/client-management/index.html
index 1ef07e0d89b..dd0f8f74673 100644
--- a/nightly/janssen-server/auth-server/client-management/index.html
+++ b/nightly/janssen-server/auth-server/client-management/index.html
@@ -8617,7 +8617,7 @@ A. OpenID Dynamic Client Registrat
configuration JSON response, which you can find at .well-known/openid-configuration
in your specific deployment. Typically, it is
https://{hostname}/jans-auth/restv1/register
-
The OpenApi specification for /registration documents Jans Auth Server's specific implementation,
+
The OpenApi specification for /registration documents Jans Auth Server's specific implementation,
which aligns with the requirements of OpenID Connect dynamic client
registration. Also, check the
Registration Endpoint documentation for
diff --git a/nightly/janssen-server/auth-server/endpoints/access-evaluation/index.html b/nightly/janssen-server/auth-server/endpoints/access-evaluation/index.html
index f215aafd8ef..eea555db134 100644
--- a/nightly/janssen-server/auth-server/endpoints/access-evaluation/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/access-evaluation/index.html
@@ -8650,7 +8650,7 @@
Overviewjans-auth-server module.
+of jans-auth-server module.
Sample request
POST /jans-auth/restv1/access/v1/evaluation HTTP/1.1
Host: happy-example.gluu.info
diff --git a/nightly/janssen-server/auth-server/endpoints/authorization-challenge/index.html b/nightly/janssen-server/auth-server/endpoints/authorization-challenge/index.html
index 8ed520c2081..9fa4d534453 100644
--- a/nightly/janssen-server/auth-server/endpoints/authorization-challenge/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/authorization-challenge/index.html
@@ -8674,7 +8674,7 @@ Overviewjans-auth-server module.
+of jans-auth-server module.
Sample request
POST /authorize HTTP/1.1
Host: server.example.com
diff --git a/nightly/janssen-server/auth-server/endpoints/authorization/index.html b/nightly/janssen-server/auth-server/endpoints/authorization/index.html
index 1e1694e966a..b707e50f5c4 100644
--- a/nightly/janssen-server/auth-server/endpoints/authorization/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/authorization/index.html
@@ -8768,7 +8768,7 @@ Overviewhttps://janssen.server.host/jans-auth/restv1/authorize
More information about request and response of the authorization endpoint can be found in the OpenAPI specification
-of jans-auth-server module.
+of jans-auth-server module.
Configuration Properties#
Authorization endpoint can be further configured using Janssen Server configuration properties listed below. When using
Janssen Text-based UI(TUI) to configure the properties,
diff --git a/nightly/janssen-server/auth-server/endpoints/clientinfo/index.html b/nightly/janssen-server/auth-server/endpoints/clientinfo/index.html
index 610760a4b7b..d01653059d6 100644
--- a/nightly/janssen-server/auth-server/endpoints/clientinfo/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/clientinfo/index.html
@@ -8614,7 +8614,7 @@
Overviewjans-auth-server module.
+the OpenAPI specification of jans-auth-server module.
Disabling The Endpoint Using Feature Flag#
/clientinfo
endpoint can be enabled or disable using clientinfo feature flag.
Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task.
diff --git a/nightly/janssen-server/auth-server/endpoints/end-session/index.html b/nightly/janssen-server/auth-server/endpoints/end-session/index.html
index 632f7d9b49c..671fe7ced8f 100644
--- a/nightly/janssen-server/auth-server/endpoints/end-session/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/end-session/index.html
@@ -8645,7 +8645,7 @@ Overviewthis article from
Gluu Server documentation to understand how end session endpoint works in Janssen Server.
More information about request and response of the end session endpoint can be found in the OpenAPI specification
-of jans-auth-server module.
+of jans-auth-server module.
Disabling The Endpoint Using Feature Flag#
/end_session
endpoint can be enabled or disable using END_SESSION feature flag.
Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task.
diff --git a/nightly/janssen-server/auth-server/endpoints/global-token-revocation/index.html b/nightly/janssen-server/auth-server/endpoints/global-token-revocation/index.html
index 73294eb78f4..ced64bf1e11 100644
--- a/nightly/janssen-server/auth-server/endpoints/global-token-revocation/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/global-token-revocation/index.html
@@ -8615,7 +8615,7 @@ Overviewhttps://janssen.server.host/jans-auth/restv1/global-token-revocation
More information about request and response of the global token revocation endpoint can be found in
-the OpenAPI specification of jans-auth-server module.
+the OpenAPI specification of jans-auth-server module.
Usage#
A request to this endpoint can revoke all tokens and sessions of one particular user. Use the request parameters to specify
criteria to select the user. If there are multiple users matching the given criteria, the first found user will be affected.
diff --git a/nightly/janssen-server/auth-server/endpoints/introspection/index.html b/nightly/janssen-server/auth-server/endpoints/introspection/index.html
index c43894877c1..f90797e368f 100644
--- a/nightly/janssen-server/auth-server/endpoints/introspection/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/introspection/index.html
@@ -8769,7 +8769,7 @@ Introspection Endpointintrospection_endpoint
claim of the OpenID Connect configuration response, typically deployed at https://janssen.server.host/.well-known/openid-configuration
"introspection_endpoint" : "https://janssen.server.host/jans-auth/restv1/introspection" `
More information about request and response of the Introspection endpoint can be found in
-the OpenAPI specification of jans-auth-server module.
+the OpenAPI specification of jans-auth-server module.
Request parameters
token
- REQUIRED. The string value of the token. For access tokens, this is the "access_token" value returned from the token endpoint
diff --git a/nightly/janssen-server/auth-server/endpoints/par/index.html b/nightly/janssen-server/auth-server/endpoints/par/index.html
index 01c2364ac0a..9be634aef49 100644
--- a/nightly/janssen-server/auth-server/endpoints/par/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/par/index.html
@@ -8692,7 +8692,7 @@ Pushed Authorization Request
methods used are same as the once used for client authentication at token endpoint.
More information about request and response of the PAR endpoint can be found in
the OpenAPI specification of
-jans-auth-server module.
+jans-auth-server module.
Disabling The Endpoint Using Feature Flag#
PAR
endpoint can be enabled or disabled using PAR feature flag.
Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task.
diff --git a/nightly/janssen-server/auth-server/endpoints/session-revocation/index.html b/nightly/janssen-server/auth-server/endpoints/session-revocation/index.html
index ece9e7f2bc1..457c86197f8 100644
--- a/nightly/janssen-server/auth-server/endpoints/session-revocation/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/session-revocation/index.html
@@ -8615,7 +8615,7 @@ Overviewhttps://janssen.server.host/jans-auth/restv1/revoke_session
More information about request and response of the revocation endpoint can be found in
-the OpenAPI specification of jans-auth-server module.
+the OpenAPI specification of jans-auth-server module.
Usage#
A request to this endpoint can revoke all sessions of one particular user. Use the request parameters to specify
criteria to select the user. If there are multiple users matching the given criteria, the first found user will be affected.
diff --git a/nightly/janssen-server/auth-server/endpoints/ssa/index.html b/nightly/janssen-server/auth-server/endpoints/ssa/index.html
index d7c5cdabba6..4a34972bac5 100644
--- a/nightly/janssen-server/auth-server/endpoints/ssa/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/ssa/index.html
@@ -9116,7 +9116,7 @@ Software Statement Assertion (SSA)
More information about request and response of the revocation endpoint can be found in
the OpenAPI specification
-of jans-auth-server module.
+of jans-auth-server module.
Disabling The Endpoint Using Feature Flag#
/ssa
endpoint can be enabled or disable
using SSA feature flag.
diff --git a/nightly/janssen-server/auth-server/endpoints/token-revocation/index.html b/nightly/janssen-server/auth-server/endpoints/token-revocation/index.html
index ebbce08f6ee..7866f95aede 100644
--- a/nightly/janssen-server/auth-server/endpoints/token-revocation/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/token-revocation/index.html
@@ -8646,7 +8646,7 @@
Overviewhttps://jans-dynamic-mysql/jans-auth/restv1/revoke
More information about request and response of the revocation endpoint can be found in
-the OpenAPI specification of jans-auth-server module.
+the OpenAPI specification of jans-auth-server module.
Disabling The Endpoint Using Feature Flag#
Token revocation
endpoint can be enabled or disable using REVOKE_TOKEN feature flag.
Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task.
diff --git a/nightly/janssen-server/auth-server/endpoints/token/index.html b/nightly/janssen-server/auth-server/endpoints/token/index.html
index 03e22b0074a..a1ea4b6bf29 100644
--- a/nightly/janssen-server/auth-server/endpoints/token/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/token/index.html
@@ -8663,7 +8663,7 @@ Overviewjans-auth-server module.
+the OpenAPI specification of jans-auth-server module.
Configuration Properties#
Token endpoint and tokens issued by token endpoint can be further configured using Janssen Server configuration properties listed below. When using
Janssen Text-based UI(TUI) to configure the properties,
diff --git a/nightly/janssen-server/auth-server/endpoints/userinfo/index.html b/nightly/janssen-server/auth-server/endpoints/userinfo/index.html
index 42c1308ae47..458f431c105 100644
--- a/nightly/janssen-server/auth-server/endpoints/userinfo/index.html
+++ b/nightly/janssen-server/auth-server/endpoints/userinfo/index.html
@@ -8700,7 +8700,7 @@
Overviewjans-auth-server module.
+the OpenAPI specification of jans-auth-server module.
Disabling The Endpoint Using Feature Flag#
userinfo
endpoint can be enabled or disable using USERINFO feature flag.
Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task.
diff --git a/nightly/janssen-server/config-guide/auth-server-config/json-web-key-config/index.html b/nightly/janssen-server/config-guide/auth-server-config/json-web-key-config/index.html
index df86a77c4fa..5cfc5b765e3 100644
--- a/nightly/janssen-server/config-guide/auth-server-config/json-web-key-config/index.html
+++ b/nightly/janssen-server/config-guide/auth-server-config/json-web-key-config/index.html
@@ -9067,7 +9067,7 @@ Patch JSON Web Key (JWK) by kidJSON Patch .
-Refer here to know more about schema.
+Refer here to know more about schema.
In this example; We will change the value of the property use
from enc
to sig
.
Input[
{
diff --git a/nightly/janssen-server/config-guide/auth-server-config/oauth-umaresources-config/index.html b/nightly/janssen-server/config-guide/auth-server-config/oauth-umaresources-config/index.html
index 54bd287b13f..2fb38385aed 100644
--- a/nightly/janssen-server/config-guide/auth-server-config/oauth-umaresources-config/index.html
+++ b/nightly/janssen-server/config-guide/auth-server-config/oauth-umaresources-config/index.html
@@ -8864,7 +8864,7 @@ Patch OAuth UMA Resource by IDJSON Patch .
-Refer here to know more about schema.
+Refer here to know more about schema.
In this example; We will change the value of the property name
from uma resource
to UMA
.
Input[
{
diff --git a/nightly/janssen-server/config-guide/config-tools/config-api/index.html b/nightly/janssen-server/config-guide/config-tools/config-api/index.html
index 4d335d0c215..c66fc466cbb 100644
--- a/nightly/janssen-server/config-guide/config-tools/config-api/index.html
+++ b/nightly/janssen-server/config-guide/config-tools/config-api/index.html
@@ -8562,7 +8562,7 @@ config-apiOverview#
Jans Config Api provides a central place to manage and configure jans modules.
It helps in configuring auth-server, users, fido2 and scim modules.
-Config API is a REST application that is developed using Weld 4.x (JSR-365) and JAX-RS. Its endpoints can be used to manage configuration and other properties of Jans Auth Server, which is an open-source OpenID Connect Provider (OP) and UMA Authorization Server (AS)
+Config API is a REST application that is developed using Weld 4.x (JSR-365) and JAX-RS. Its endpoints can be used to manage configuration and other properties of Jans Auth Server, which is an open-source OpenID Connect Provider (OP) and UMA Authorization Server (AS)
If you want to learn more about Weld, please visit its website: https://weld.cdi-spec.org/
Packaging and running the application#
diff --git a/nightly/janssen-server/config-guide/config-tools/config-api/plugins/index.html b/nightly/janssen-server/config-guide/config-tools/config-api/plugins/index.html
index 71a03433902..94deffe783d 100644
--- a/nightly/janssen-server/config-guide/config-tools/config-api/plugins/index.html
+++ b/nightly/janssen-server/config-guide/config-tools/config-api/plugins/index.html
@@ -8723,7 +8723,7 @@
Plugins
Overview#
-Jans Config Api is a REST application that is developed using Weld 4.x (JSR-365) and JAX-RS. Its endpoint can be used to manage configuration and other properties of Jans Auth Server.
+Jans Config Api is a REST application that is developed using Weld 4.x (JSR-365) and JAX-RS. Its endpoint can be used to manage configuration and other properties of Jans Auth Server.
Jans Config API Plugins#
Jans Config API follow a flexible plugin architecture in which the new features can be added using extensions called plugins without altering the application itself. In this section, we will discuss the steps to develop and add plugins in Jans Config API.
The plugin architecture implemented in Jans Config API allows the deployer to add/remove new rest APIs (plugin) without changing the core application.
diff --git a/nightly/janssen-server/install/docker-install/quick-start/index.html b/nightly/janssen-server/install/docker-install/quick-start/index.html
index 3f61f38be70..c4ab74aefb1 100644
--- a/nightly/janssen-server/install/docker-install/quick-start/index.html
+++ b/nightly/janssen-server/install/docker-install/quick-start/index.html
@@ -8652,7 +8652,7 @@
Installset of environment variables.
These environment variables can be set to customize installation as per the need. If not set, the installer uses default values.
Run this command to start the installation:
-wget https://raw.githubusercontent.com/JanssenProject/jans/nightly/automation/startjanssenmonolithdemo.sh && chmod u+x startjanssenmonolithdemo.sh && sudo bash startjanssenmonolithdemo.sh demoexample.jans.io MYSQL "" main
+wget https://raw.githubusercontent.com/JanssenProject/jans/vreplace-janssen-version/automation/startjanssenmonolithdemo.sh && chmod u+x startjanssenmonolithdemo.sh && sudo bash startjanssenmonolithdemo.sh demoexample.jans.io MYSQL "" main
Console messages like below confirms the successful installation:
[+] Running 3/3
diff --git a/nightly/janssen-server/install/helm-install/local/index.html b/nightly/janssen-server/install/helm-install/local/index.html
index acf4b9f7199..da90c8c537b 100644
--- a/nightly/janssen-server/install/helm-install/local/index.html
+++ b/nightly/janssen-server/install/helm-install/local/index.html
@@ -8713,7 +8713,7 @@ Installation Stepssudo su -
-wget https://raw.githubusercontent.com/JanssenProject/jans/nightly/automation/startjanssendemo.sh && chmod u+x startjanssendemo.sh && ./startjanssendemo.sh
+wget https://raw.githubusercontent.com/JanssenProject/jans/vreplace-janssen-version/automation/startjanssendemo.sh && chmod u+x startjanssendemo.sh && ./startjanssendemo.sh
This will install Docker, Microk8s, Helm and Janssen with the default settings that can be found inside values.yaml.
The installer will automatically add a record to your hosts record in the VM but if you want to access the endpoints outside the VM you must map the ip
of the instance running Ubuntu to the FQDN you provided and then access the endpoints at your browser such in the example in the table below.
diff --git a/nightly/janssen-server/install/vm-install/dynamic-download/index.html b/nightly/janssen-server/install/vm-install/dynamic-download/index.html
index e75ecab8f4f..2832cdb6375 100644
--- a/nightly/janssen-server/install/vm-install/dynamic-download/index.html
+++ b/nightly/janssen-server/install/vm-install/dynamic-download/index.html
@@ -8632,7 +8632,7 @@ Installcurl https://raw.githubusercontent.com/JanssenProject/jans/nightly/jans-linux-setup/jans_setup/install.py > install.py
+curl https://raw.githubusercontent.com/JanssenProject/jans/vreplace-janssen-version/jans-linux-setup/jans_setup/install.py > install.py
-
diff --git a/nightly/janssen-server/install/vm-install/rhel/index.html b/nightly/janssen-server/install/vm-install/rhel/index.html
index 3a1e67f4e33..e5252953956 100644
--- a/nightly/janssen-server/install/vm-install/rhel/index.html
+++ b/nightly/janssen-server/install/vm-install/rhel/index.html
@@ -8684,26 +8684,26 @@
Install the PackageReleases
-wget https://github.com/JanssenProject/jans/releases/download/nightly/jans-0.0.0-nightly-stable.el8.x86_64.rpm -P ~/
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans-replace-janssen-version-stable.el8.x86_64.rpm -P ~/
-
Verify integrity of the downloaded package using published sha256sum
.
Download sha256sum
file for the package
-wget https://github.com/JanssenProject/jans/releases/download/nightly/jans-0.0.0-nightly-stable.el8.x86_64.rpm.sha256sum -P ~/
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans-replace-janssen-version-stable.el8.x86_64.rpm.sha256sum -P ~/
Check the hash if it is matching.
-sha256sum -c jans-0.0.0-nightly-el8.x86_64.rpm.sha256sum
+sha256sum -c jans-replace-janssen-version-el8.x86_64.rpm.sha256sum
Output similar to below should confirm the integrity of the downloaded package.
-jans-0.0.0-nightly-el8.x86_64.rpm: OK
+jans-replace-janssen-version-el8.x86_64.rpm: OK
-
Install the package
-sudo yum install ~/jans-0.0.0-nightly-el8.x86_64.rpm
+sudo yum install ~/jans-replace-janssen-version-el8.x86_64.rpm
Run the setup script#
diff --git a/nightly/janssen-server/install/vm-install/suse/index.html b/nightly/janssen-server/install/vm-install/suse/index.html
index a1a3a0617ef..9aaeb86b1bd 100644
--- a/nightly/janssen-server/install/vm-install/suse/index.html
+++ b/nightly/janssen-server/install/vm-install/suse/index.html
@@ -8700,17 +8700,17 @@ Install the PackageReleases
-wget https://github.com/JanssenProject/jans/releases/download/nightly/jans-0.0.0-nightly-stable.suse15.x86_64.rpm
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans-replace-janssen-version-stable.suse15.x86_64.rpm
- Verify integrity of the downloaded package using published
sha256sum
.
Download sha256sum
file for the package
-wget https://github.com/JanssenProject/jans/releases/download/nightly/jans-0.0.0-nightly-stable.suse15.x86_64.rpm.sha256sum
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans-replace-janssen-version-stable.suse15.x86_64.rpm.sha256sum
Check the hash if it is matching. You may need to change your working directory
to where both the rpm and sha256sum file are located.
-sha256sum -c jans-0.0.0-nightly.suse15.x86_64.rpm.sha256sum
+sha256sum -c jans-replace-janssen-version.suse15.x86_64.rpm.sha256sum
Output similar to below should confirm the integrity of the downloaded package.
<package-name>: OK
@@ -8718,7 +8718,7 @@ Install the Packagesudo zypper install ~/jans-0.0.0-nightly.suse15.x86_64.rpm
+sudo zypper install ~/jans-replace-janssen-version.suse15.x86_64.rpm
Run the setup script#
diff --git a/nightly/janssen-server/install/vm-install/ubuntu/index.html b/nightly/janssen-server/install/vm-install/ubuntu/index.html
index 32800c573dd..6f378c8f3fe 100644
--- a/nightly/janssen-server/install/vm-install/ubuntu/index.html
+++ b/nightly/janssen-server/install/vm-install/ubuntu/index.html
@@ -8720,54 +8720,54 @@ Ubuntu 22.04Download the release package from the Github Janssen Project
Releases
-wget https://github.com/JanssenProject/jans/releases/download/nightly/jans_0.0.0-nightly-stable.ubuntu22.04_amd64.deb -P /tmp
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans_replace-janssen-version-stable.ubuntu22.04_amd64.deb -P /tmp
-
Verify integrity of the downloaded package by verifying published sha256sum
.
Download sha256sum
file for the package
-wget https://github.com/JanssenProject/jans/releases/download/nightly/jans_0.0.0-nightly-stable.ubuntu22.04_amd64.deb.sha256sum -P /tmp
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans_replace-janssen-version-stable.ubuntu22.04_amd64.deb.sha256sum -P /tmp
Check the hash if it is matching.
cd /tmp
-sha256sum -c jans_0.0.0-nightly.ubuntu22.04_amd64.deb.sha256sum
+sha256sum -c jans_replace-janssen-version.ubuntu22.04_amd64.deb.sha256sum
Output similar to below should confirm the integrity of the downloaded package.
-jans_0.0.0-nightly.ubuntu22.04_amd64.deb.sha256sum: OK
+jans_replace-janssen-version.ubuntu22.04_amd64.deb.sha256sum: OK
-
Install the package
-sudo apt install ./jans_0.0.0-nightly.ubuntu22.04_amd64.deb
+sudo apt install ./jans_replace-janssen-version.ubuntu22.04_amd64.deb
Ubuntu 20.04#
- Download the release package from the Github Janssen Project
Releases
-wget https://github.com/JanssenProject/jans/releases/download/nightly/jans_0.0.0-nightly-stable.ubuntu20.04_amd64.deb -P /tmp
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans_replace-janssen-version-stable.ubuntu20.04_amd64.deb -P /tmp
-
Verify integrity of the downloaded package by verifying published sha256sum
.
Download sha256sum
file for the package
-wget https://github.com/JanssenProject/jans/releases/download/nightly/jans_0.0.0-nightly-stable.ubuntu20.04_amd64.deb.sha256sum -P /tmp
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans_replace-janssen-version-stable.ubuntu20.04_amd64.deb.sha256sum -P /tmp
Check the hash if it is matching.
cd /tmp
-sha256sum -c jans_0.0.0-nightly.ubuntu20.04_amd64.deb.sha256sum
+sha256sum -c jans_replace-janssen-version.ubuntu20.04_amd64.deb.sha256sum
Output similar to below should confirm the integrity of the downloaded package.
-jans_0.0.0-nightly.ubuntu20.04_amd64.deb.sha256sum: OK
+jans_replace-janssen-version.ubuntu20.04_amd64.deb.sha256sum: OK
-
Install the package
-sudo apt install ./jans_0.0.0-nightly.ubuntu20.04_amd64.deb
+sudo apt install ./jans_replace-janssen-version.ubuntu20.04_amd64.deb
Run the setup script#
@@ -8851,7 +8851,7 @@ UninstallManual Backup
-Keep note of the chart version. For example: 0.0.0-nightly
+Keep note of the chart version. For example: replace-janssen-version
Manual Restore#
-
@@ -8677,7 +8677,7 @@
Manual Restorehelm install <release-name> janssen/janssen -f values.yaml --version=<0.0.0-nightly> -n <namespace>
+helm install <release-name> janssen/janssen -f values.yaml --version=<replace-janssen-version> -n <namespace>
Automatic Backup and Restore#
There are several tools that helps in automatic backups and restore, like Kasten K10.
diff --git a/nightly/janssen-server/kubernetes-ops/cert-management/index.html b/nightly/janssen-server/kubernetes-ops/cert-management/index.html
index c955dddb353..04267c4b145 100644
--- a/nightly/janssen-server/kubernetes-ops/cert-management/index.html
+++ b/nightly/janssen-server/kubernetes-ops/cert-management/index.html
@@ -8686,7 +8686,7 @@ Rotate restartPolicy: Never
containers:
- name: web-key-rotation
- image: ghcr.io/janssenproject/jans/certmanager:0.0.0-nightly-1
+ image: ghcr.io/janssenproject/jans/certmanager:replace-janssen-version-1
envFrom:
- configMapRef:
name: janssen-config-cm # This may be differnet in Helm
@@ -8738,7 +8738,7 @@ Load from existing source path: web_https.key
containers:
- name: load-web-key-rotation
- image: ghcr.io/janssenproject/jans/certmanager:0.0.0-nightly-1
+ image: ghcr.io/janssenproject/jans/certmanager:replace-janssen-version-1
envFrom:
- configMapRef:
name: janssen-config-cm #This may be differnet in Helm
@@ -8798,7 +8798,7 @@ Auth-server spec:
containers:
- name: auth-key-rotation
- image: ghcr.io/janssenproject/jans/certmanager:0.0.0-nightly-1
+ image: ghcr.io/janssenproject/jans/certmanager:replace-janssen-version-1
resources:
requests:
memory: "300Mi"
diff --git a/nightly/janssen-server/kubernetes-ops/tui-k8s/index.html b/nightly/janssen-server/kubernetes-ops/tui-k8s/index.html
index 8e090a5075c..5d52aed843b 100644
--- a/nightly/janssen-server/kubernetes-ops/tui-k8s/index.html
+++ b/nightly/janssen-server/kubernetes-ops/tui-k8s/index.html
@@ -8582,7 +8582,7 @@ Overviewrelease assets depending on your OS. For example:
-
wget https://github.com/JanssenProject/jans/releases/download/nightly/jans-cli-tui-linux-ubuntu-X86-64.pyz
+wget https://github.com/JanssenProject/jans/releases/download/vreplace-janssen-version/jans-cli-tui-linux-ubuntu-X86-64.pyz
Now we have jans-cli-tui-linux-ubuntu-X86-64.pyz
downloaded.
-
diff --git a/nightly/janssen-server/kubernetes-ops/upgrade/index.html b/nightly/janssen-server/kubernetes-ops/upgrade/index.html
index 2b2850fe267..71fe16edfab 100644
--- a/nightly/janssen-server/kubernetes-ops/upgrade/index.html
+++ b/nightly/janssen-server/kubernetes-ops/upgrade/index.html
@@ -8537,7 +8537,7 @@
Upgrade
-
Apply your upgrade:
-helm upgrade <janssen-release-name> janssen/janssen -n <namespace> -f override.yaml --version=0.0.0-nightly
+helm upgrade <janssen-release-name> janssen/janssen -n <namespace> -f override.yaml --version=replace-janssen-version
diff --git a/nightly/janssen-server/planning/benchmarking/index.html b/nightly/janssen-server/planning/benchmarking/index.html
index ce45685628a..5993d65f15e 100644
--- a/nightly/janssen-server/planning/benchmarking/index.html
+++ b/nightly/janssen-server/planning/benchmarking/index.html
@@ -8646,10 +8646,10 @@ Benchmarking
Load test#
In cloud-native architecture, the load testing is executed via k8s pods.
Authorization Code Flow jmeter load test#
-For load testing with Authorization Code Flow jmeter test, the following script is used.
+For load testing with Authorization Code Flow jmeter test, the following script is used.
See Authorization code flow recipe for details.
Resource Owner Password Grant (ROPC) Flow jmeter load test#
-For load testing with Resource Owner Password Grant (ROPC) Flow jmeter test, the following script is used.
+For load testing with Resource Owner Password Grant (ROPC) Flow jmeter test, the following script is used.
See ROPC flow recipe for details.
diff --git a/nightly/janssen-server/planning/self-service-password-2fa/index.html b/nightly/janssen-server/planning/self-service-password-2fa/index.html
index 8ecbd347ef3..014875b9f98 100644
--- a/nightly/janssen-server/planning/self-service-password-2fa/index.html
+++ b/nightly/janssen-server/planning/self-service-password-2fa/index.html
@@ -8536,7 +8536,7 @@ Self-Service Password/2FA Portal
credentials on one page.
You can build a page like Google on your own website. You need to be able to
list, add, and remove 2FA credentials for a given user's account. But another
-good option is the Jans Casa web application.
+good option is the Jans Casa web application.
diff --git a/nightly/janssen-server/recipes/benchmark/index.html b/nightly/janssen-server/recipes/benchmark/index.html
index b068b0346dd..20bde514e15 100644
--- a/nightly/janssen-server/recipes/benchmark/index.html
+++ b/nightly/janssen-server/recipes/benchmark/index.html
@@ -9012,13 +9012,13 @@ Kubernetes Cluster Load Test Res
Make sure helm is installed.
-
-
Prepare your override.yaml. Copy the below into a file named override.yaml. At the time of writing this we are using image tags 0.0.0-nightly_dev
which are the bleeding edge images for release 0.0.0-nightly
. Stable images such as 0.0.0-nightly-1
should be used.
+Prepare your override.yaml. Copy the below into a file named override.yaml. At the time of writing this we are using image tags replace-janssen-version_dev
which are the bleeding edge images for release replace-janssen-version
. Stable images such as replace-janssen-version-1
should be used.
config:
image:
repository: ghcr.io/janssenproject/jans/configurator
- tag: 0.0.0-nightly_dev
+ tag: replace-janssen-version_dev
countryCode: US
email: support@gluu.org
orgName: Gluu
@@ -9062,17 +9062,17 @@ Kubernetes Cluster Load Test Res
image:
pullPolicy: IfNotPresent
repository: ghcr.io/janssenproject/jans/auth-server
- tag: 0.0.0-nightly_dev
+ tag: replace-janssen-version_dev
config-api:
image:
pullPolicy: IfNotPresent
repository: ghcr.io/janssenproject/jans/config-api
- tag: 0.0.0-nightly_dev
+ tag: replace-janssen-version_dev
persistence:
image:
pullPolicy: IfNotPresent
repository: ghcr.io/janssenproject/jans/persistence-loader
- tag: 0.0.0-nightly_dev
+ tag: replace-janssen-version_dev
nginx-ingress:
ingress:
path: /
@@ -9102,7 +9102,7 @@ Loading users
-
-
Copy the following yaml into the folder under the name load_users.yaml
.
+Copy the following yaml into the folder under the name load_users.yaml
.
-
Open the file and modify the required parameters. Note that the following environments can be used as configmaps data to configure the pod.
@@ -9260,7 +9260,7 @@ Setup Client}
EOF
-3. Copy the following yaml into the folder.
+3. Copy the following yaml into the folder.
-
Download or build config-cli-tui and run:
@@ -9367,7 +9367,7 @@ Setup Client
-
-
Copy the following yaml into the folder.
+Copy the following yaml into the folder.
-
Download or build config-cli-tui and run:
@@ -9474,7 +9474,7 @@ Setup Client
-
-
Copy the following yaml into the folder.
+Copy the following yaml into the folder.
-
Download or build config-cli-tui and run:
diff --git a/nightly/janssen-server/reference/openapi/index.html b/nightly/janssen-server/reference/openapi/index.html
index bac0e7436c9..fdc11993b02 100644
--- a/nightly/janssen-server/reference/openapi/index.html
+++ b/nightly/janssen-server/reference/openapi/index.html
@@ -8602,11 +8602,11 @@ REST APISwagger
+Swagger
Jans Config API
-Swagger
+Swagger
Jans Core
@@ -8614,11 +8614,11 @@ REST APISwagger
+Swagger
Jans SCIM API
-Swagger
+Swagger
Jans KC SAML API
diff --git a/nightly/janssen-server/vm-ops/upgrade/index.html b/nightly/janssen-server/vm-ops/upgrade/index.html
index 46c43fa982a..008503d780b 100644
--- a/nightly/janssen-server/vm-ops/upgrade/index.html
+++ b/nightly/janssen-server/vm-ops/upgrade/index.html
@@ -8527,26 +8527,26 @@ Upgrade
Though this is made easy using Terraform.
We recommend using Kubernetes installations over VM, to avail smooth upgrades and better HA support.
-Let's assume we are upgrading Jans VM installation from current version
to nightly
+Let's assume we are upgrading Jans VM installation from current version
to vreplace-janssen-version
-
Keep the old VM installation running.
-
-
Install on a separate VM the target new Jans installation, i.e. nightly
.
+Install on a separate VM the target new Jans installation, i.e. vreplace-janssen-version
.
You can install with a test client. For example:
sudo python3 /opt/jans/jans-setup/setup.py -test-client-id 6382c9da-f25d-435f-ac63-6acde36f4859 -test-client-pw secret1172023
This client-id
and client-pw
will then be used to import Terraform configurations
-
-
Use our Terraform docs on the new installation, i.e. nightly
to:
+Use our Terraform docs on the new installation, i.e. vreplace-janssen-version
to:
- import all the global configurations from the new installation using
terraform import
- define all the custom IDP configurations and apply them using
terraform apply
-
-
At this point there should be two versions up, old version
and nightly
.
+At this point there should be two versions up, old version
and vreplace-janssen-version
.
-
Traffic should be switched gradually from the old setup to the new setup.
diff --git a/nightly/script-catalog/client_registration/OpenBanking/Registration.py b/nightly/script-catalog/client_registration/OpenBanking/Registration.py
index bc64e62219d..4facf6d03aa 100644
--- a/nightly/script-catalog/client_registration/OpenBanking/Registration.py
+++ b/nightly/script-catalog/client_registration/OpenBanking/Registration.py
@@ -141,7 +141,7 @@ def destroy(self, configurationAttributes):
print "Client registration. Destroyed successfully"
return True
- # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/nightly/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
+ # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/vreplace-janssen-version/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
def createClient(self, context):
print "Client registration. CreateClient method"
client = context.getClient()
@@ -207,7 +207,7 @@ def validateDCR(self, registerRequest, client, configurationAttributes):
- # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/nightly/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
+ # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/vreplace-janssen-version/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
def updateClient(self, context):
print "Client registration. UpdateClient method"
return True
@@ -219,7 +219,7 @@ def getSoftwareStatementHmacSecret(self, context):
return ""
# cert - java.security.cert.X509Certificate
- # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/nightly/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
+ # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/vreplace-janssen-version/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
def isCertValidForClient(self, cert, context):
return False
diff --git a/nightly/script-catalog/client_registration/OpenBanking/client-registration/index.html b/nightly/script-catalog/client_registration/OpenBanking/client-registration/index.html
index e3939d814a0..e7a7355bf3b 100644
--- a/nightly/script-catalog/client_registration/OpenBanking/client-registration/index.html
+++ b/nightly/script-catalog/client_registration/OpenBanking/client-registration/index.html
@@ -8548,7 +8548,7 @@
OverviewConfiguration Prerequisites#
- A Janssen Authorization Server installation
-- Client Registration script - included in the default Janssen OpenBanking distribution
+- Client Registration script - included in the default Janssen OpenBanking distribution
- Setting configuration parameters
- Setting third party library (Jose4j) in classpath
diff --git a/nightly/script-catalog/client_registration/sample-script/SampleScript.py b/nightly/script-catalog/client_registration/sample-script/SampleScript.py
index 69ecc8b7304..86f979005cb 100644
--- a/nightly/script-catalog/client_registration/sample-script/SampleScript.py
+++ b/nightly/script-catalog/client_registration/sample-script/SampleScript.py
@@ -30,7 +30,7 @@ def destroy(self, configurationAttributes):
return True
# Update client entry before persistent it
- # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/nightly/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
+ # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/vreplace-janssen-version/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
def createClient(self, context):
print "Client registration. CreateClient method"
registerRequest = context.getRegisterRequest()
@@ -62,7 +62,7 @@ def createClient(self, context):
return True
# Update client entry before persistent it
- # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/nightly/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
+ # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/vreplace-janssen-version/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
def updateClient(self, context):
print "Client registration. UpdateClient method"
return True
@@ -106,7 +106,7 @@ def getSoftwareStatementJwks(self, context):
return ""
# cert - java.security.cert.X509Certificate
- # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/nightly/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
+ # context refers to io.jans.as.server.service.external.context.DynamicClientRegistrationContext - see https://github.com/JanssenProject/jans-auth-server/blob/vreplace-janssen-version/server/src/main/java/io/jans/as/server/service/external/context/DynamicClientRegistrationContext.java#L24
def isCertValidForClient(self, cert, context):
return False
diff --git a/nightly/script-catalog/consent_gathering/sample-script/ConsentGatheringSample.py b/nightly/script-catalog/consent_gathering/sample-script/ConsentGatheringSample.py
index 40576be19b1..f0a48a0a49d 100644
--- a/nightly/script-catalog/consent_gathering/sample-script/ConsentGatheringSample.py
+++ b/nightly/script-catalog/consent_gathering/sample-script/ConsentGatheringSample.py
@@ -30,7 +30,7 @@ def destroy(self, configurationAttributes):
return True
def getApiVersion(self):
- return 1
+ return 11
# Main consent-gather method. Must return True (if gathering performed successfully) or False (if fail).
# All user entered values can be access via Map context.getPageAttributes()
diff --git a/nightly/script-catalog/idp/idp-extension/index.html b/nightly/script-catalog/idp/idp-extension/index.html
index 8141995f244..69cc7ac9e79 100644
--- a/nightly/script-catalog/idp/idp-extension/index.html
+++ b/nightly/script-catalog/idp/idp-extension/index.html
@@ -8734,7 +8734,7 @@ Script Type: Pythonreturn False
# Update attributes before releasing them
- # context is io.jans.idp.consent.processor.PostProcessAttributesContext (https://github.com/JanssenProject/shib-oxauth-authn3/blob/nightly/src/main/java/io.jans.idp/consent/processor/PostProcessAttributesContext.java)
+ # context is io.jans.idp.consent.processor.PostProcessAttributesContext (https://github.com/JanssenProject/shib-oxauth-authn3/blob/vreplace-janssen-version/src/main/java/io.jans.idp/consent/processor/PostProcessAttributesContext.java)
# configurationAttributes is java.util.Map<String, SimpleCustomProperty>
def updateAttributes(self, context, configurationAttributes):
print "Idp extension. Method: updateAttributes"
diff --git a/nightly/script-catalog/idp/sample-script/SampleScript.py b/nightly/script-catalog/idp/sample-script/SampleScript.py
index cdec27db7d2..80f8e5c304e 100644
--- a/nightly/script-catalog/idp/sample-script/SampleScript.py
+++ b/nightly/script-catalog/idp/sample-script/SampleScript.py
@@ -94,7 +94,7 @@ def translateAttributes(self, context, configurationAttributes):
return False
# Update attributes before releasing them
- # context is io.jans.idp.consent.processor.PostProcessAttributesContext (https://github.com/JanssenProject/shib-oxauth-authn3/blob/nightly/src/main/java/io.jans.idp/consent/processor/PostProcessAttributesContext.java)
+ # context is io.jans.idp.consent.processor.PostProcessAttributesContext (https://github.com/JanssenProject/shib-oxauth-authn3/blob/vreplace-janssen-version/src/main/java/io.jans.idp/consent/processor/PostProcessAttributesContext.java)
# configurationAttributes is java.util.Map
def updateAttributes(self, context, configurationAttributes):
print "Idp extension. Method: updateAttributes"
diff --git a/nightly/script-catalog/persistence_extension/persistence/index.html b/nightly/script-catalog/persistence_extension/persistence/index.html
index 9a800f11678..878db8c1dde 100644
--- a/nightly/script-catalog/persistence_extension/persistence/index.html
+++ b/nightly/script-catalog/persistence_extension/persistence/index.html
@@ -8639,7 +8639,7 @@
Persistence Script#
-By overriding the interface methods in PersistenceType inside a custom script you can
+By overriding the interface methods in PersistenceType inside a custom script you can
- Load initialization data from DB or initialize services after the creation of Entry Manager.
- Release resources, terminate services etc. after the destruction of Entry Manager.
@@ -8653,7 +8653,7 @@ Persistence ScriptUsage#
-
The Jans-Auth server contains a PeristenceType
script.
+The Jans-Auth server contains a PeristenceType
script.
Hashed Passwords#
Hashed passwords can be created using any method from this enum, instead of the native/default SSHA256.
The ORM module of the Janssen server does the following:
diff --git a/nightly/script-catalog/person_authentication/apple-external-authenticator/index.html b/nightly/script-catalog/person_authentication/apple-external-authenticator/index.html
index fc5a54f2007..11dd332e1ba 100644
--- a/nightly/script-catalog/person_authentication/apple-external-authenticator/index.html
+++ b/nightly/script-catalog/person_authentication/apple-external-authenticator/index.html
@@ -8610,7 +8610,7 @@ Propertieslink
+
To update this setting in Jans persistence, follow this link
Enable Sign-in with Apple Authentication script#
By default, users will get the default authentication mechanism as specified above. However, using the OpenID Connect acr_values parameter, web and mobile clients can request any enabled authentication mechanism.
Obtain the json contents of apple
custom script by using a jans-cli command like get-config-scripts-by-type, get-config-scripts-by-inum etc.
@@ -8620,7 +8620,7 @@
Enable Sign-in with App
Now Sign-in with Apple is an available authentication mechanism for your Janssen Server. This means that, using OpenID Connect acr_values, applications can now request Apple authentication for users.
!!! Note To make sure apple
has been enabled successfully, you can check your Janssen's Auth Server OpenID Connect configuration by navigating to the following URL: https:///.well-known/openid-configuration. Find "acr_values_supported": and you should see "apple".
Make Sign-in with Apple Script as default authentication script:#
-Use this link as a reference.
+Use this link as a reference.
Steps:
1. Create a file say apple-auth-default.json
with the following contents
{
diff --git a/nightly/script-catalog/person_authentication/duo-external-authenticator/index.html b/nightly/script-catalog/person_authentication/duo-external-authenticator/index.html
index 4d8a7e3e833..e8da3a15253 100644
--- a/nightly/script-catalog/person_authentication/duo-external-authenticator/index.html
+++ b/nightly/script-catalog/person_authentication/duo-external-authenticator/index.html
@@ -8571,7 +8571,7 @@
Index
Integrating DUO's Universal Prompt as an authentication method in Janssen server#
-Duo Security is a SaaS authentication provider. This document will explain how to use Janssen's Duo interception script to configure the Janssen Server for a two-step authentication process with username and password as the first step, and Duo as the second step. The script invokes the Universal Prompt which is a redesign of Duo’s traditional authentication prompt.
+Duo Security is a SaaS authentication provider. This document will explain how to use Janssen's Duo interception script to configure the Janssen Server for a two-step authentication process with username and password as the first step, and Duo as the second step. The script invokes the Universal Prompt which is a redesign of Duo’s traditional authentication prompt.
Authentication flow#
sequenceDiagram
title Integrating DUO's Universal Prompt as an authentication method in Janssen server
@@ -8595,7 +8595,7 @@ Authentication flowAdministrator prerequisites#
-- Duo interception script (included in the default Janssen Server distribution);
+- Duo interception script (included in the default Janssen Server distribution);
- An account with Duo Security.
User prerequisites#
@@ -8710,7 +8710,7 @@ 2. Add custom script and you should see "duo"
.
Make Duo the Default Authentication Mechanism#
-For CURL commands, use this link as a reference.
+For CURL commands, use this link as a reference.
Steps:
1. Create a file say duo-auth-default.json
with the following contents
{
diff --git a/nightly/script-catalog/person_authentication/fido2-external-authenticator/index.html b/nightly/script-catalog/person_authentication/fido2-external-authenticator/index.html
index 8ddc8b55fd2..9bfe4f760d7 100644
--- a/nightly/script-catalog/person_authentication/fido2-external-authenticator/index.html
+++ b/nightly/script-catalog/person_authentication/fido2-external-authenticator/index.html
@@ -8608,12 +8608,12 @@ OverviewFIDO 2.0 (FIDO2) , an open authentication standard that enables people to leverage common devices to authenticate to online services in both mobile and desktop environments. The Janssen server includes a FIDO2 server implementation. This enables authentications by using platform authenticators embedded into a person's device or physical USB, NFC or Bluetooth security keys that are inserted into a USB slot of a computer.
FIDO2 is comprised of the W3C’s Web Authentication specification (WebAuthn) and FIDO’s corresponding Client-to-Authenticator Protocol (CTAP). WebAuthn defines a standard web API that can be built into browsers and related web platform infrastructure to enable online services to use FIDO Authentication. CTAP enables external devices such as mobile handsets or FIDO Security Keys to work with WebAuthn and serve as authenticators to desktop applications and web services.
This document explains how to use the Janssen Auth Server's built-in
-FIDO2 interception script
+FIDO2 interception script
to implement a two-step, two-factor authentication (2FA) with username / password as the first step, and any FIDO2 device as the second step.
Prerequisites#
- A Janssen Server (installation instructions)
-- FIDO2 interception script (included in the default Janssen Server distribution);
+- FIDO2 interception script (included in the default Janssen Server distribution);
- At least one FIDO2 device for testing, like one of the devices listed below.
FIDO2 devices#
@@ -8662,7 +8662,7 @@ Enable FIDO2 script and you should see "fido2"
.
Enable FIDO2 Script as default authentication script:#
-Use this link as a reference.
+
Use this link as a reference.
Follow the steps below to enable FIDO2 authentication:
1. Create a file say fido2-auth-default.json
with the following contents
{
@@ -8683,8 +8683,8 @@ Test the featureFIDO2 login page#
Below is an illustration of the Janssen Server's default FIDO2 login page:
-
-The design is being rendered from the FIDO2 xhtml page. To customize the look and feel of this page, follow the customization guide.
+
+The design is being rendered from the FIDO2 xhtml page. To customize the look and feel of this page, follow the customization guide.
Using FIDO2 tokens#
Credential enrollment#
FIDO2 device enrollment happens during the first authentication attempt.
@@ -8692,7 +8692,7 @@ Subsequent authenticationsFIDO2 credential management#
A user's FIDO2 devices can be removed by a Janssen administrator in LDAP under the user entry as shown in the below screenshot.
-
+
Diagram source in mermaid.live
graph TD
diff --git a/nightly/script-catalog/person_authentication/google-external-authenticator/index.html b/nightly/script-catalog/person_authentication/google-external-authenticator/index.html
index de2bb3df38e..139b0e100e0 100644
--- a/nightly/script-catalog/person_authentication/google-external-authenticator/index.html
+++ b/nightly/script-catalog/person_authentication/google-external-authenticator/index.html
@@ -8588,8 +8588,8 @@ Social Login with GoogleAn out-of-the-box feature, the Google Authentication script is a PersonAuthenticationType
script which enables a user to sign-in using Google credentials. Google's OAuth 2.0 APIs are used for this. After users authenticate using their Google credentials, their Google credentials are provisioned into the Jans-auth server.
Prerequisites#
-- A Jans-auth Server (installation instructions here)
-- The Google authentication script (included in the default Jans-auth Server distribution);
+- A Jans-auth Server (installation instructions here)
+- The Google authentication script (included in the default Jans-auth Server distribution);
- A Google account.
- Google API jars namely google-api-client, google-oauth-client and google-http-client-jackson2 added to jans-auth-server
@@ -8645,7 +8645,7 @@ Propertieslink
+
To update this setting in Jans persistence, follow this link
Enable Sign-in with Google Authentication script#
By default, users will get the default authentication mechanism as specified above. However, using the OpenID Connect acr_values parameter, web and mobile clients can request any enabled authentication mechanism.
Obtain the json contents of google
custom script by using a jans-cli command like get-config-scripts-by-type, get-config-scripts-by-inum etc.
@@ -8655,7 +8655,7 @@
Enable Sign-in with Go
Now Google is an available authentication mechanism for your Janssen Server. This means that, using OpenID Connect acr_values, applications can now request Google authentication for users.
!!! Note To make sure google
has been enabled successfully, you can check your Janssen's Auth Server OpenID Connect configuration by navigating to the following URL: https:///.well-known/openid-configuration. Find "acr_values_supported": and you should see "google".
Make Sign-in with Google Script as default authentication script:#
-Use this link as a reference.
+Use this link as a reference.
Steps:
1. Create a file say google-auth-default.json
with the following contents
{
diff --git a/nightly/script-catalog/person_authentication/other/obconnect/README.me b/nightly/script-catalog/person_authentication/other/obconnect/README.me
index 4ee65887df3..f83fecb1582 100644
--- a/nightly/script-catalog/person_authentication/other/obconnect/README.me
+++ b/nightly/script-catalog/person_authentication/other/obconnect/README.me
@@ -74,4 +74,4 @@ The mandatory properties in the obconnect authentication script are as follows
Now applications can request obconnect's authentication and consent flow. To make obconnect your default authentication mechanism, follow these instructions in this document set the default authentication mechanism to "obconnect"
-https://github.com/JanssenProject/jans-cli-tui/blob/nightly/README.md
\ No newline at end of file
+https://github.com/JanssenProject/jans-cli-tui/blob/vreplace-janssen-version/README.md
\ No newline at end of file
diff --git a/nightly/script-catalog/person_authentication/other/obconnect/documentation/README.txt b/nightly/script-catalog/person_authentication/other/obconnect/documentation/README.txt
index 4ee65887df3..f83fecb1582 100644
--- a/nightly/script-catalog/person_authentication/other/obconnect/documentation/README.txt
+++ b/nightly/script-catalog/person_authentication/other/obconnect/documentation/README.txt
@@ -74,4 +74,4 @@ The mandatory properties in the obconnect authentication script are as follows
Now applications can request obconnect's authentication and consent flow. To make obconnect your default authentication mechanism, follow these instructions in this document set the default authentication mechanism to "obconnect"
-https://github.com/JanssenProject/jans-cli-tui/blob/nightly/README.md
\ No newline at end of file
+https://github.com/JanssenProject/jans-cli-tui/blob/vreplace-janssen-version/README.md
\ No newline at end of file
diff --git a/nightly/script-catalog/person_authentication/other/uaf/Properties description/index.html b/nightly/script-catalog/person_authentication/other/uaf/Properties description/index.html
index 8efc490e387..fb8650f62a1 100644
--- a/nightly/script-catalog/person_authentication/other/uaf/Properties description/index.html
+++ b/nightly/script-catalog/person_authentication/other/uaf/Properties description/index.html
@@ -8481,7 +8481,7 @@
Properties description
-Script contents here
+Script contents here
This is a person authentication script for jans-auth-server that enables UAF for user authentication.
The module has a few properties:
1) uaf_server_uri - It's mandatory property. It's URL to UAF server.
diff --git a/nightly/script-catalog/person_authentication/other/uaf/index.html b/nightly/script-catalog/person_authentication/other/uaf/index.html
index 6241bdaf6b8..3e38f82e575 100644
--- a/nightly/script-catalog/person_authentication/other/uaf/index.html
+++ b/nightly/script-catalog/person_authentication/other/uaf/index.html
@@ -8481,7 +8481,7 @@
Index
-Script contents here
+Script contents here
This is a person authentication script for jans-auth-server that enables UAF for user authentication.
The module has a few properties:
1) uaf_server_uri - It's mandatory property. It's URL to UAF server.
diff --git a/nightly/script-catalog/person_authentication/super-gluu-external-authenticator/index.html b/nightly/script-catalog/person_authentication/super-gluu-external-authenticator/index.html
index 5762a03eebb..3e63e4fc0fa 100644
--- a/nightly/script-catalog/person_authentication/super-gluu-external-authenticator/index.html
+++ b/nightly/script-catalog/person_authentication/super-gluu-external-authenticator/index.html
@@ -8942,7 +8942,7 @@
Enable Sign-in wit
!!! Note To make sure super_gluu
has been enabled successfully, you can check your Janssen's Auth Server OpenID Connect configuration by navigating to the following URL: https:///.well-known/openid-configuration. Find "acr_values_supported": and you should see "super_gluu".
Make Sign-in with Super-Gluu Script as default authentication script:#
-Use this link as a reference.
+Use this link as a reference.
Steps:
1. Create a file say sg-auth-default.json
with the following contents
{
@@ -8958,8 +8958,8 @@ Test the featurehttps://<your.jans.server>/jans-auth/authorize.htm?response_type=code&redirect_uri=https://<your.jans.server>/admin&client_id=<replace_with_inum_client_id>&scope=openid+profile+email+user_name&state=faad2cdjfdddjfkdf&nonce=dajdffdfsdcfff
Customizations to Super Gluu Login Pages#
-The Gluu Server includes a default public-facing pages for Super Gluu for enrollment and authentication.
-To customize the look and feel of the pages, follow the customization guide.
+The Gluu Server includes a default public-facing pages for Super Gluu for enrollment and authentication.
+To customize the look and feel of the pages, follow the customization guide.
Self-service#
To offer end-users a portal where they can manage their own account security preferences, including two-factor authentication credentials like Super Gluu, check out our new app, Gluu Casa.
Manual Device Management#
diff --git a/nightly/script-catalog/person_authentication/twilio-2fa/index.html b/nightly/script-catalog/person_authentication/twilio-2fa/index.html
index ce735587bf1..94aa2667f33 100644
--- a/nightly/script-catalog/person_authentication/twilio-2fa/index.html
+++ b/nightly/script-catalog/person_authentication/twilio-2fa/index.html
@@ -8680,7 +8680,7 @@ Enable twilio_sms script
e.g : /opt/jans/jans-cli/config-cli.py --operation-id get-config-scripts-by-type --url-suffix type:PERSON_AUTHENTICATION
, /opt/jans/jans-cli/config-cli.py --operation-id get-config-scripts-by-inum --url-suffix inum:6122281b-b55d-4dd0-8115-b098eeeee2b7
-- Update the custom script and change the
enabled
attribute to true
+- Update the custom script and change the
enabled
attribute to true
Now twilio_sms
is an available authentication mechanism for your Janssen Server. This means that, using OpenID Connect acr_values
, applications can now request twilio_sms
authentication for users.
@@ -8690,7 +8690,7 @@ Enable twilio_sms script"acr_values_supported": and you should see twilio_sms
.
Enable twilio_sms
Script as default authentication script:#
-Use this link as a reference.
+
Use this link as a reference.
Follow the steps below to enable twilio_sms
authentication:
1. Create a file say twilio_sms
-auth-default.jsonwith the following contents
{
diff --git a/nightly/script-catalog/resource_owner_password_credentials/ropc/index.html b/nightly/script-catalog/resource_owner_password_credentials/ropc/index.html
index c0810acf5bc..74a221ef20b 100644
--- a/nightly/script-catalog/resource_owner_password_credentials/ropc/index.html
+++ b/nightly/script-catalog/resource_owner_password_credentials/ropc/index.html
@@ -8710,7 +8710,7 @@ OverviewRFC 6749).
The script is invoked after normal authentication and can either leave current result or change it - authenticate if not authenticated - it should return True and optionally set user (via context.setUser(user)
).
Interface#
-The ROPC script implements the ResourceOwnerPasswordCredentialsType interface. This extends methods from the base script type in addition to adding new method:
+The ROPC script implements the ResourceOwnerPasswordCredentialsType interface. This extends methods from the base script type in addition to adding new method:
Inherited Methods#
@@ -8760,7 +8760,7 @@ ObjectscustomScript
-The custom script object. Reference
+The custom script object. Reference
configurationAttributes
@@ -8768,11 +8768,11 @@ ObjectsSimpleCustomProperty
-Map of configuration properties. Reference
+Map of configuration properties. Reference
context
-Reference
+Reference
diff --git a/nightly/search/search_index.json b/nightly/search/search_index.json
index 892782bb1bf..bc8c783600e 100644
--- a/nightly/search/search_index.json
+++ b/nightly/search/search_index.json
@@ -1 +1 @@
-{"config": {"indexing": "full", "lang": ["en"], "min_search_length": 3, "prebuild_index": false, "separator": "[\\s\\-]+"}, "docs": [{"location": "", "text": "Janssen Project Documentation # Introduction # Janssen is a distribution of open source identity components which organizations can use to build a scalable federated authentication and authorization service. This documentation is always work in progress. Please help to make it better by submitting a PR if you can think of any way to improve it! Administration Guide # Read the Administration guide to learn how to deploy, operate and maintain the Janssen components. Planning your solution using the Deployment Guide . An easy way to get started is to try Janssen on an VM, see Installation or check the other docs for Kubernetes based installation. Contribution Guide # There are many ways the community can contribute to the Janssen Project. Of course, you can contribute code. But we also need people to write documentation and guides, to help us with testing, to answer questions on the forums and chat, to review PRs, to help us with devops and CI/CD, to provide feedback on usability, and to promote the project through outreach. Also, by sharing metrics with us, we can gain valuable insights into how the software performs in the wild. Resources to get started are available here . Governance Guide # The Janssen Project is chartered under the Linux Foundation. Information about the project's governance can be found here . Script Catalog # Interception scripts (or custom scripts) allow you to define custom business logic for various features in Janssen without forking the Jans Server core project. Interceptions scripts are available for many components, including Auth Server, SCIM, FIDO, and Link. The definitive location for scripts and their documentation is the Script Catalog . Agama # Agama is a domain specific language (\"DSL\") designed for writing web flows, and a project archive format (\".gama\") which stores all the code and web assets required for deployment of an Agama project by an identity provider. Although invented by Janssen, we envision many IDP's using Agama as a cross-vendor standard for identity orchestration. Support # If you have any questions about usage, post on Jans Discussions or try community chat on Gitter . If you find a bug in a Janssen project, or you would like to suggest a new feature, you should also post on GitHub Discussions first. The Jans team will try to replicate the bug, or weigh the feature request versus current priorities. License # Most Janssen Project components are licensed under the Apache License 2.0 . Janssen has some third party components, so it's always best to check the license for each component. We won't include any component in the distribution that has a non- OSI approved license, or a commercial trademark. Looking for older documentation versions? # The Janssen Project posts the last five versions of the documentation. If you are looking for older versions, you can find them unprocessed in the docs folder. Select the version of choice from the tag dropdown in GitHub. If you want to process them you may do so following the steps here .", "title": "Janssen Project Documentation"}, {"location": "#janssen-project-documentation", "text": "", "title": "Janssen Project Documentation"}, {"location": "#introduction", "text": "Janssen is a distribution of open source identity components which organizations can use to build a scalable federated authentication and authorization service. This documentation is always work in progress. Please help to make it better by submitting a PR if you can think of any way to improve it!", "title": "Introduction"}, {"location": "#administration-guide", "text": "Read the Administration guide to learn how to deploy, operate and maintain the Janssen components. Planning your solution using the Deployment Guide . An easy way to get started is to try Janssen on an VM, see Installation or check the other docs for Kubernetes based installation.", "title": "Administration Guide"}, {"location": "#contribution-guide", "text": "There are many ways the community can contribute to the Janssen Project. Of course, you can contribute code. But we also need people to write documentation and guides, to help us with testing, to answer questions on the forums and chat, to review PRs, to help us with devops and CI/CD, to provide feedback on usability, and to promote the project through outreach. Also, by sharing metrics with us, we can gain valuable insights into how the software performs in the wild. Resources to get started are available here .", "title": "Contribution Guide"}, {"location": "#governance-guide", "text": "The Janssen Project is chartered under the Linux Foundation. Information about the project's governance can be found here .", "title": "Governance Guide"}, {"location": "#script-catalog", "text": "Interception scripts (or custom scripts) allow you to define custom business logic for various features in Janssen without forking the Jans Server core project. Interceptions scripts are available for many components, including Auth Server, SCIM, FIDO, and Link. The definitive location for scripts and their documentation is the Script Catalog .", "title": "Script Catalog"}, {"location": "#agama", "text": "Agama is a domain specific language (\"DSL\") designed for writing web flows, and a project archive format (\".gama\") which stores all the code and web assets required for deployment of an Agama project by an identity provider. Although invented by Janssen, we envision many IDP's using Agama as a cross-vendor standard for identity orchestration.", "title": "Agama"}, {"location": "#support", "text": "If you have any questions about usage, post on Jans Discussions or try community chat on Gitter . If you find a bug in a Janssen project, or you would like to suggest a new feature, you should also post on GitHub Discussions first. The Jans team will try to replicate the bug, or weigh the feature request versus current priorities.", "title": "Support"}, {"location": "#license", "text": "Most Janssen Project components are licensed under the Apache License 2.0 . Janssen has some third party components, so it's always best to check the license for each component. We won't include any component in the distribution that has a non- OSI approved license, or a commercial trademark.", "title": "License"}, {"location": "#looking-for-older-documentation-versions", "text": "The Janssen Project posts the last five versions of the documentation. If you are looking for older versions, you can find them unprocessed in the docs folder. Select the version of choice from the tag dropdown in GitHub. If you want to process them you may do so following the steps here .", "title": "Looking for older documentation versions?"}, {"location": "CODE_OF_CONDUCT/", "text": "Janssen Code of Conduct v1.0 # Our Pledge # In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. Our Standards # Examples of behavior that contributes to creating a positive environment include: Using welcoming and inclusive language Being respectful of differing viewpoints and experiences Gracefully accepting constructive criticism Focusing on what is best for the community Showing empathy towards other community members Examples of unacceptable behavior by participants include: The use of sexualized language or imagery and unwelcome sexual attention or advances Trolling, insulting/derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or electronic address, without explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Our Responsibilities # Janssen Project members, project participants and contributors (collectively, \"participants\") are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. The Technical Steering Committee (\"TSC\") of the Janssen Project has the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any participant for other behaviors that they deem inappropriate, threatening, offensive, or harmful. All participants have determined that The Linux Foundation is the most optimal organization to shepherd the development of this project. Participants acknowledge and agree to The Linux Foundation's exclusive right to use \"Janssen Project\" and any other names and trademarks associated with the open source project and Janssen Project and to authorize others\u2019 use of the marks, establish guidelines for such use, and to delegate these responsibilities. Participants agree not to take any action inconsistent with such rights and to cooperate in any action which The Linux Foundation deems necessary or desirable to prevent confusion or establish or preserve these rights. Participants will not independently adopt, use, or attempt to register any trademarks or trade names that are confusingly similar to these names. Scope # This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. Enforcement # Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Executive Director, or, if the complaint involves the Executive Director, a member of the steering committee. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Participants who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by the steering committee. Attribution # This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html . For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq", "title": "Code of Conduct"}, {"location": "CODE_OF_CONDUCT/#janssen-code-of-conduct-v10", "text": "", "title": "Janssen Code of Conduct v1.0"}, {"location": "CODE_OF_CONDUCT/#our-pledge", "text": "In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.", "title": "Our Pledge"}, {"location": "CODE_OF_CONDUCT/#our-standards", "text": "Examples of behavior that contributes to creating a positive environment include: Using welcoming and inclusive language Being respectful of differing viewpoints and experiences Gracefully accepting constructive criticism Focusing on what is best for the community Showing empathy towards other community members Examples of unacceptable behavior by participants include: The use of sexualized language or imagery and unwelcome sexual attention or advances Trolling, insulting/derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or electronic address, without explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting", "title": "Our Standards"}, {"location": "CODE_OF_CONDUCT/#our-responsibilities", "text": "Janssen Project members, project participants and contributors (collectively, \"participants\") are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. The Technical Steering Committee (\"TSC\") of the Janssen Project has the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any participant for other behaviors that they deem inappropriate, threatening, offensive, or harmful. All participants have determined that The Linux Foundation is the most optimal organization to shepherd the development of this project. Participants acknowledge and agree to The Linux Foundation's exclusive right to use \"Janssen Project\" and any other names and trademarks associated with the open source project and Janssen Project and to authorize others\u2019 use of the marks, establish guidelines for such use, and to delegate these responsibilities. Participants agree not to take any action inconsistent with such rights and to cooperate in any action which The Linux Foundation deems necessary or desirable to prevent confusion or establish or preserve these rights. Participants will not independently adopt, use, or attempt to register any trademarks or trade names that are confusingly similar to these names.", "title": "Our Responsibilities"}, {"location": "CODE_OF_CONDUCT/#scope", "text": "This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.", "title": "Scope"}, {"location": "CODE_OF_CONDUCT/#enforcement", "text": "Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Executive Director, or, if the complaint involves the Executive Director, a member of the steering committee. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Participants who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by the steering committee.", "title": "Enforcement"}, {"location": "CODE_OF_CONDUCT/#attribution", "text": "This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html . For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq", "title": "Attribution"}, {"location": "CONTRIBUTING/", "text": "Contributing to Janssen Project # Purpose of this guide is to provide necessary information and resources to community in order to make successful contribution to the Janssen Project. There are many ways you can contribute. Of course you can contribute code. But we also need people to write documentation and guides, to help us with testing, to answer questions on the forums and chat, to review PR's, to help us with devops and CI/CD, to provide feedback on usability, and to promote the project through outreach. Also, by sharing metrics with us, we can gain valuable insights into how the software performs in the wild. Join the Community First Time Contributors Contribution Guidelines Code of Conduct About Issues Triaging Code Conventions and Guidelines Commits Branches PRs Issues Contributing to the documentation Contribution Workflow Find Something To Work On Start a Discussion Implement the Change Document Raise a PR Follow Through Join the Community # Repo : Watch and Star Janssen repository on Github Discussions : Join interesting discussions at Github Discussions Chat : We have an active community chat on Gitter . You can register for free their with your Github identity. Tweet : Janssen is on Twitter too. Follow us there to stay up to date on release announcements and news around Janssen. First Time Contributors # In case you are first-time contributor, then you can start with our good first issues list These are issues where you can easily contribute and community members will guide and support your contribution as always. If you need Janssen installation to test out your fix, here are the steps . Contribution Guidelines # We are really glad you are reading this, because we need volunteer developers to help this project come to fruition. Code of Conduct Issues Triaging Coding Conventions Code of Conduct # Janssen project has a Code of Conduct to which all contributors must adhere, please read it before interacting with the repository or the community in any way. About Issues # There are four kinds of issues you can open: Bug report : you believe you found a problem in a project and you want to discuss and get it fixed, creating an issue with the bug report template is the best way to do so. Feature Request : any kind of new feature need to be discussed in this kind of issue, do you want a new rule or a new feature? This is the kind of issue you want to open. Be very good at explaining your intent, it's always important that others can understand what you mean in order to discuss, be open and collaborative in letting others help you getting this done! Security Vulnerability : If you identify a security problem, please report it immediately, providing details about the nature, and if applicable, how to reproduce it. If you want to report an issue privately, you can email security@gluu.org Failing tests : you noticed a flaky test or a problem with a build? This is the kind of issue to triage that! The best way to get involved in the project is through issues, you can help in many ways: Issues triaging: participating in the discussion and adding details to open issues is always a good thing, sometimes issues need to be verified, you could be the one writing a test case to fix a bug! Fix an issue: you can help in getting issue fixed in many ways. More often by opening a pull request. In case you are first-time contributor, then you can start with our good first issues list These are issues where you can easily contribute and community members will guide and support your contribution as always. Triaging # Triage is a process of evaluating issues and PRs in order to determine their characteristics and take quick actions if possible. When you triage an issue, you: assess whether it has merit or not quickly close it by correctly answering a question point the reporter to a resource or documentation answering the issue tag it via labels, projects, or milestones take ownership submitting a PR for it, in case you want \ud83d\ude07 Here is how we continously triage new issues and PRs so that contributors can contribute faster and better. Code Conventions and Guidelines # Commits # Janssen Project mandates all commits to follow guidelines as below. Commit messages As commit convention, we adopt Conventional Commits v1.0.0 , we have an history of commits that do not adopt the convention but any new commit must follow it to be eligible for merge. Add GPG signature to your commit To ensure that contribution is coming for a trusted source, all commits should be signed using GPG key and verified by Github. If you have GPG key setup already then just use -S switch with you commit to sign it. If you need to setup your GPG key and verification, then you can find detailed instructions here Add DCO sign-off The Developer Certificate of Origin (DCO) is a lightweight way for contributors to certify that they wrote or otherwise have the right to submit the code they are contributing to the project. Contributors to the Janssen project sign-off that they adhere to these requirements by adding a Signed-off-by line to commit messages. This is a commit message Signed-off-by: Foo Bar Git even has a -s command line option to append this automatically to your commit message: $ git commit -s -m 'This is my commit message' In all, if you have your GPG verification setup, your commit command should look like git commit -S -s -m 'message that follows conventional commit style' Branches # Branch name should have component name as prefix, eg jans-core-mybranch PRs # PR titles should also follow Conventional Commits v1.0.0 . This will help in keeping merge commit messages inline with commit message standards Squash commits into small number of cohesive commits before raising a PR PR should be rebased on main branch so that there are minimal or no conflicts at the time of merge PR should only have changes related to target feature or issue. Create a separate PR for formatting or other quick bug fixes PR should include relevent documentaton changes PR should include unit and integration tests Issues # Issue titles should follow Conventional Commits v1.0.0 Backport changes to a different version # Backport changes are now supported through a workflow through labels prefixed with backport/ . For-example to backport changes in a certain PR to version v1.0.0 a label to that PR matching the version must be added i.e backport/v1.0.0 . The flow consists of creating a new branch, cherry-picking the changes of the original PR and creating a new PR to merge them. License Header # The Janssen Project uses Apache-2.0 license. Any existing or new code file has to start with the license header as shown below: /* * This software is available under the Apache-2.0 license. * See https://www.apache.org/licenses/LICENSE-2.0.txt for full text. * * Copyright (c) 2024, Gluu, Inc. */ If the developers sign a CLA(Contributor License Agreement) they can retain the copyright. Once the CLA has been signed, contributions can be accepted from the contributor with the License header as below. Make sure to replace [github-username] with contributor's GitHub username: /* * This software is available under the Apache-2.0 license. * See https://www.apache.org/licenses/LICENSE-2.0.txt for full text. * * Copyright (c) 2024, [github-username]. */ Signing the CLA # The current version of CLA can be found here . This is just for your reference. This same CLA will be signed digitally by following the steps below: The contributor sends an e-mail expressing willingness to contribute and sign the CLA. In the email, mention your GitHub account username from which the contributions will be made. If contributions will be made on behalf of an organization, then along with the GitHub username, mention the job title and organization's name in the email. Contributor receives an email with CLA and instructions on how to sign digitally. Follow the instructions and complete the signing process. Contributing to the documentation # Great documentation is a reflection of software's maturity and the great community that stands behind it. Contributing to the Janssen Project documentation is the easiest way to learn about the Janssen Project and to get involved in the community process. In order to ensure consistency of style, language, format, and terminology across all documents, please follow the guidelines below: Glossary of terms # This glossary helps to keep terms and their meanings consistent across documentation. Janssen Project or Jans : Refers to the official project name under Linux Foundation that seeks to build the world\u2019s fastest and most comprehensive cloud native identity and access management software platform Janssen Server : Refers to a set of software components developed under the Janssen Project . Components of the Janssen Server include client and server implementations of the OAuth, OpenID Connect, SCIM and FIDO standards. The term Janssen Server is used to refer to these components as a group. jans-auth-server : Refers to a module within the Janssen Server named jans-auth-server . This is one of the significant modules of the Janssen Server that has an implementation for OAuth and OpenId Connect. Janssen Server module names: For correct naming of other modules of the Janssen Server, please refer to README Documentation Style Guide # Janssen Project documentation uses Markdown. Guidelines below are intended to bring consistency in writing and formatting documents. Testing Janssen Project documentation site is published using MkDocs. Markdown parsers used by Github and the one used by MkDocs may have slight variations in how they generate HTML. So, for a small number of cases, document may look different between Github and Janssen Project documentation site . Hence it is critical to test documentation changes locally before pushing to repository. This will ensure that final HTML rendering of documents by MkDocs is as desired. Document Title # The document title summarises what the document aims to achieve and at the same time, it plays a critical role in making the document easy to find via search. Below are a few guidelines to write good titles for documents. Every document must start with a title. Meaning, # Title should summarise what the document is trying to achieve. For examples: Integrating with the Apache mod_auth_openidc module , Integrating DUO's Universal Prompt as an authentication method , Install using Ubuntu Linux Package Title should include its context. For example, the document under Installation > VM Installation > Ubuntu should not be titled as just Ubuntu but it should have a more detailed title similar to Install using Ubuntu Linux Package . When required, to keep the title from becoming too long, assume that Janssen Server is already understood as context. Titles should be written using title case Document Tags # Janssen Project documentation uses tags to make the search more accurate and add context to search results. Following are guidelines and examples to follow while adding tags to a document. Maximum 6 tags First three should establish the context of the section hierarchy under which the document belongs. See the example below. Remaining tags can be based on the content of the document. Each tag should be a single word (no spaces, hyphens or commas, etc) All tags should be in lowercase Example: Let's look at how to add tags to a document that is located on documentation site at path Administration -> Installation -> VM installation . Also, assume that the document describes the steps to install Janssen Project on the Ubuntu platform. Tags below would be recommended: --- ta gs : - admi n is trat io n - i nstallat io n - vm - ubu ntu --- Referencing Janssen Project Release in Documents # We often need to reference release numbers in the documentation. For example, Ubuntu package installation guide . In this guide, the following command is documented: wget https://github.com/JanssenProject/jans/releases/download/v1.1.4/jans_1.1.4.ubuntu20.04_amd64.deb -P /tmp Above command contains references to the release number at two places. v1.1.4 in the URL and 1.1.4 as part of the file name. There are many such places throughout the documentation when release numbers need to be mentioned. Whenever we make a new release, these numbers need to change as they point to the latest release number. This becomes a manual task. To avoid this manual, error-prone approach the Janssen Project uses a release marker, 0.0.0-nightly instead of writing actual release numbers in the head (latest) documentation branch. So, when there is a need to mention the release number, instead of writing the actual release number, use the release marker. Let's see how to document the above command (at the head version) so that it stays up-to-date release after release. wget https://github.com/JanssenProject/jans/releases/download/nightly/jans_0.0.0-nightly.ubuntu20.04_amd64.deb -P /tmp Warning head version of documentation may contain the release marker at various places. URLs, commands etc. So, URLs, and commands might not work as it is. Users will have to manually replace the marker or use the most recent stable release documentation. Release marker should be used only when contributing to the latest documentation. Not when updating documentation for previous releases. General Text # Allow long lines to wrap, rather than manually breaking them. For example, the Introduction paragraph is a single line Keep explanations short and clear Use complete sentences when possible To make text italicised , put an _ on each side, like this: _word_ To bold text, put a double * on each end, like this: **word** Leave a blank line between paragraphs. Count a header as a paragraph for this purpose Avoid passive voice as much as possible. It's clearer to say that a subject does something than to say a result was done Avoid using you in statements as much as possible. For example, instead of saying You can navigate to... simply say Navigate to... Page Setup # Start your page with a title on the first line Follow with a concise overview of the document / product's purpose Organize the information in the document from least technical to most technical if possible. Start conceptual, then get detailed Lists # Leave a blank line between text and first item in the list Only use a numbered list if the order of the list matters A line of a list should not end with a period. If it's multiple sentences, like this one, drop the last period Start each item in the list with a capital letter End each item in the list with at least three spaces. This makes sure the line breaks properly To make a bulleted list, start each line with - To make a numbered list, start each line with 1. For example: 1. This is the first item 1. This is the second item 1. This is the third item It will look like this: 1. This is the first item 2. This is the second item 3. This is the third item To include additional lines in a list item, start the sub-line with four spaces. For example: 1. This is the first item in a list There are four spaces to start this line Another four spaces here This keeps all text inside the numbered list item, before starting... 1. The following list item It will look like this: This is the first item in a list There are four spaces to start this line Another four spaces here This keeps all text inside the list, before starting... The following list item Other formatting considerations # Admonitions cannot be nested inside a list. They must be aligned all the way left. Inserting them within a list will break the list sequence (starting back over from 1). Nesting a fenced block of code in a numbered list is more challenging, as the list and code block syntaxes clash. To nest a code block into a list, insert four spaces to the left of all lines of the formatting. For example: 1. This is the first item ``` This is code This is also code. ``` 1. This is the second item It will look like this: This is the first item This is code This is also code. This is the second item Headings # Headings should be in title format. All important words should be capitalized The main title of the page should start with a single # , then each level of subheading should add one. For example, the first subheading should start with ## , a subheading of that should use ### , and so on Code Formatting # To format text as code within a line of normal text, surround the code with a single backtick (`). If the code is to be on its own line, it should be a fenced code block. To make a fenced code block, make a line before and after the code with three backticks: ``` This is code ``` We use the SuperFences plugin to enhance this functionality. Examples & Navigation # When possible, provide an example in the form of code output or a screenshot To instruct a user to click a button, or navigate to a certain page or through a menu, use the following style: Navigate to `Configuration` > `Authentication` and click the `Passport` tab It will look like this: Navigate to Configuration > Authentication and click the Passport tab Linking # We recommend using relative linking syntax when linking to other artifacts in repository. Linking to a page within the same repo use this format: [text for the link](../where/the/link/goes.md) - You must link to the .md file on GitHub for it to work properly - As an example, to make text this link link to a Markdown document named example.md in the same directory, you'd type it as [this link](./example.md) Service Commands # The Janssen Server supports many different Operating Systems (e.g. Ubuntu, SUSE etc.). Service commands can vary. Rather than \"hard coding\" service commands into documentation, please instead reference the dedicated documentation page for Service Commands . In documenting a process that involves a service restart, the Service Command documentation is linked: ## Add the attribute to MySQL - Add custom attribute - [Restart](https://jans.io/docs/vm-ops/restarting-services/) the `jans-auth.service` service. The word Restart is simply linked to the dedicated doc for Service Commands. Tables # Try to make tables visually readable by spacing to make distinct columns The header for each column must be separated by at least three dashes Use outer pipes for consistency If an entry is too long to fit in the neat boxes, that's fine, just try to keep it legible An example table follows: |This |Is |A |Table | |--------|-------|------|---------| |1 |2 |3 |4 | |Word |Code |Text |Table | It looks like this: This Is A Table 1 2 3 4 Word Code Text Table Help On Technical Writing # It is essential for everyone in the community to actively participate in the documentation. At the same time, not everyone is formally trained or experienced in writing technical documents. To help everyone understand the basics of good technical writing, we have listed a few resources below. Going through these resources will not take a lot of time and will help in writing better technical documents. Introduction to Technical Writing (part-1) Introduction to Technical Writing (part-2) Contribution Workflow # Find something to work on # Best place to find something to work on is to look at currently open issues . If you are a first time contributor then starting with list of good first issues is best. Start a discussion # Start a Github Discussion about what you are planning to contribute. Explain the feature or issue that you are planning to contribute and what your solution or implementation approach. Janssen is a community driven project and it'll be helpful to get community's view about it. Create an issue # Take your time to write a proper issue including a good summary and description. Outcome of Github discussion about your contribution can help you create good content for the issue. As a first step when creating a new issue, an issue template has to be selected. Select appropriate issue template and it'll help you create an issue with right content. Remember that issue may be the first thing a reviewer of your PR will look at to get an idea of what you are proposing. It will also be used by the community in the future to find about what new features and enhancements are included in new releases. Implement the change # All contributions to Janssen Project should be made via Github pull requests(PR). New to PR workflow?? Learn and practice it at first-contributions Create a Fork # Fork Janssen repository . And create a clone. Implement the Change # Start working on changes as required. Make sure the code conventions are being followed. Use static code analysis and linting tools to make sure the code is high-quality. Write tests first and then code. Ensure that integration tests that cover your code are appropriately updated and reviewed. Create PR early and push often. Janssen uses Github actions to run automated checks on PR changes. Ensure that these checks are passing with every push. Engage PR reviewers at the start so that they can continue to reivew code as it is developed and in small chunks. For a change that is non-trivial(an enhancement or a new feature), design should be reviewed. This should be done via PR by adding appropriate code owners. Document # PR should include changes in relevant documentation along with code changes. PR is checked by bot to have either one of the following : A commit that follows commit guidelines with docs: message Changes in artifacts under jans/docs If PR does not need any documentation changes, then the developer needs to acknowledge that in one of two ways: Add an empty commit to the PR (using --allow-empty git flag) with docs: message (i.e docs: no doc changes required ) Add footer to the commit message of one of the code commits with docs: message e.g fix: typo on class name More details here. docs: no docs modification Raise a PR # Make sure that PR title follows these guidelines Janssen uses Github PR template. Template provides helpful instructions to ensure new PRs are complete in details and easy to review. Github will populate new PR's description with these instructions. You can edit PR description as per your requirements. When PR is raised, Github will automatically assign reviewer to the PR based changed files and CODEOWNERS list. Once PR is raised, ensure that PR passes all the mandatory Github actions checks available on Github PR page. Github will not allow PR to be merged if any of the mandatory check is failing. Follow Through # Once the PR is raised, wait for reviewers to start review. Reviewers will start review at the first opportunity available. If you want to draw attention, give a gentle reminder in PR comments. But please be patient. Follow activities on your PR closely till the time PR is merged. PR reviewer may want to suggest a change or may need to ask a question to get more clarity. Make sure you are actively collaborating. Once Reviewer has completed the review and approved the changes, the PR will be merged. Thats it!! Congratulations on successful contribution. \ud83e\udd73 \ud83e\udd1f", "title": "Contribution Guidelines"}, {"location": "CONTRIBUTING/#contributing-to-janssen-project", "text": "Purpose of this guide is to provide necessary information and resources to community in order to make successful contribution to the Janssen Project. There are many ways you can contribute. Of course you can contribute code. But we also need people to write documentation and guides, to help us with testing, to answer questions on the forums and chat, to review PR's, to help us with devops and CI/CD, to provide feedback on usability, and to promote the project through outreach. Also, by sharing metrics with us, we can gain valuable insights into how the software performs in the wild. Join the Community First Time Contributors Contribution Guidelines Code of Conduct About Issues Triaging Code Conventions and Guidelines Commits Branches PRs Issues Contributing to the documentation Contribution Workflow Find Something To Work On Start a Discussion Implement the Change Document Raise a PR Follow Through", "title": "Contributing to Janssen Project"}, {"location": "CONTRIBUTING/#join-the-community", "text": "Repo : Watch and Star Janssen repository on Github Discussions : Join interesting discussions at Github Discussions Chat : We have an active community chat on Gitter . You can register for free their with your Github identity. Tweet : Janssen is on Twitter too. Follow us there to stay up to date on release announcements and news around Janssen.", "title": "Join the Community"}, {"location": "CONTRIBUTING/#first-time-contributors", "text": "In case you are first-time contributor, then you can start with our good first issues list These are issues where you can easily contribute and community members will guide and support your contribution as always. If you need Janssen installation to test out your fix, here are the steps .", "title": "First Time Contributors"}, {"location": "CONTRIBUTING/#contribution-guidelines", "text": "We are really glad you are reading this, because we need volunteer developers to help this project come to fruition. Code of Conduct Issues Triaging Coding Conventions", "title": "Contribution Guidelines"}, {"location": "CONTRIBUTING/#code-of-conduct", "text": "Janssen project has a Code of Conduct to which all contributors must adhere, please read it before interacting with the repository or the community in any way.", "title": "Code of Conduct"}, {"location": "CONTRIBUTING/#about-issues", "text": "There are four kinds of issues you can open: Bug report : you believe you found a problem in a project and you want to discuss and get it fixed, creating an issue with the bug report template is the best way to do so. Feature Request : any kind of new feature need to be discussed in this kind of issue, do you want a new rule or a new feature? This is the kind of issue you want to open. Be very good at explaining your intent, it's always important that others can understand what you mean in order to discuss, be open and collaborative in letting others help you getting this done! Security Vulnerability : If you identify a security problem, please report it immediately, providing details about the nature, and if applicable, how to reproduce it. If you want to report an issue privately, you can email security@gluu.org Failing tests : you noticed a flaky test or a problem with a build? This is the kind of issue to triage that! The best way to get involved in the project is through issues, you can help in many ways: Issues triaging: participating in the discussion and adding details to open issues is always a good thing, sometimes issues need to be verified, you could be the one writing a test case to fix a bug! Fix an issue: you can help in getting issue fixed in many ways. More often by opening a pull request. In case you are first-time contributor, then you can start with our good first issues list These are issues where you can easily contribute and community members will guide and support your contribution as always.", "title": "About Issues"}, {"location": "CONTRIBUTING/#triaging", "text": "Triage is a process of evaluating issues and PRs in order to determine their characteristics and take quick actions if possible. When you triage an issue, you: assess whether it has merit or not quickly close it by correctly answering a question point the reporter to a resource or documentation answering the issue tag it via labels, projects, or milestones take ownership submitting a PR for it, in case you want \ud83d\ude07 Here is how we continously triage new issues and PRs so that contributors can contribute faster and better.", "title": "Triaging"}, {"location": "CONTRIBUTING/#code-conventions-and-guidelines", "text": "", "title": "Code Conventions and Guidelines"}, {"location": "CONTRIBUTING/#commits", "text": "Janssen Project mandates all commits to follow guidelines as below. Commit messages As commit convention, we adopt Conventional Commits v1.0.0 , we have an history of commits that do not adopt the convention but any new commit must follow it to be eligible for merge. Add GPG signature to your commit To ensure that contribution is coming for a trusted source, all commits should be signed using GPG key and verified by Github. If you have GPG key setup already then just use -S switch with you commit to sign it. If you need to setup your GPG key and verification, then you can find detailed instructions here Add DCO sign-off The Developer Certificate of Origin (DCO) is a lightweight way for contributors to certify that they wrote or otherwise have the right to submit the code they are contributing to the project. Contributors to the Janssen project sign-off that they adhere to these requirements by adding a Signed-off-by line to commit messages. This is a commit message Signed-off-by: Foo Bar Git even has a -s command line option to append this automatically to your commit message: $ git commit -s -m 'This is my commit message' In all, if you have your GPG verification setup, your commit command should look like git commit -S -s -m 'message that follows conventional commit style'", "title": "Commits"}, {"location": "CONTRIBUTING/#branches", "text": "Branch name should have component name as prefix, eg jans-core-mybranch", "title": "Branches"}, {"location": "CONTRIBUTING/#prs", "text": "PR titles should also follow Conventional Commits v1.0.0 . This will help in keeping merge commit messages inline with commit message standards Squash commits into small number of cohesive commits before raising a PR PR should be rebased on main branch so that there are minimal or no conflicts at the time of merge PR should only have changes related to target feature or issue. Create a separate PR for formatting or other quick bug fixes PR should include relevent documentaton changes PR should include unit and integration tests", "title": "PRs"}, {"location": "CONTRIBUTING/#issues", "text": "Issue titles should follow Conventional Commits v1.0.0", "title": "Issues"}, {"location": "CONTRIBUTING/#backport-changes-to-a-different-version", "text": "Backport changes are now supported through a workflow through labels prefixed with backport/ . For-example to backport changes in a certain PR to version v1.0.0 a label to that PR matching the version must be added i.e backport/v1.0.0 . The flow consists of creating a new branch, cherry-picking the changes of the original PR and creating a new PR to merge them.", "title": "Backport changes to a different version"}, {"location": "CONTRIBUTING/#license-header", "text": "The Janssen Project uses Apache-2.0 license. Any existing or new code file has to start with the license header as shown below: /* * This software is available under the Apache-2.0 license. * See https://www.apache.org/licenses/LICENSE-2.0.txt for full text. * * Copyright (c) 2024, Gluu, Inc. */ If the developers sign a CLA(Contributor License Agreement) they can retain the copyright. Once the CLA has been signed, contributions can be accepted from the contributor with the License header as below. Make sure to replace [github-username] with contributor's GitHub username: /* * This software is available under the Apache-2.0 license. * See https://www.apache.org/licenses/LICENSE-2.0.txt for full text. * * Copyright (c) 2024, [github-username]. */", "title": "License Header"}, {"location": "CONTRIBUTING/#signing-the-cla", "text": "The current version of CLA can be found here . This is just for your reference. This same CLA will be signed digitally by following the steps below: The contributor sends an e-mail expressing willingness to contribute and sign the CLA. In the email, mention your GitHub account username from which the contributions will be made. If contributions will be made on behalf of an organization, then along with the GitHub username, mention the job title and organization's name in the email. Contributor receives an email with CLA and instructions on how to sign digitally. Follow the instructions and complete the signing process.", "title": "Signing the CLA"}, {"location": "CONTRIBUTING/#contributing-to-the-documentation", "text": "Great documentation is a reflection of software's maturity and the great community that stands behind it. Contributing to the Janssen Project documentation is the easiest way to learn about the Janssen Project and to get involved in the community process. In order to ensure consistency of style, language, format, and terminology across all documents, please follow the guidelines below:", "title": "Contributing to the documentation"}, {"location": "CONTRIBUTING/#glossary-of-terms", "text": "This glossary helps to keep terms and their meanings consistent across documentation. Janssen Project or Jans : Refers to the official project name under Linux Foundation that seeks to build the world\u2019s fastest and most comprehensive cloud native identity and access management software platform Janssen Server : Refers to a set of software components developed under the Janssen Project . Components of the Janssen Server include client and server implementations of the OAuth, OpenID Connect, SCIM and FIDO standards. The term Janssen Server is used to refer to these components as a group. jans-auth-server : Refers to a module within the Janssen Server named jans-auth-server . This is one of the significant modules of the Janssen Server that has an implementation for OAuth and OpenId Connect. Janssen Server module names: For correct naming of other modules of the Janssen Server, please refer to README", "title": "Glossary of terms"}, {"location": "CONTRIBUTING/#documentation-style-guide", "text": "Janssen Project documentation uses Markdown. Guidelines below are intended to bring consistency in writing and formatting documents. Testing Janssen Project documentation site is published using MkDocs. Markdown parsers used by Github and the one used by MkDocs may have slight variations in how they generate HTML. So, for a small number of cases, document may look different between Github and Janssen Project documentation site . Hence it is critical to test documentation changes locally before pushing to repository. This will ensure that final HTML rendering of documents by MkDocs is as desired.", "title": "Documentation Style Guide"}, {"location": "CONTRIBUTING/#document-title", "text": "The document title summarises what the document aims to achieve and at the same time, it plays a critical role in making the document easy to find via search. Below are a few guidelines to write good titles for documents. Every document must start with a title. Meaning, # Title should summarise what the document is trying to achieve. For examples: Integrating with the Apache mod_auth_openidc module , Integrating DUO's Universal Prompt as an authentication method , Install using Ubuntu Linux Package Title should include its context. For example, the document under Installation > VM Installation > Ubuntu should not be titled as just Ubuntu but it should have a more detailed title similar to Install using Ubuntu Linux Package . When required, to keep the title from becoming too long, assume that Janssen Server is already understood as context. Titles should be written using title case", "title": "Document Title"}, {"location": "CONTRIBUTING/#document-tags", "text": "Janssen Project documentation uses tags to make the search more accurate and add context to search results. Following are guidelines and examples to follow while adding tags to a document. Maximum 6 tags First three should establish the context of the section hierarchy under which the document belongs. See the example below. Remaining tags can be based on the content of the document. Each tag should be a single word (no spaces, hyphens or commas, etc) All tags should be in lowercase Example: Let's look at how to add tags to a document that is located on documentation site at path Administration -> Installation -> VM installation . Also, assume that the document describes the steps to install Janssen Project on the Ubuntu platform. Tags below would be recommended: --- ta gs : - admi n is trat io n - i nstallat io n - vm - ubu ntu ---", "title": "Document Tags"}, {"location": "CONTRIBUTING/#referencing-janssen-project-release-in-documents", "text": "We often need to reference release numbers in the documentation. For example, Ubuntu package installation guide . In this guide, the following command is documented: wget https://github.com/JanssenProject/jans/releases/download/v1.1.4/jans_1.1.4.ubuntu20.04_amd64.deb -P /tmp Above command contains references to the release number at two places. v1.1.4 in the URL and 1.1.4 as part of the file name. There are many such places throughout the documentation when release numbers need to be mentioned. Whenever we make a new release, these numbers need to change as they point to the latest release number. This becomes a manual task. To avoid this manual, error-prone approach the Janssen Project uses a release marker, 0.0.0-nightly instead of writing actual release numbers in the head (latest) documentation branch. So, when there is a need to mention the release number, instead of writing the actual release number, use the release marker. Let's see how to document the above command (at the head version) so that it stays up-to-date release after release. wget https://github.com/JanssenProject/jans/releases/download/nightly/jans_0.0.0-nightly.ubuntu20.04_amd64.deb -P /tmp Warning head version of documentation may contain the release marker at various places. URLs, commands etc. So, URLs, and commands might not work as it is. Users will have to manually replace the marker or use the most recent stable release documentation. Release marker should be used only when contributing to the latest documentation. Not when updating documentation for previous releases.", "title": "Referencing Janssen Project Release in Documents"}, {"location": "CONTRIBUTING/#general-text", "text": "Allow long lines to wrap, rather than manually breaking them. For example, the Introduction paragraph is a single line Keep explanations short and clear Use complete sentences when possible To make text italicised , put an _ on each side, like this: _word_ To bold text, put a double * on each end, like this: **word** Leave a blank line between paragraphs. Count a header as a paragraph for this purpose Avoid passive voice as much as possible. It's clearer to say that a subject does something than to say a result was done Avoid using you in statements as much as possible. For example, instead of saying You can navigate to... simply say Navigate to...", "title": "General Text"}, {"location": "CONTRIBUTING/#page-setup", "text": "Start your page with a title on the first line Follow with a concise overview of the document / product's purpose Organize the information in the document from least technical to most technical if possible. Start conceptual, then get detailed", "title": "Page Setup"}, {"location": "CONTRIBUTING/#lists", "text": "Leave a blank line between text and first item in the list Only use a numbered list if the order of the list matters A line of a list should not end with a period. If it's multiple sentences, like this one, drop the last period Start each item in the list with a capital letter End each item in the list with at least three spaces. This makes sure the line breaks properly To make a bulleted list, start each line with - To make a numbered list, start each line with 1. For example: 1. This is the first item 1. This is the second item 1. This is the third item It will look like this: 1. This is the first item 2. This is the second item 3. This is the third item To include additional lines in a list item, start the sub-line with four spaces. For example: 1. This is the first item in a list There are four spaces to start this line Another four spaces here This keeps all text inside the numbered list item, before starting... 1. The following list item It will look like this: This is the first item in a list There are four spaces to start this line Another four spaces here This keeps all text inside the list, before starting... The following list item", "title": "Lists"}, {"location": "CONTRIBUTING/#other-formatting-considerations", "text": "Admonitions cannot be nested inside a list. They must be aligned all the way left. Inserting them within a list will break the list sequence (starting back over from 1). Nesting a fenced block of code in a numbered list is more challenging, as the list and code block syntaxes clash. To nest a code block into a list, insert four spaces to the left of all lines of the formatting. For example: 1. This is the first item ``` This is code This is also code. ``` 1. This is the second item It will look like this: This is the first item This is code This is also code. This is the second item", "title": "Other formatting considerations"}, {"location": "CONTRIBUTING/#headings", "text": "Headings should be in title format. All important words should be capitalized The main title of the page should start with a single # , then each level of subheading should add one. For example, the first subheading should start with ## , a subheading of that should use ### , and so on", "title": "Headings"}, {"location": "CONTRIBUTING/#code-formatting", "text": "To format text as code within a line of normal text, surround the code with a single backtick (`). If the code is to be on its own line, it should be a fenced code block. To make a fenced code block, make a line before and after the code with three backticks: ``` This is code ``` We use the SuperFences plugin to enhance this functionality.", "title": "Code Formatting"}, {"location": "CONTRIBUTING/#examples-navigation", "text": "When possible, provide an example in the form of code output or a screenshot To instruct a user to click a button, or navigate to a certain page or through a menu, use the following style: Navigate to `Configuration` > `Authentication` and click the `Passport` tab It will look like this: Navigate to Configuration > Authentication and click the Passport tab", "title": "Examples & Navigation"}, {"location": "CONTRIBUTING/#linking", "text": "We recommend using relative linking syntax when linking to other artifacts in repository. Linking to a page within the same repo use this format: [text for the link](../where/the/link/goes.md) - You must link to the .md file on GitHub for it to work properly - As an example, to make text this link link to a Markdown document named example.md in the same directory, you'd type it as [this link](./example.md)", "title": "Linking"}, {"location": "CONTRIBUTING/#service-commands", "text": "The Janssen Server supports many different Operating Systems (e.g. Ubuntu, SUSE etc.). Service commands can vary. Rather than \"hard coding\" service commands into documentation, please instead reference the dedicated documentation page for Service Commands . In documenting a process that involves a service restart, the Service Command documentation is linked: ## Add the attribute to MySQL - Add custom attribute - [Restart](https://jans.io/docs/vm-ops/restarting-services/) the `jans-auth.service` service. The word Restart is simply linked to the dedicated doc for Service Commands.", "title": "Service Commands"}, {"location": "CONTRIBUTING/#tables", "text": "Try to make tables visually readable by spacing to make distinct columns The header for each column must be separated by at least three dashes Use outer pipes for consistency If an entry is too long to fit in the neat boxes, that's fine, just try to keep it legible An example table follows: |This |Is |A |Table | |--------|-------|------|---------| |1 |2 |3 |4 | |Word |Code |Text |Table | It looks like this: This Is A Table 1 2 3 4 Word Code Text Table", "title": "Tables"}, {"location": "CONTRIBUTING/#help-on-technical-writing", "text": "It is essential for everyone in the community to actively participate in the documentation. At the same time, not everyone is formally trained or experienced in writing technical documents. To help everyone understand the basics of good technical writing, we have listed a few resources below. Going through these resources will not take a lot of time and will help in writing better technical documents. Introduction to Technical Writing (part-1) Introduction to Technical Writing (part-2)", "title": "Help On Technical Writing"}, {"location": "CONTRIBUTING/#contribution-workflow", "text": "", "title": "Contribution Workflow"}, {"location": "CONTRIBUTING/#find-something-to-work-on", "text": "Best place to find something to work on is to look at currently open issues . If you are a first time contributor then starting with list of good first issues is best.", "title": "Find something to work on"}, {"location": "CONTRIBUTING/#start-a-discussion", "text": "Start a Github Discussion about what you are planning to contribute. Explain the feature or issue that you are planning to contribute and what your solution or implementation approach. Janssen is a community driven project and it'll be helpful to get community's view about it.", "title": "Start a discussion"}, {"location": "CONTRIBUTING/#create-an-issue", "text": "Take your time to write a proper issue including a good summary and description. Outcome of Github discussion about your contribution can help you create good content for the issue. As a first step when creating a new issue, an issue template has to be selected. Select appropriate issue template and it'll help you create an issue with right content. Remember that issue may be the first thing a reviewer of your PR will look at to get an idea of what you are proposing. It will also be used by the community in the future to find about what new features and enhancements are included in new releases.", "title": "Create an issue"}, {"location": "CONTRIBUTING/#implement-the-change", "text": "All contributions to Janssen Project should be made via Github pull requests(PR). New to PR workflow?? Learn and practice it at first-contributions", "title": "Implement the change"}, {"location": "CONTRIBUTING/#create-a-fork", "text": "Fork Janssen repository . And create a clone.", "title": "Create a Fork"}, {"location": "CONTRIBUTING/#implement-the-change_1", "text": "Start working on changes as required. Make sure the code conventions are being followed. Use static code analysis and linting tools to make sure the code is high-quality. Write tests first and then code. Ensure that integration tests that cover your code are appropriately updated and reviewed. Create PR early and push often. Janssen uses Github actions to run automated checks on PR changes. Ensure that these checks are passing with every push. Engage PR reviewers at the start so that they can continue to reivew code as it is developed and in small chunks. For a change that is non-trivial(an enhancement or a new feature), design should be reviewed. This should be done via PR by adding appropriate code owners.", "title": "Implement the Change"}, {"location": "CONTRIBUTING/#document", "text": "PR should include changes in relevant documentation along with code changes. PR is checked by bot to have either one of the following : A commit that follows commit guidelines with docs: message Changes in artifacts under jans/docs If PR does not need any documentation changes, then the developer needs to acknowledge that in one of two ways: Add an empty commit to the PR (using --allow-empty git flag) with docs: message (i.e docs: no doc changes required ) Add footer to the commit message of one of the code commits with docs: message e.g fix: typo on class name More details here. docs: no docs modification", "title": "Document"}, {"location": "CONTRIBUTING/#raise-a-pr", "text": "Make sure that PR title follows these guidelines Janssen uses Github PR template. Template provides helpful instructions to ensure new PRs are complete in details and easy to review. Github will populate new PR's description with these instructions. You can edit PR description as per your requirements. When PR is raised, Github will automatically assign reviewer to the PR based changed files and CODEOWNERS list. Once PR is raised, ensure that PR passes all the mandatory Github actions checks available on Github PR page. Github will not allow PR to be merged if any of the mandatory check is failing.", "title": "Raise a PR"}, {"location": "CONTRIBUTING/#follow-through", "text": "Once the PR is raised, wait for reviewers to start review. Reviewers will start review at the first opportunity available. If you want to draw attention, give a gentle reminder in PR comments. But please be patient. Follow activities on your PR closely till the time PR is merged. PR reviewer may want to suggest a change or may need to ask a question to get more clarity. Make sure you are actively collaborating. Once Reviewer has completed the review and approved the changes, the PR will be merged. Thats it!! Congratulations on successful contribution. \ud83e\udd73 \ud83e\udd1f", "title": "Follow Through"}, {"location": "agama/execution-rules/", "tags": ["administration", "developer", "agama"], "text": "Flows execution rules # This document regards flow execution details. Engines implementing the Agama framework must account these aspects fully. Important The concept of \" top-level \" flow is used in several places throughout this page. It refers to a flow which has been directly launched from the user browser and hence has no parents (no callers). Flows lifecycle # From a programming perspective, a flow is a lot like a function or subroutine in a regular program. Once a flow is triggered, it must be executed from top to bottom until a Finish statement is encountered. There are no special requirements on flow initialization or flow structure either. In some cases, the Finish instruction is not reached because the flow: has crashed has been cancelled has timed out More on these conditions below. Otherwise, the flow is said to have finished and depending on the actual arguments passed to Finish , it can be said the flow finished successfully or the flow failed . Successful flows # When a flow finishes successfully, control returns to the caller (parent flow) and execution continues. In the case of a top-level flow, it is up to the concrete engine what to do next. Normally, the arguments passed to the Finish directive will drive the specific behavior, which could for instance authenticate a person. Failed flows # When a flow fails, control returns to the caller (parent flow) and execution continues. In the case of a top-level flow, it is up to the concrete engine what to do next. Displaying an error page would be generally appropriate. The arguments passed to the Finish directive could be of use here. Crashed flows # A flow is said to have crashed if any of the below occur: Invalid code (syntactically wrong) was tried to be executed The last instruction was reached and Finish was not encountered An attempt to access a property or index of a null variable was made The invocation of a foreign routine, i.e. through Call , raised an error condition, and the error was not caught Any unexpected runtime error was raised When a flow crashes, the caller flow (if any) is said to have crashed too if it did not catch the given error. This rule applies recursively until the top-level flow is reached. When a top-level flow crashes, engines must: Show an error with a concise descriptive error description Append a fuller error message to whatever logging system is in place Terminate the flow execution to allow the user start again the flow later in a safe manner Flows timeout # The Timeout directive specifies a maximum allowable execution time for a top-level flow. When a flow exceeds this execution time, engines should display an error page accordingly. Cancelled flows # Cancellation allows a flow to early interrupt the execution of a given subflow thus enabling the implementation of alternative routing without the need of re-writing subflows. It can only take place upon the execution of a given RRF instruction part of a subflow that has been Trigger ed. This feature is better understood via examples - note the link provided is specific to the Janssen Server engine only. Other engines may implement cancellation in a different way, the only requirement is to preserve the convention that the returned value of a cancelled flow must be of the form: { aborted: true, data: ..., url: ... } . Launching flows # Engines must provide specific mechanisms to launch a given flow in the user's browser and document how to pass input parameters to it and the formats allowed. Logging # Engines must maintain at least one logging destination (file, stream, etc.) to accumulate the messages passed in Log directives. Additionally, it should advertise the logging levels supported, their abbreviations if any, and the default logging level. RFAC and Callback URL # Engines must provide and maintain a fixed single URL that \"users\" of RFAC can supply to external systems in order to implement integrations with third-party sites that employ browser redirections. This URL should only be available for a given browser session while RFAC is in execution. Once the callback is visited or the flow times out (whichever occurs first), subsequent requests will respond with an HTTP 404 error. The mechanism used by the engine to make the redirect to the external site is implementation specific. Assets management # Engines must have an internal mechanism to store assets following a hierarchical (filesystem-like) structure. Such structure must have a defined \"root\" that in conjunction with a flow Basepath will allow the engine to resolve (locate) the paths to specific flow assets. Engines may support one or more templating technologies and file formats for rendering the UI pages. Foreign calls # Languages support # At least one programming language should be supported by an engine. This feature is critical because Agama DSL was designed to force developers use a distinct, more powerful language when the task at hand cannot be implemented by simple data manipulation or comparison of values. Routines lookup # Engines should define a clear mechanism to lookup the specific routine to be invoked when using the Call directive. Actually, the syntax of Call fits well into an object-oriented style. The table bellow illustrates this fact: Example Potential semantics Call a B c d On object instance a , invoke method B passing c and d as parameters Call x.y.z#S d Invoke method S belonging to class x.y.z passing d as parameter. This variant maps to a \"static\" method invocation, where S does not require a specific instance to run on In OOP, it is not uncommon to have a method S with several different signatures. The lookup mechanism should account disambiguation techniques, if possible. Errors # In the execution of the call, if an error occurs, the engine should raise an error catchable in Agama code. The structure or data type of this error is an engine-specific detail. Ideally the error should be easily inspected in Agama code so any required further processing is feasible in a flow. Types compatibility # The arguments conversion/compatibility is also an important topic. Most likely Agama types will not match the (foreign) target language types. This means passing a \"native\" Agama value as parameter in a method Call requires some form of compatibility with the target type in the routine (method) signature. When compatibility does not make sense, seems too complex, or impossible, invocation should \"crash\" by raising some form of error. The same analysis has to be done in the other direction: from the target language to Agama. This is for the case where the Call returns a value. Such value should be \"manipulable\" in Agama code. Other considerations # Engine implementers may consider to offer the ability for developers to supply routines without the need of engine restarts. This aims for an agile development experience.", "title": "Execution rules"}, {"location": "agama/execution-rules/#flows-execution-rules", "text": "This document regards flow execution details. Engines implementing the Agama framework must account these aspects fully. Important The concept of \" top-level \" flow is used in several places throughout this page. It refers to a flow which has been directly launched from the user browser and hence has no parents (no callers).", "title": "Flows execution rules"}, {"location": "agama/execution-rules/#flows-lifecycle", "text": "From a programming perspective, a flow is a lot like a function or subroutine in a regular program. Once a flow is triggered, it must be executed from top to bottom until a Finish statement is encountered. There are no special requirements on flow initialization or flow structure either. In some cases, the Finish instruction is not reached because the flow: has crashed has been cancelled has timed out More on these conditions below. Otherwise, the flow is said to have finished and depending on the actual arguments passed to Finish , it can be said the flow finished successfully or the flow failed .", "title": "Flows lifecycle"}, {"location": "agama/execution-rules/#successful-flows", "text": "When a flow finishes successfully, control returns to the caller (parent flow) and execution continues. In the case of a top-level flow, it is up to the concrete engine what to do next. Normally, the arguments passed to the Finish directive will drive the specific behavior, which could for instance authenticate a person.", "title": "Successful flows"}, {"location": "agama/execution-rules/#failed-flows", "text": "When a flow fails, control returns to the caller (parent flow) and execution continues. In the case of a top-level flow, it is up to the concrete engine what to do next. Displaying an error page would be generally appropriate. The arguments passed to the Finish directive could be of use here.", "title": "Failed flows"}, {"location": "agama/execution-rules/#crashed-flows", "text": "A flow is said to have crashed if any of the below occur: Invalid code (syntactically wrong) was tried to be executed The last instruction was reached and Finish was not encountered An attempt to access a property or index of a null variable was made The invocation of a foreign routine, i.e. through Call , raised an error condition, and the error was not caught Any unexpected runtime error was raised When a flow crashes, the caller flow (if any) is said to have crashed too if it did not catch the given error. This rule applies recursively until the top-level flow is reached. When a top-level flow crashes, engines must: Show an error with a concise descriptive error description Append a fuller error message to whatever logging system is in place Terminate the flow execution to allow the user start again the flow later in a safe manner", "title": "Crashed flows"}, {"location": "agama/execution-rules/#flows-timeout", "text": "The Timeout directive specifies a maximum allowable execution time for a top-level flow. When a flow exceeds this execution time, engines should display an error page accordingly.", "title": "Flows timeout"}, {"location": "agama/execution-rules/#cancelled-flows", "text": "Cancellation allows a flow to early interrupt the execution of a given subflow thus enabling the implementation of alternative routing without the need of re-writing subflows. It can only take place upon the execution of a given RRF instruction part of a subflow that has been Trigger ed. This feature is better understood via examples - note the link provided is specific to the Janssen Server engine only. Other engines may implement cancellation in a different way, the only requirement is to preserve the convention that the returned value of a cancelled flow must be of the form: { aborted: true, data: ..., url: ... } .", "title": "Cancelled flows"}, {"location": "agama/execution-rules/#launching-flows", "text": "Engines must provide specific mechanisms to launch a given flow in the user's browser and document how to pass input parameters to it and the formats allowed.", "title": "Launching flows"}, {"location": "agama/execution-rules/#logging", "text": "Engines must maintain at least one logging destination (file, stream, etc.) to accumulate the messages passed in Log directives. Additionally, it should advertise the logging levels supported, their abbreviations if any, and the default logging level.", "title": "Logging"}, {"location": "agama/execution-rules/#rfac-and-callback-url", "text": "Engines must provide and maintain a fixed single URL that \"users\" of RFAC can supply to external systems in order to implement integrations with third-party sites that employ browser redirections. This URL should only be available for a given browser session while RFAC is in execution. Once the callback is visited or the flow times out (whichever occurs first), subsequent requests will respond with an HTTP 404 error. The mechanism used by the engine to make the redirect to the external site is implementation specific.", "title": "RFAC and Callback URL"}, {"location": "agama/execution-rules/#assets-management", "text": "Engines must have an internal mechanism to store assets following a hierarchical (filesystem-like) structure. Such structure must have a defined \"root\" that in conjunction with a flow Basepath will allow the engine to resolve (locate) the paths to specific flow assets. Engines may support one or more templating technologies and file formats for rendering the UI pages.", "title": "Assets management"}, {"location": "agama/execution-rules/#foreign-calls", "text": "", "title": "Foreign calls"}, {"location": "agama/execution-rules/#languages-support", "text": "At least one programming language should be supported by an engine. This feature is critical because Agama DSL was designed to force developers use a distinct, more powerful language when the task at hand cannot be implemented by simple data manipulation or comparison of values.", "title": "Languages support"}, {"location": "agama/execution-rules/#routines-lookup", "text": "Engines should define a clear mechanism to lookup the specific routine to be invoked when using the Call directive. Actually, the syntax of Call fits well into an object-oriented style. The table bellow illustrates this fact: Example Potential semantics Call a B c d On object instance a , invoke method B passing c and d as parameters Call x.y.z#S d Invoke method S belonging to class x.y.z passing d as parameter. This variant maps to a \"static\" method invocation, where S does not require a specific instance to run on In OOP, it is not uncommon to have a method S with several different signatures. The lookup mechanism should account disambiguation techniques, if possible.", "title": "Routines lookup"}, {"location": "agama/execution-rules/#errors", "text": "In the execution of the call, if an error occurs, the engine should raise an error catchable in Agama code. The structure or data type of this error is an engine-specific detail. Ideally the error should be easily inspected in Agama code so any required further processing is feasible in a flow.", "title": "Errors"}, {"location": "agama/execution-rules/#types-compatibility", "text": "The arguments conversion/compatibility is also an important topic. Most likely Agama types will not match the (foreign) target language types. This means passing a \"native\" Agama value as parameter in a method Call requires some form of compatibility with the target type in the routine (method) signature. When compatibility does not make sense, seems too complex, or impossible, invocation should \"crash\" by raising some form of error. The same analysis has to be done in the other direction: from the target language to Agama. This is for the case where the Call returns a value. Such value should be \"manipulable\" in Agama code.", "title": "Types compatibility"}, {"location": "agama/execution-rules/#other-considerations", "text": "Engine implementers may consider to offer the ability for developers to supply routines without the need of engine restarts. This aims for an agile development experience.", "title": "Other considerations"}, {"location": "agama/gama-format/", "tags": ["administration", "developer", "agama"], "text": "The .gama file format # In practice, a web flow will make use of a bunch of artifacts, like UI pages, images, stylesheets, and source code. Actually, to solve a real-world problem several flows are needed to be able to keep flexibility and complexity at acceptable levels. Here is where the concept project emerges. A project can be thought of as a container to hold all flows and related assets aimed at solving a particular problem - including metadata of the project itself. The idea of defining a standard way to specify projects brings several benefits: Provide a uniform conceptual scheme for community actors to interchange flows Provide Agama engine implementors common ground for the materialization of flows deployment Serve as reference for developers interested in coding tools such as an Agama IDE Anatomy of a project # The below shows the structure of an Agama project: \u251c\u2500\u2500 code/ \u251c\u2500\u2500 lib/ \u251c\u2500\u2500 web/ \u251c\u2500\u2500 project.json \u251c\u2500\u2500 LICENSE \u2514\u2500\u2500 README.md code directory holds all flows part of the project. Every flow - implemented in Agama language - has to reside in a separate file with extension flow and with file name matching the qualified name of the flow in question. This directory can have nested folders if desired lib may contain source code files in languages other than Agama and binary libraries required by the project, if any. Every engine can make use of the contents of this folder as needed web is expected to hold all UI templates plus required web assets (stylesheets, images, localization strings, etc.) that all flows in this project may use project.json file contains metadata about this project. More on this later README.md file may contain extra documentation in markdown format LICENSE file may contain legal-related information Except for code and web directories, all elements in the file structure above are optional. Note that files in web must follow a directory structure that is consistent with respect to Basepath and RRF directives found in the included flows. Metadata # project.json file is expected to contain metadata about the contents of the project in JSON format. Field Description data type projectName A unique name that will be associated to this project string version Project's version. It is recommended to use semantic versioning format string author A user handle that identifies the author of the project string license A reference to applicable license terms string description string configs Object containing exemplifying configuration properties for flows that may need them. The keys of this field, if any, are qualified flow names already part of the project json object noDirectLaunch An array holding zero or more qualified flow names. This list is used to prevent certain flows to be launched directly from a web browser. It's a security measure to avoid end-users triggering flows at will array All fields are optional and more can be added if desired. Below is an example of a project.json file: { \"projectName\": \"biometric-auth\", \"version\": \"2.0.3\", \"author\": \"avgJoe123\", \"license\": \"apache-2.0\", \"description\": \"Allows users to authenticate via fingerpint and/or iris recognition\", \"configs\": { \"com.acme.bio.IrisScan\": { \"prop1\": \"secret\", \"prop2\": { \"subprop\": [1, 2, 3] } } }, \"noDirectLaunch\": [ \"com.acme.bio.TraitExtractor\" ] } Important Use the configs section wisely: .gama files must not contain real configuration properties because these files may be freely distributed; in practice, configurations hold sensitive data that should not be exposed Sample project # As an example assume you want to deliver these two flows: Flow test Basepath \"hello\" in = { name: \"John\" } RRF \"templates/index.htm\" in Log \"Done!\" Finish \"john_doe\" Flow com.foods.sweet Basepath \"recipes/desserts\" ... choice = RRF \"selection.htm\" list = Call com.foods.RecipeUtils#retrieveIngredients choice.meal ... Here is how the project folder might look like: \u251c\u2500\u2500 code/ \u2502 \u2514\u2500\u2500 test.flow \u2502 \u2514\u2500\u2500 com.foods.sweet.flow \u251c\u2500\u2500 web/ \u2502 \u251c\u2500\u2500 hello/ | | \u2514\u2500\u2500 templates/ \u2502 | \u2514\u2500\u2500 index.htm \u2502 | \u2514\u2500\u2500 js/ \u2502 | \u2514\u2500\u2500 font-awesome.js | \u2514\u2500\u2500 recipes/ \u2502 \u2514\u2500\u2500 desserts/ \u2502 \u2514\u2500\u2500 selection.htm \u2502 \u2514\u2500\u2500 logo.png \u251c\u2500\u2500 lib/ \u2502 \u2514\u2500\u2500 com/ \u2502 \u2514\u2500\u2500 foods/ \u2502 \u2514\u2500\u2500 RecipeUtils.java \u2514\u2500\u2500 project.json .gama file # Dealing with a folder this way can be awkward for sharing and other tasks. Instead, if the project contents are compressed using the ZIP file format, we have what is known as .gama file. Thus, a .gama file is a project archive that can be shared and deployed to an Agama engine. Project deployment # The actual \"deployment\" of an Agama project is an engine-specific detail. Engines must offer mechanisms for administrators and developers to \"install\" .gama files.", "title": "gama format"}, {"location": "agama/gama-format/#the-gama-file-format", "text": "In practice, a web flow will make use of a bunch of artifacts, like UI pages, images, stylesheets, and source code. Actually, to solve a real-world problem several flows are needed to be able to keep flexibility and complexity at acceptable levels. Here is where the concept project emerges. A project can be thought of as a container to hold all flows and related assets aimed at solving a particular problem - including metadata of the project itself. The idea of defining a standard way to specify projects brings several benefits: Provide a uniform conceptual scheme for community actors to interchange flows Provide Agama engine implementors common ground for the materialization of flows deployment Serve as reference for developers interested in coding tools such as an Agama IDE", "title": "The .gama file format"}, {"location": "agama/gama-format/#anatomy-of-a-project", "text": "The below shows the structure of an Agama project: \u251c\u2500\u2500 code/ \u251c\u2500\u2500 lib/ \u251c\u2500\u2500 web/ \u251c\u2500\u2500 project.json \u251c\u2500\u2500 LICENSE \u2514\u2500\u2500 README.md code directory holds all flows part of the project. Every flow - implemented in Agama language - has to reside in a separate file with extension flow and with file name matching the qualified name of the flow in question. This directory can have nested folders if desired lib may contain source code files in languages other than Agama and binary libraries required by the project, if any. Every engine can make use of the contents of this folder as needed web is expected to hold all UI templates plus required web assets (stylesheets, images, localization strings, etc.) that all flows in this project may use project.json file contains metadata about this project. More on this later README.md file may contain extra documentation in markdown format LICENSE file may contain legal-related information Except for code and web directories, all elements in the file structure above are optional. Note that files in web must follow a directory structure that is consistent with respect to Basepath and RRF directives found in the included flows.", "title": "Anatomy of a project"}, {"location": "agama/gama-format/#metadata", "text": "project.json file is expected to contain metadata about the contents of the project in JSON format. Field Description data type projectName A unique name that will be associated to this project string version Project's version. It is recommended to use semantic versioning format string author A user handle that identifies the author of the project string license A reference to applicable license terms string description string configs Object containing exemplifying configuration properties for flows that may need them. The keys of this field, if any, are qualified flow names already part of the project json object noDirectLaunch An array holding zero or more qualified flow names. This list is used to prevent certain flows to be launched directly from a web browser. It's a security measure to avoid end-users triggering flows at will array All fields are optional and more can be added if desired. Below is an example of a project.json file: { \"projectName\": \"biometric-auth\", \"version\": \"2.0.3\", \"author\": \"avgJoe123\", \"license\": \"apache-2.0\", \"description\": \"Allows users to authenticate via fingerpint and/or iris recognition\", \"configs\": { \"com.acme.bio.IrisScan\": { \"prop1\": \"secret\", \"prop2\": { \"subprop\": [1, 2, 3] } } }, \"noDirectLaunch\": [ \"com.acme.bio.TraitExtractor\" ] } Important Use the configs section wisely: .gama files must not contain real configuration properties because these files may be freely distributed; in practice, configurations hold sensitive data that should not be exposed", "title": "Metadata"}, {"location": "agama/gama-format/#sample-project", "text": "As an example assume you want to deliver these two flows: Flow test Basepath \"hello\" in = { name: \"John\" } RRF \"templates/index.htm\" in Log \"Done!\" Finish \"john_doe\" Flow com.foods.sweet Basepath \"recipes/desserts\" ... choice = RRF \"selection.htm\" list = Call com.foods.RecipeUtils#retrieveIngredients choice.meal ... Here is how the project folder might look like: \u251c\u2500\u2500 code/ \u2502 \u2514\u2500\u2500 test.flow \u2502 \u2514\u2500\u2500 com.foods.sweet.flow \u251c\u2500\u2500 web/ \u2502 \u251c\u2500\u2500 hello/ | | \u2514\u2500\u2500 templates/ \u2502 | \u2514\u2500\u2500 index.htm \u2502 | \u2514\u2500\u2500 js/ \u2502 | \u2514\u2500\u2500 font-awesome.js | \u2514\u2500\u2500 recipes/ \u2502 \u2514\u2500\u2500 desserts/ \u2502 \u2514\u2500\u2500 selection.htm \u2502 \u2514\u2500\u2500 logo.png \u251c\u2500\u2500 lib/ \u2502 \u2514\u2500\u2500 com/ \u2502 \u2514\u2500\u2500 foods/ \u2502 \u2514\u2500\u2500 RecipeUtils.java \u2514\u2500\u2500 project.json", "title": "Sample project"}, {"location": "agama/gama-format/#gama-file", "text": "Dealing with a folder this way can be awkward for sharing and other tasks. Instead, if the project contents are compressed using the ZIP file format, we have what is known as .gama file. Thus, a .gama file is a project archive that can be shared and deployed to an Agama engine.", "title": ".gama file"}, {"location": "agama/gama-format/#project-deployment", "text": "The actual \"deployment\" of an Agama project is an engine-specific detail. Engines must offer mechanisms for administrators and developers to \"install\" .gama files.", "title": "Project deployment"}, {"location": "agama/introduction/", "tags": ["administration", "developer", "agama"], "text": "Agama overview # Agama is a framework that consists of: A DSL (domain-specific language) purposedly designed for writing web flows A set of rules that drive the behavior of such flows when they are executed The specification of a file format - known as .gama - useful for sharing Agama flows. Flows have the .flow file extension. Here, a web flow is understood as a process composed by one or more stages, where at each stage an actor - normally a person - provides some kind of data or response by using a web browser or similar client. Throughout the process only a single actor is involved. DSL # About the Agama language is worth to mention that: It helps depicting the structure of web flows in a natural way It is closer to human language than general-purpose programming languages It has a clean, concise, non-distracting syntax It has limited computational power by design, forcing computations to occur in a more formal, general-purpose language like Java, C++, etc. Intrinsic properties of the language include: It follows the imperative paradigm mainly and assumes a traditional sequential execution. It only makes use of a few declarative elements Flows can be treated as functions (reusable routines with well-defined inputs) It provides dedicated contructs for common patterns in web flows like: \"show a page\" and \"retrieve the data user provided in that page\" \"redirect a user to an external site\" and later \"retrieve the data provided at a callback URL\" It supports typical language elements like assignments, conditionals, loops, etc. Find the complete Agama DSL reference here . Behavioral rules of execution # These are aspects that concrete implementations of the framework must adhere to. Rules may include for instance: How and when a flow terminates If and how errors are handled in a flow How flows' assets, i.e. UI pages, images, stylesheets, etc., are organized or laid out How delegation of business logic execution occur in a language other than Agama A \"concrete implementation\" as referred above is known as an engine : a software component capable of running flows written in Agama DSL. More information on execution rules can be found here . .gama file format # Check this page for more information.", "title": "Introduction"}, {"location": "agama/introduction/#agama-overview", "text": "Agama is a framework that consists of: A DSL (domain-specific language) purposedly designed for writing web flows A set of rules that drive the behavior of such flows when they are executed The specification of a file format - known as .gama - useful for sharing Agama flows. Flows have the .flow file extension. Here, a web flow is understood as a process composed by one or more stages, where at each stage an actor - normally a person - provides some kind of data or response by using a web browser or similar client. Throughout the process only a single actor is involved.", "title": "Agama overview"}, {"location": "agama/introduction/#dsl", "text": "About the Agama language is worth to mention that: It helps depicting the structure of web flows in a natural way It is closer to human language than general-purpose programming languages It has a clean, concise, non-distracting syntax It has limited computational power by design, forcing computations to occur in a more formal, general-purpose language like Java, C++, etc. Intrinsic properties of the language include: It follows the imperative paradigm mainly and assumes a traditional sequential execution. It only makes use of a few declarative elements Flows can be treated as functions (reusable routines with well-defined inputs) It provides dedicated contructs for common patterns in web flows like: \"show a page\" and \"retrieve the data user provided in that page\" \"redirect a user to an external site\" and later \"retrieve the data provided at a callback URL\" It supports typical language elements like assignments, conditionals, loops, etc. Find the complete Agama DSL reference here .", "title": "DSL"}, {"location": "agama/introduction/#behavioral-rules-of-execution", "text": "These are aspects that concrete implementations of the framework must adhere to. Rules may include for instance: How and when a flow terminates If and how errors are handled in a flow How flows' assets, i.e. UI pages, images, stylesheets, etc., are organized or laid out How delegation of business logic execution occur in a language other than Agama A \"concrete implementation\" as referred above is known as an engine : a software component capable of running flows written in Agama DSL. More information on execution rules can be found here .", "title": "Behavioral rules of execution"}, {"location": "agama/introduction/#gama-file-format", "text": "Check this page for more information.", "title": ".gama file format"}, {"location": "agama/language-reference/", "tags": ["developer", "agama"], "text": "Agama DSL reference # This document surveys the different constructs of the Agama domain-specific language. Code comments # There is support for single line comments only (no block comments). Use // to start a comment. Comments can start anywhere in a line. Data types # In practice, values would fit into any of: string , boolean , number , list or map . Since routines implemented in other languages can be invoked (more on this later), returned values might not match up exactly with these categories, however this is not too relevant because there is no strict type enforcement in Agama. Literals # Strings # They are surrounded by double quotes. Examples: \"Agama\" , \"blah\" , \"\" (empty string) Backslash can be used to escape chars, like \"Hello\\nGluu\" (line feed), \"Hi\\u0040\" (unicode character) Including double quotes in strings requires unicode escaping, like \"\\u0022\" . Using \"\\\"\" won't work Booleans # Only true or false allowed (notice they are lowercased) Numbers # They are expressed in base 10 only Can be signed or unsigned, with or without decimal: 0 , -1 , 2.0 , 2.3 , -3.000001 , etc. No exponential notation allowed (e.g. 1E-05 ) The following are not valid: .1 , -.1 , +1 . These are their OK equivalents: 0.1 , -0.1 , 1 Null # The \u201cspecial\u201d value null can be used (responsibly) to represent the absence of a value. It is a direct consequence of supporting the integration of other languages in the DSL. Lists # They are finite sequences. Elements are separated by commas Examples: [ 1, 2, 3 ] , [ \"bah!\", \"humbug\" ] , [ ] (empty list) Elements of a list do not have to be of the same type: [ false, [ 0, 1], \"?\" ] is legal but generally discouraged Commas can be surrounded by any combination of spaces and new lines. This is handy when a list takes up some space. This is legal: [ \"no\", \"such\", \"thing\" , \"as\", \"a\", \"stupid\",\"question\"] Maps # They are in essence associative arrays (a.k.a. dictionaries): unordered collections of key/value pairs Example: { brand: \"Ford\", color: null, model: 1963, overhaulsIn: [ 1979, 1999 ] } . This map keys are brand , color , model , and overhaulsIn In literal notation, keys names must follow the pattern [a-zA-Z]( _ | [a-zA-Z] | [0-9] )* so these are all valid key names: a , Agama , b_a , a0_0 ; on the contrary, _a , 9 , -a , and \"aha\" are invalid key names As with lists, commas can be surrounded by any combination of spaces and new lines Variables # Variable names follow the pattern: [a-zA-Z]( _ | [a-zA-Z] | [0-9] )* camelCase naming is recommended Variables are not declared, just used freely. Variables are always global in a given flow They can be assigned a value using the equal sign. Example: colors = [ \"red\", \"blue\" ] They can be assigned several times in the same flow Accessing and mutating data in variables # Strings # Suppose x is a string. Individual characters can be accessed by zero-based indexes: x[0] , x[1] , etc. and they are themselves considered strings of size 1 x.length returns the string size (number of characters in it). Strings are not modifiable (neither size nor individual characters can be altered) Lists # Suppose x is a list. Elements can be accessed by zero-based indexes: x[0] , x[1] , etc. Elements of a list can be assigned (and re-assigned) using indexes too. Example: x[2] = false x.length returns the list size. This value can be updated in order to shrink or grow a list (e.g. x.length = 10 ). When extending a list beyond its current length, the \u201cgap\u201d created is filled with null values An attempt to access an index position greater than or equal to the list size returns null (most general-purpose languages would raise a runtime error in this situation) Using expressions for indexing is not allowed, like x[person.age] , x[y[0]] Click here to learn more about access in lists Maps # Suppose x is map. Values can be accessed by using \u201cdot notation\u201d Say x = { brand: \"Ford\", color: null, model: 1963, overhaulsIn: [ 1979, 1999 ] } , then x.model evaluates to 1963 , and x.overhaulsIn[1] evaluates to 1999 Setting the color would be like x.color = \"white\" A new key/value pair can be appended too: x.maxSpeed = 90 Access of an unknown property evaluates to null : x.owner If a key name does not follow the pattern [a-zA-Z]( _ | [a-zA-Z] | [0-9] )* an alternative notation must be employed to retrieve or modify the associated value. Click here to learn more Flow structure # A flow written in Agama consists of a header and one or more statements following. Header basics # A header is declarative by nature. It starts with the Flow keyword followed by the qualified name of the flow, e.g. Flow com.acme.FoodSurvey . A qualified name is a sequence of one or more fragments separated by dot ( . ) where a fragment follows the pattern [a-zA-Z]( _ | [a-zA-Z] | [0-9] )* . By convention, qualified names shall adhere to a reverse Internet domain name notation. In a header, at minimum, a base path literal string must be provided (in an indented block). This sets the location where flow assets will reside relative to the assets root: Flow com.acme.FoodSurvey Basepath \"mydir\" Here, assets refer to all elements required to build the end-user experience: UI pages, stylesheets, images, etc. The storage of these elements and location of the \"root\" are specific to the concrete Agama engine implementation used. Generally it will resemble a directory structure in a filesystem. Next, flow timeout may be specified. This is the maximum amount of time the end-user can take to fully complete a flow. For instance: Flow com.acme.FoodSurvey Basepath \"mydir\" Timeout 100 seconds An unsigned integer literal value must be specified after the Timeout keyword, if present. The Configs keyword may be used to designate a variable so the flow's properties can be accessed in the code. These properties are usually provided when the flow is created - normally through an administrative tool. This process varies from engine to engine. Often flow properties are used to supply configuration parameters to the flow. As an example, suppose a flow that sends a confirmation e-mail has to be implemented. Properties are a good place to hold the configuration of the outgoing mail server to employ: name, port, authentication credentials, etc. For instance, this is how the configuration properties would be bound to variable conf : Flow com.acme.FoodSurvey Basepath \"mydir\" Timeout 100 seconds Configs conf Inputs # In addition to the above, and optionally too, flows may receive inputs from their callers. Input names can be listed using the Inputs keyword: Flow com.acme.FoodSurvey Basepath \"mydir\" Inputs salutation askGender promptRealName Input names follow the same naming conventions (patterns) of variables and can be treated as such in code. Important Note the difference between properties and inputs. Properties are parameters that callers of the flow should not control or be interested in. On the other hand, inputs are parameters that callers supply explicitly to make the flow exhibit certain behaviors. Check this section to learn how callers can pass values to input parameters of a flow. Flow statements # The statements that make up a flow - body - come after the header and start at column 1, ie. aligned with the Flow keyword: Flow com.acme.FoodSurvey Basepath \"mydir\" Timeout 100 seconds Configs conf Inputs salutation askGender promptRealName x = \"Hi\" y = false ... There are several types of statements: branching, looping, web interaction, etc. They will be regarded in the subsequent sections of this document. Note Agama does not support the concept of subroutines/procedures; this is not needed because functional decomposition is carried out by calling subflows . Logging # Flows can issue small messages (normally used as a form of troubleshooting) that will be appended to a log. Every message can be associated a severity level. Both the log location and available levels are engine specific. To append data to the flows log, use the Log instruction. Examples: Code Message appended Notes Log \"Hi there\" Hi there Log \"Hello\" \"world\" Hello world Log can be passed a variable number of parameters Log \"Hello\" \"world\" 0 false Hello world 0 false Log [1, 2, 3, 4, 5] 1, 2, 3, ...more Lists and maps are not traversed wholly Log \"Hell%% 0 %\" \"o\" \" world\" false Hello world 0 false Placeholders usage Log \"% % % yes\" 1 \"two\" 1 two % yes Log \"3\" \"%\" 0 3 % 0 Log \"@warn Today is Friday %th\" 13 Today is Friday 13th Message logged as warning (if the engine features a \"warning\" level) Log \"@w Today's Armageddon \\u263A\" Today's Armageddon \u263a Message logged as warning (if the engine features a \"w\" level - shortcut method) Check your engine's documentation to learn more about how statements are logged. Conditionals and branching # Keywords When and Otherwise allow to write conditionals. With and , or , is , and is not , logical (boolean) expressions can be built. Examples: car = { brand: \"Ford\", color: null, model: 1963 } When car.color is null car.color = \"pink\" ... Nested conditionals: ... When car.color is \"pink\" When car.brand is \"Ford\" Log \"Weird-looking car\" ... Use of Otherwise : ... When car.color is not null Log \"you have a regular painted car\" ... Otherwise ... Boolean expressions can span several lines: and and or can be at the start or end of a line as long as the whole expression is left-aligned with its corresponding When . Examples: //legal: When day is cloudy When there is hope and there is mercy Log \"let's rock n' roll\" ... When day is cloudy When there is hope and // :D there is mercy or fear is null Log \"let's rock n' roll\" ... //illegal: When day is cloudy When there is hope and // :D there is mercy or fear is null Log \"let's rock n' roll\" ... When day is cloudy When there is hope and // :D there is mercy or fear is null Log \"let's rock n' roll\" ... Notes: Equality is designed to work with null , numbers, strings, and boolean values only. More exactly, a number should only be compared to a number, a string to a string, etc., otherwise the equality test evaluates to false . Comparing a value with itself evaluates to true regardless of type, i.e. car is car , null is null , false is false are all truthy Comparisons are limited to equality ( is ) or inequality ( is not ). For other forms of comparison you can resort foreign routines As expected and has higher priority than or when evaluating expressions. There is no way to group expressions to override the precedence: there are no parenthesis in Agama. Assigning the result of a boolean expression to a variable is not supported. These restrictions are important when writing conditionals Advanced matching # Agama's Match ... to is a construct similar to C/Java switch . Example: car = ... x = ... y = ... // Assume x and y hold numbers z = [ 3.1416, 2.71828 ] Match car.model to x //Code in this block will be executed if car.model is equal to the value of x ... -y //Here we use minus y ... z[0] ... 1.618 //Literal values can be used too for matching ... null ... Otherwise //optional block //Instructions here are executed if there was no match at all Flow finish # Finish is used to terminate a flow's execution. A flow can finish successfully or failed. Examples: Code Meaning Finish true Shorthand for flow finished successfully Finish false Shorthand for failed flow it = { success: true, data: { userId: \"as9233Qz\", ... }} Finish it Flow finished successfully. Some relevant data attached it = { success: false, error: \"User entered a wrong password 3 times\" } Finish it Flow failed. Error description attached Finish \"as9233Qz\" Shorthand for { success: true, data: { userId: \"as9233Qz\" } } it = { nonsense: [ null ] } Finish it.nonsense This causes the flow to crash. Note this is not equivalent to Finish false (which means the flow ended with a negative outcome). Notes: Unless otherwise stated by the concrete engine implementation, a map literal should not be passed directly as argument. This means the following is illegal: Finish { success: false, error: \"spacetime singularity\" } . The examples above list several syntactically valid usages Any statement found after Finish is not reached and thus, not executed If no Finish statement is found in a flow's execution, this will degenerate in flow crash When a flow is finished and was used as subflow (part of the execution of a bigger parent flow), the parent does not terminate. Execution continues at the following instruction that triggered the subflow. More on Trigger later Using data in the Finish directive is an effective way to communicate information to callers (parent flows) Learn more about flows lifecycle here Web interaction # Web interaction constructs bring the most value to Agama. Developers can express the concepts of \u201dredirect a user to an external site and retrieve any data later provided\u201d or \u201cshow a page and grab user data after interaction\u201d using atomic instructions. RFAC # RFAC (stands for Redirect and Fetch at callback ) abstracts the process of redirecting the user's browser to an external site and then collect the data presented later at a designated callback URL. This feature is particularly useful in inbound identity scenarios (e.g. to support social login). Example Details RFAC \"https://login.twitter.com/?blah..&boo=...\" Redirects to the given location. Once the user browser is taken to the callback URL by the external site (twitter.com), the flow continues ignoring any data included map = { twitter: { loginUrl: \"https://...\", ... }, ... } result = RFAC map.twitter.loginUrl Redirects to the given location. Once the user browser is taken to the callback URL by the external site, the data included in the query string or payload is stored in result (a map) for further processing The callback URL varies depending on the engine used. Check your engine's docs. RRF # RRF (stands for Render-Reply-Fetch ) abstracts the process of rendering a UI template, send the produced markup to the browser and grab user-provided data back at the server side. Example Details RRF \"survey.htm\" Renders the template survey.htm (located in this flow's base path) and resulting markup is replied to user's browser. Data submitted by the user is ignored obj = { salutation: \"Hey!\", ... } result = RRF \"survey.htm\" obj Renders the template survey.htm by injecting the data passed in obj and the resulting markup is replied to user's browser. Data submitted by the user is stored in variable result : a map whose keys are named according to the form fields present in survey.htm Notes: The template location must be specified with a string literal only (not a variable) Where and how to store templates is an engine-specific detail as well as the file formats supported. See Assets management . Use map variables - not literal maps - for the second argument of RRF Looping # There are two constructs available for looping in Agama: Repeat and Iterate over . Repeat # Repeat was designed with the concept of attempts/retries in mind: a set of statements are executed, a condition can optionally be supplied in order to abort the loop early, and (optionally too) a block of statements can be executed before the next iteration is started if the condition evaluated to false . A loop is given a maximum number of iterations. Examples: Example Notes month = \"\u2026\" Repeat 3 times max data = RRF \"guess_birthday_month.htm\" //Quit is optional in loops Quit When data.guess is month A loop that runs 3 iterations at most. A page is shown at every iteration. If the value entered by the user matches that of month variable, the loop is aborted earlier x = \u2026 // an integer value month = \"\u2026\" obj = { error: null } Repeat x times max data = RRF \"guess_birthday_month.htm\" obj Quit When data.guess is month obj.error = \"Wrong! try again\" Similar to previous example This time the max no. of iterations is set using a variable When there is a miss a message error is set (which the UI template may potentially use) x = \u2026 // an integer value month = \"\u2026\" obj = { error: null } y = Repeat x times max data = RRF \"guess_birthday_month.htm\" obj Quit When data.guess is month obj.error = \"Wrong! try again\" Log \"Attempt number:\" idx[0] Similar to previous example After the loop finishes, variable y will contain the total number of iterations made to completion. This excludes partial iterations aborted by Quit , thus, y < = x Note the usage of implicit variable idx which holds the current (zero-based) iteration number Iterate over # Iterate over is used to traverse the items of a string, list, or the keys of a map. At every iteration, a variable is set with the current item or key name. As with Repeat , a loop may be aborted earlier, an optional block of statements can be specified after Quit , and the total number of iterations can be stored in a variable. Example Notes seasons = [ \"spring\", \"winter\", \"fall\", \"summer\" ] Iterate over seasons using sn Log \"There is nothing like\" sn A loop running over a simple list. Every element visited is referenced with variable sn human = { weight: 100, height: 5.9, age: 26 } Iterate over human using attribute Log attribute \"is\" human.$attribute Iterates over the keys of the map printing both the key and its associated value. To learn about the .$ notation see Maps and dot notation seasons = [ \"spring\", \"winter\", \"fall\", \"summer\" ] sports = [ \"soccer\", \"golf\", \"tennis\" ] Iterate over seasons using sn Iterate over sports using sport Log \"There is nothing like playing % in %\" sport sn Nested loops seasons = [ \"spring\", \"winter\", \"fall\", \"summer\" ] sports = [ \"soccer,\" \"golf\", \"tenis\" ] Iterate over seasons using sn y = Iterate over sports using sport Log \"Shall we play % in % ?\" sport sn Quit When sn is \"winter\" Log \"yes!\" Log \"We played % sports in %\" y sn Similar to the previous example. The inner loop is aborted upon a given condition. Note the total number of complete iterations is recorded in y every time the inner loop finishes. seasons = [ \"spring\", \"winter\", \"fall\", \"summer\" ] sports = [ \"soccer,\" \"golf\", \"tenis\" ] Iterate over seasons using sn Iterate over sports using sport Log idx[0] idx[1] Prints iteration numbers: 0 0, 0 1, 0 2, 1 0, 1 1, 1 2, ... 3 2 The index used in idx is 0 for the outermost loop and increases by one at every level of loop nesting Subflows # A flow can Trigger another flow (a.k.a subflow) and grab its response when Finish ed. This feature materializes flow composition and re-use in Agama. Example Notes Trigger jo.jo.PersonalInfoGathering Starts the flow with qualified name jo.jo.PersonalInfoGathering . Returned data is ignored outcome = Trigger jo.jo.PersonalInfoGathering null false Log \"subflow returned with success?\" outcome.success Starts a flow passing parameters (assuming PersonalInfoGathering receives two inputs). outcome will contain the map used when the subflow ended outcome | E = Trigger jo.jo.PersonalInfoGathering null false Similar to the previous example. If for some reason PersonalInfoGathering crashes, variable E will hold a reference to the error for further processing. Otherwise E evaluates to null . The type/structure of E is an engine-specific detail. The variable on the left of the pipe ( | ) can be omitted if the outcome of the flow will not be inspected userPrefs = { otp: \"...\", ... } Match userPrefs.otp to \"e-mail\" flow = \"co.acme.EmailOTP\" \"sms\" flow = \"co.acme.SmsOTP\" Trigger $flow Starts a flow whose qualified name is determined at runtime Input parameters # The values passed after the flow name in Trigger are supplied as input parameters in the order declared by the subflow's Inputs . When not enough values are passed, the unassigned inputs will hold a null value. Unless otherwise stated by the concrete engine implementation, list and map literals should not be passed as arguments to Trigger : Illegal: Trigger subflow { key: [ 1, 2 , 3] } [ \"Yeeha!\" ] Legal: Trigger subflow x car.model list[1] null false -3 \"Sam\" Template overrides # When re-using flows, existing templates may not match the required look-and-feel or layout of the flow that is being built, or may require minor adjustments to fit better the parent's needs. These can be overcome by declaring which templates the developer would like to override for a given subflow call. Example: outcome = Trigger jo.jo.PersonalInfoGathering Override templates \"path/basic.htm\" \"\" \"path2/dir/detail.htm\" \"tmp/mydetail.htm\" Log \"subflow returned with success?\" outcome.success In an indented block using the Override templates keyword, several string literals can be provided. They specify the paths of the (subflows) templates that will be overriden by the parent and the corresponding new paths. In the example above, templates path/basic.htm and path2/dir/detail.htm rendered by flow PersonalInfoGathering (or its subflows) won't be picked from these locations but from the base path of the current (parent) flow using names basic.htm and tmp/mydetail.htm respectively. Usage of empty string denotes reusing the same file name than the original file. Alternatively, every pair of original vs. new path can be specified in a single line for more clarity, like this: outcome = Trigger jo.jo.PersonalInfoGathering Override templates \"path/basic.htm\" \"\" \"path2/dir/detail.htm\" \"tmp/mydetail.htm\" ... Note The new (overriding) templates will be injected with the same data original templates would receive. In other words, this directive only \"modifies\" the first parameter of RRF instructions. Foreign routines # Business logic implemented in languages other than Agama can be re-used by means of the Call instruction. Call plays a key role because Agama code serves fundamentally as a depiction of a flow hiding most of the internal details and low-level computations which are in turn delegated to foreign routines. The syntax of this directive is very general and actual semantics are left to the concrete engine. Roughly, here is how a Call can be structured: ( var_expr? ('|' var_name)? = )? Call alnum(.alnum)* (#alnum)? arg* where: var_name is a variable name , e.g.: x , fooBar , x_0 var_expr is a variable expression, e.g.: x , x.a , x[1].b , etc. alnum is syntactically identical to var_name but does not necessarily refer to an existing variable in the code, for instance, it may describe a path to locate a routine in a library arg is a var_expr or any string , number , boolean , null literal So the below are all syntactically valid invocations: Call apple#pear Call apple#pear \"Hi\" x 16 Call apple.banana#pear \"Hi\" abc 16 foo = Call apple.banana#pear \"Hi\" abc 16 foo | error = Call apple.banana#pear \"Hi\" abc 16 | error = Call apple.banana#pear \"Hi\" abc 16 x[0].ahoy.ahoy foo = Call street fighters true false Again, the semantics are given by the specific engine. Consult your engine documentation for examples. Unless otherwise stated by the concrete engine implementation, list and map literals should not be passed as arguments to method calls directly. This means the following is illegal: Call co.Utils#routine { key: [ 1, 2 , 3] } [ \"Yeeha!\" ] . Advanced and special cases in variable manipulation # Indexing in lists # Accessing/modifying list elements requires providing a numeric index between the brackets, e.g. x[ 0 ] . Note variables can also be used for indexing, like x[ y ] where y is a positive integer or zero. For the below table, assume x = [ \"one\", \"two\", \"three\" ] . x[1] //\"two\" y = 1 x[y] //\"two\" x[\"1\"] //illegal x[ z[0] ] //illegal: variable expressions not allowed for indexes x[obj.property] //illegal: variable expressions not allowed for indexes Maps and dot notation # The regular \u201cdot\u201d notation is limited in the sense it is fairly static: developers have to have prior knowledge about the keys' names, in other words, about the structure of maps and nested submaps, like in person.homeAddress.postalCode . Also, there might be cases where a key name does not fit the required pattern, like in person.street-address or persona.direcci\u00f3n ; even worse, there might be cases where the actual key is only known at runtime. There are ways to overcome this: Example Notes x.\"- wow!\" Access the value associated to the key named -wow! prop = ... x.$prop Access the value associated to the key whose name is contained in the variable prop (that holds a string value). Note actual value of prop may be originated from a Java call or another form of computation propA = ... propB = ... x.$propA.c.\"d\".$propB A mix of notations is valid. For example, if x= { a: { b: 0, c: { c: true, d: { e: null, f: \"hello\" } } } } , propA is equal to \"a\" , and propB to \"f\" , the expression on the left evaluates \"hello\" Usage of .$ requires to supply a variable after the dollar sign: grouped variable expressions are not supported. Thus, it is not possible to achieve something like x.a.c.($map.mykey).f in order to obtain \"hello\" if map = { mykey: \"d\" } . Indexing in maps # For convenience, when a key name \u201clooks like\u201d a positive integer (or zero), e.g. \"2\" , \"10\" , etc., numeric values can directly be used to get/set data in a map: x = { } x.\"1\" = \"golf\" x[1] //retrieves \"golf\" x[2] = \"polo\" //adds the key/value pair \"2\" / \"polo\" Language keywords # The following is a list of reserved words and as such, cannot be used as variable names or maps keys (in literal notation). Keyword Purpose/usage Basepath header declaration Call Java interaction Configs header declaration Finish termination Flow header declaration Inputs header declaration Iterate over loops Log logging Match conditionals Otherwise conditionals Override templates web interaction Quit conditionals and loops Repeat loops RFAC web interaction RRF web interaction seconds header declaration times max loops to conditionals Timeout header declaration Trigger subflow calls using loops When conditionals Operator and is is not or Special literals true false null", "title": "Language reference"}, {"location": "agama/language-reference/#agama-dsl-reference", "text": "This document surveys the different constructs of the Agama domain-specific language.", "title": "Agama DSL reference"}, {"location": "agama/language-reference/#code-comments", "text": "There is support for single line comments only (no block comments). Use // to start a comment. Comments can start anywhere in a line.", "title": "Code comments"}, {"location": "agama/language-reference/#data-types", "text": "In practice, values would fit into any of: string , boolean , number , list or map . Since routines implemented in other languages can be invoked (more on this later), returned values might not match up exactly with these categories, however this is not too relevant because there is no strict type enforcement in Agama.", "title": "Data types"}, {"location": "agama/language-reference/#literals", "text": "", "title": "Literals"}, {"location": "agama/language-reference/#strings", "text": "They are surrounded by double quotes. Examples: \"Agama\" , \"blah\" , \"\" (empty string) Backslash can be used to escape chars, like \"Hello\\nGluu\" (line feed), \"Hi\\u0040\" (unicode character) Including double quotes in strings requires unicode escaping, like \"\\u0022\" . Using \"\\\"\" won't work", "title": "Strings"}, {"location": "agama/language-reference/#booleans", "text": "Only true or false allowed (notice they are lowercased)", "title": "Booleans"}, {"location": "agama/language-reference/#numbers", "text": "They are expressed in base 10 only Can be signed or unsigned, with or without decimal: 0 , -1 , 2.0 , 2.3 , -3.000001 , etc. No exponential notation allowed (e.g. 1E-05 ) The following are not valid: .1 , -.1 , +1 . These are their OK equivalents: 0.1 , -0.1 , 1", "title": "Numbers"}, {"location": "agama/language-reference/#null", "text": "The \u201cspecial\u201d value null can be used (responsibly) to represent the absence of a value. It is a direct consequence of supporting the integration of other languages in the DSL.", "title": "Null"}, {"location": "agama/language-reference/#lists", "text": "They are finite sequences. Elements are separated by commas Examples: [ 1, 2, 3 ] , [ \"bah!\", \"humbug\" ] , [ ] (empty list) Elements of a list do not have to be of the same type: [ false, [ 0, 1], \"?\" ] is legal but generally discouraged Commas can be surrounded by any combination of spaces and new lines. This is handy when a list takes up some space. This is legal: [ \"no\", \"such\", \"thing\" , \"as\", \"a\", \"stupid\",\"question\"]", "title": "Lists"}, {"location": "agama/language-reference/#maps", "text": "They are in essence associative arrays (a.k.a. dictionaries): unordered collections of key/value pairs Example: { brand: \"Ford\", color: null, model: 1963, overhaulsIn: [ 1979, 1999 ] } . This map keys are brand , color , model , and overhaulsIn In literal notation, keys names must follow the pattern [a-zA-Z]( _ | [a-zA-Z] | [0-9] )* so these are all valid key names: a , Agama , b_a , a0_0 ; on the contrary, _a , 9 , -a , and \"aha\" are invalid key names As with lists, commas can be surrounded by any combination of spaces and new lines", "title": "Maps"}, {"location": "agama/language-reference/#variables", "text": "Variable names follow the pattern: [a-zA-Z]( _ | [a-zA-Z] | [0-9] )* camelCase naming is recommended Variables are not declared, just used freely. Variables are always global in a given flow They can be assigned a value using the equal sign. Example: colors = [ \"red\", \"blue\" ] They can be assigned several times in the same flow", "title": "Variables"}, {"location": "agama/language-reference/#accessing-and-mutating-data-in-variables", "text": "", "title": "Accessing and mutating data in variables"}, {"location": "agama/language-reference/#strings_1", "text": "Suppose x is a string. Individual characters can be accessed by zero-based indexes: x[0] , x[1] , etc. and they are themselves considered strings of size 1 x.length returns the string size (number of characters in it). Strings are not modifiable (neither size nor individual characters can be altered)", "title": "Strings"}, {"location": "agama/language-reference/#lists_1", "text": "Suppose x is a list. Elements can be accessed by zero-based indexes: x[0] , x[1] , etc. Elements of a list can be assigned (and re-assigned) using indexes too. Example: x[2] = false x.length returns the list size. This value can be updated in order to shrink or grow a list (e.g. x.length = 10 ). When extending a list beyond its current length, the \u201cgap\u201d created is filled with null values An attempt to access an index position greater than or equal to the list size returns null (most general-purpose languages would raise a runtime error in this situation) Using expressions for indexing is not allowed, like x[person.age] , x[y[0]] Click here to learn more about access in lists", "title": "Lists"}, {"location": "agama/language-reference/#maps_1", "text": "Suppose x is map. Values can be accessed by using \u201cdot notation\u201d Say x = { brand: \"Ford\", color: null, model: 1963, overhaulsIn: [ 1979, 1999 ] } , then x.model evaluates to 1963 , and x.overhaulsIn[1] evaluates to 1999 Setting the color would be like x.color = \"white\" A new key/value pair can be appended too: x.maxSpeed = 90 Access of an unknown property evaluates to null : x.owner If a key name does not follow the pattern [a-zA-Z]( _ | [a-zA-Z] | [0-9] )* an alternative notation must be employed to retrieve or modify the associated value. Click here to learn more", "title": "Maps"}, {"location": "agama/language-reference/#flow-structure", "text": "A flow written in Agama consists of a header and one or more statements following.", "title": "Flow structure"}, {"location": "agama/language-reference/#header-basics", "text": "A header is declarative by nature. It starts with the Flow keyword followed by the qualified name of the flow, e.g. Flow com.acme.FoodSurvey . A qualified name is a sequence of one or more fragments separated by dot ( . ) where a fragment follows the pattern [a-zA-Z]( _ | [a-zA-Z] | [0-9] )* . By convention, qualified names shall adhere to a reverse Internet domain name notation. In a header, at minimum, a base path literal string must be provided (in an indented block). This sets the location where flow assets will reside relative to the assets root: Flow com.acme.FoodSurvey Basepath \"mydir\" Here, assets refer to all elements required to build the end-user experience: UI pages, stylesheets, images, etc. The storage of these elements and location of the \"root\" are specific to the concrete Agama engine implementation used. Generally it will resemble a directory structure in a filesystem. Next, flow timeout may be specified. This is the maximum amount of time the end-user can take to fully complete a flow. For instance: Flow com.acme.FoodSurvey Basepath \"mydir\" Timeout 100 seconds An unsigned integer literal value must be specified after the Timeout keyword, if present. The Configs keyword may be used to designate a variable so the flow's properties can be accessed in the code. These properties are usually provided when the flow is created - normally through an administrative tool. This process varies from engine to engine. Often flow properties are used to supply configuration parameters to the flow. As an example, suppose a flow that sends a confirmation e-mail has to be implemented. Properties are a good place to hold the configuration of the outgoing mail server to employ: name, port, authentication credentials, etc. For instance, this is how the configuration properties would be bound to variable conf : Flow com.acme.FoodSurvey Basepath \"mydir\" Timeout 100 seconds Configs conf", "title": "Header basics"}, {"location": "agama/language-reference/#inputs", "text": "In addition to the above, and optionally too, flows may receive inputs from their callers. Input names can be listed using the Inputs keyword: Flow com.acme.FoodSurvey Basepath \"mydir\" Inputs salutation askGender promptRealName Input names follow the same naming conventions (patterns) of variables and can be treated as such in code. Important Note the difference between properties and inputs. Properties are parameters that callers of the flow should not control or be interested in. On the other hand, inputs are parameters that callers supply explicitly to make the flow exhibit certain behaviors. Check this section to learn how callers can pass values to input parameters of a flow.", "title": "Inputs"}, {"location": "agama/language-reference/#flow-statements", "text": "The statements that make up a flow - body - come after the header and start at column 1, ie. aligned with the Flow keyword: Flow com.acme.FoodSurvey Basepath \"mydir\" Timeout 100 seconds Configs conf Inputs salutation askGender promptRealName x = \"Hi\" y = false ... There are several types of statements: branching, looping, web interaction, etc. They will be regarded in the subsequent sections of this document. Note Agama does not support the concept of subroutines/procedures; this is not needed because functional decomposition is carried out by calling subflows .", "title": "Flow statements"}, {"location": "agama/language-reference/#logging", "text": "Flows can issue small messages (normally used as a form of troubleshooting) that will be appended to a log. Every message can be associated a severity level. Both the log location and available levels are engine specific. To append data to the flows log, use the Log instruction. Examples: Code Message appended Notes Log \"Hi there\" Hi there Log \"Hello\" \"world\" Hello world Log can be passed a variable number of parameters Log \"Hello\" \"world\" 0 false Hello world 0 false Log [1, 2, 3, 4, 5] 1, 2, 3, ...more Lists and maps are not traversed wholly Log \"Hell%% 0 %\" \"o\" \" world\" false Hello world 0 false Placeholders usage Log \"% % % yes\" 1 \"two\" 1 two % yes Log \"3\" \"%\" 0 3 % 0 Log \"@warn Today is Friday %th\" 13 Today is Friday 13th Message logged as warning (if the engine features a \"warning\" level) Log \"@w Today's Armageddon \\u263A\" Today's Armageddon \u263a Message logged as warning (if the engine features a \"w\" level - shortcut method) Check your engine's documentation to learn more about how statements are logged.", "title": "Logging"}, {"location": "agama/language-reference/#conditionals-and-branching", "text": "Keywords When and Otherwise allow to write conditionals. With and , or , is , and is not , logical (boolean) expressions can be built. Examples: car = { brand: \"Ford\", color: null, model: 1963 } When car.color is null car.color = \"pink\" ... Nested conditionals: ... When car.color is \"pink\" When car.brand is \"Ford\" Log \"Weird-looking car\" ... Use of Otherwise : ... When car.color is not null Log \"you have a regular painted car\" ... Otherwise ... Boolean expressions can span several lines: and and or can be at the start or end of a line as long as the whole expression is left-aligned with its corresponding When . Examples: //legal: When day is cloudy When there is hope and there is mercy Log \"let's rock n' roll\" ... When day is cloudy When there is hope and // :D there is mercy or fear is null Log \"let's rock n' roll\" ... //illegal: When day is cloudy When there is hope and // :D there is mercy or fear is null Log \"let's rock n' roll\" ... When day is cloudy When there is hope and // :D there is mercy or fear is null Log \"let's rock n' roll\" ... Notes: Equality is designed to work with null , numbers, strings, and boolean values only. More exactly, a number should only be compared to a number, a string to a string, etc., otherwise the equality test evaluates to false . Comparing a value with itself evaluates to true regardless of type, i.e. car is car , null is null , false is false are all truthy Comparisons are limited to equality ( is ) or inequality ( is not ). For other forms of comparison you can resort foreign routines As expected and has higher priority than or when evaluating expressions. There is no way to group expressions to override the precedence: there are no parenthesis in Agama. Assigning the result of a boolean expression to a variable is not supported. These restrictions are important when writing conditionals", "title": "Conditionals and branching"}, {"location": "agama/language-reference/#advanced-matching", "text": "Agama's Match ... to is a construct similar to C/Java switch . Example: car = ... x = ... y = ... // Assume x and y hold numbers z = [ 3.1416, 2.71828 ] Match car.model to x //Code in this block will be executed if car.model is equal to the value of x ... -y //Here we use minus y ... z[0] ... 1.618 //Literal values can be used too for matching ... null ... Otherwise //optional block //Instructions here are executed if there was no match at all", "title": "Advanced matching"}, {"location": "agama/language-reference/#flow-finish", "text": "Finish is used to terminate a flow's execution. A flow can finish successfully or failed. Examples: Code Meaning Finish true Shorthand for flow finished successfully Finish false Shorthand for failed flow it = { success: true, data: { userId: \"as9233Qz\", ... }} Finish it Flow finished successfully. Some relevant data attached it = { success: false, error: \"User entered a wrong password 3 times\" } Finish it Flow failed. Error description attached Finish \"as9233Qz\" Shorthand for { success: true, data: { userId: \"as9233Qz\" } } it = { nonsense: [ null ] } Finish it.nonsense This causes the flow to crash. Note this is not equivalent to Finish false (which means the flow ended with a negative outcome). Notes: Unless otherwise stated by the concrete engine implementation, a map literal should not be passed directly as argument. This means the following is illegal: Finish { success: false, error: \"spacetime singularity\" } . The examples above list several syntactically valid usages Any statement found after Finish is not reached and thus, not executed If no Finish statement is found in a flow's execution, this will degenerate in flow crash When a flow is finished and was used as subflow (part of the execution of a bigger parent flow), the parent does not terminate. Execution continues at the following instruction that triggered the subflow. More on Trigger later Using data in the Finish directive is an effective way to communicate information to callers (parent flows) Learn more about flows lifecycle here", "title": "Flow finish"}, {"location": "agama/language-reference/#web-interaction", "text": "Web interaction constructs bring the most value to Agama. Developers can express the concepts of \u201dredirect a user to an external site and retrieve any data later provided\u201d or \u201cshow a page and grab user data after interaction\u201d using atomic instructions.", "title": "Web interaction"}, {"location": "agama/language-reference/#rfac", "text": "RFAC (stands for Redirect and Fetch at callback ) abstracts the process of redirecting the user's browser to an external site and then collect the data presented later at a designated callback URL. This feature is particularly useful in inbound identity scenarios (e.g. to support social login). Example Details RFAC \"https://login.twitter.com/?blah..&boo=...\" Redirects to the given location. Once the user browser is taken to the callback URL by the external site (twitter.com), the flow continues ignoring any data included map = { twitter: { loginUrl: \"https://...\", ... }, ... } result = RFAC map.twitter.loginUrl Redirects to the given location. Once the user browser is taken to the callback URL by the external site, the data included in the query string or payload is stored in result (a map) for further processing The callback URL varies depending on the engine used. Check your engine's docs.", "title": "RFAC"}, {"location": "agama/language-reference/#rrf", "text": "RRF (stands for Render-Reply-Fetch ) abstracts the process of rendering a UI template, send the produced markup to the browser and grab user-provided data back at the server side. Example Details RRF \"survey.htm\" Renders the template survey.htm (located in this flow's base path) and resulting markup is replied to user's browser. Data submitted by the user is ignored obj = { salutation: \"Hey!\", ... } result = RRF \"survey.htm\" obj Renders the template survey.htm by injecting the data passed in obj and the resulting markup is replied to user's browser. Data submitted by the user is stored in variable result : a map whose keys are named according to the form fields present in survey.htm Notes: The template location must be specified with a string literal only (not a variable) Where and how to store templates is an engine-specific detail as well as the file formats supported. See Assets management . Use map variables - not literal maps - for the second argument of RRF", "title": "RRF"}, {"location": "agama/language-reference/#looping", "text": "There are two constructs available for looping in Agama: Repeat and Iterate over .", "title": "Looping"}, {"location": "agama/language-reference/#repeat", "text": "Repeat was designed with the concept of attempts/retries in mind: a set of statements are executed, a condition can optionally be supplied in order to abort the loop early, and (optionally too) a block of statements can be executed before the next iteration is started if the condition evaluated to false . A loop is given a maximum number of iterations. Examples: Example Notes month = \"\u2026\" Repeat 3 times max data = RRF \"guess_birthday_month.htm\" //Quit is optional in loops Quit When data.guess is month A loop that runs 3 iterations at most. A page is shown at every iteration. If the value entered by the user matches that of month variable, the loop is aborted earlier x = \u2026 // an integer value month = \"\u2026\" obj = { error: null } Repeat x times max data = RRF \"guess_birthday_month.htm\" obj Quit When data.guess is month obj.error = \"Wrong! try again\" Similar to previous example This time the max no. of iterations is set using a variable When there is a miss a message error is set (which the UI template may potentially use) x = \u2026 // an integer value month = \"\u2026\" obj = { error: null } y = Repeat x times max data = RRF \"guess_birthday_month.htm\" obj Quit When data.guess is month obj.error = \"Wrong! try again\" Log \"Attempt number:\" idx[0] Similar to previous example After the loop finishes, variable y will contain the total number of iterations made to completion. This excludes partial iterations aborted by Quit , thus, y < = x Note the usage of implicit variable idx which holds the current (zero-based) iteration number", "title": "Repeat"}, {"location": "agama/language-reference/#iterate-over", "text": "Iterate over is used to traverse the items of a string, list, or the keys of a map. At every iteration, a variable is set with the current item or key name. As with Repeat , a loop may be aborted earlier, an optional block of statements can be specified after Quit , and the total number of iterations can be stored in a variable. Example Notes seasons = [ \"spring\", \"winter\", \"fall\", \"summer\" ] Iterate over seasons using sn Log \"There is nothing like\" sn A loop running over a simple list. Every element visited is referenced with variable sn human = { weight: 100, height: 5.9, age: 26 } Iterate over human using attribute Log attribute \"is\" human.$attribute Iterates over the keys of the map printing both the key and its associated value. To learn about the .$ notation see Maps and dot notation seasons = [ \"spring\", \"winter\", \"fall\", \"summer\" ] sports = [ \"soccer\", \"golf\", \"tennis\" ] Iterate over seasons using sn Iterate over sports using sport Log \"There is nothing like playing % in %\" sport sn Nested loops seasons = [ \"spring\", \"winter\", \"fall\", \"summer\" ] sports = [ \"soccer,\" \"golf\", \"tenis\" ] Iterate over seasons using sn y = Iterate over sports using sport Log \"Shall we play % in % ?\" sport sn Quit When sn is \"winter\" Log \"yes!\" Log \"We played % sports in %\" y sn Similar to the previous example. The inner loop is aborted upon a given condition. Note the total number of complete iterations is recorded in y every time the inner loop finishes. seasons = [ \"spring\", \"winter\", \"fall\", \"summer\" ] sports = [ \"soccer,\" \"golf\", \"tenis\" ] Iterate over seasons using sn Iterate over sports using sport Log idx[0] idx[1] Prints iteration numbers: 0 0, 0 1, 0 2, 1 0, 1 1, 1 2, ... 3 2 The index used in idx is 0 for the outermost loop and increases by one at every level of loop nesting", "title": "Iterate over"}, {"location": "agama/language-reference/#subflows", "text": "A flow can Trigger another flow (a.k.a subflow) and grab its response when Finish ed. This feature materializes flow composition and re-use in Agama. Example Notes Trigger jo.jo.PersonalInfoGathering Starts the flow with qualified name jo.jo.PersonalInfoGathering . Returned data is ignored outcome = Trigger jo.jo.PersonalInfoGathering null false Log \"subflow returned with success?\" outcome.success Starts a flow passing parameters (assuming PersonalInfoGathering receives two inputs). outcome will contain the map used when the subflow ended outcome | E = Trigger jo.jo.PersonalInfoGathering null false Similar to the previous example. If for some reason PersonalInfoGathering crashes, variable E will hold a reference to the error for further processing. Otherwise E evaluates to null . The type/structure of E is an engine-specific detail. The variable on the left of the pipe ( | ) can be omitted if the outcome of the flow will not be inspected userPrefs = { otp: \"...\", ... } Match userPrefs.otp to \"e-mail\" flow = \"co.acme.EmailOTP\" \"sms\" flow = \"co.acme.SmsOTP\" Trigger $flow Starts a flow whose qualified name is determined at runtime", "title": "Subflows"}, {"location": "agama/language-reference/#input-parameters", "text": "The values passed after the flow name in Trigger are supplied as input parameters in the order declared by the subflow's Inputs . When not enough values are passed, the unassigned inputs will hold a null value. Unless otherwise stated by the concrete engine implementation, list and map literals should not be passed as arguments to Trigger : Illegal: Trigger subflow { key: [ 1, 2 , 3] } [ \"Yeeha!\" ] Legal: Trigger subflow x car.model list[1] null false -3 \"Sam\"", "title": "Input parameters"}, {"location": "agama/language-reference/#template-overrides", "text": "When re-using flows, existing templates may not match the required look-and-feel or layout of the flow that is being built, or may require minor adjustments to fit better the parent's needs. These can be overcome by declaring which templates the developer would like to override for a given subflow call. Example: outcome = Trigger jo.jo.PersonalInfoGathering Override templates \"path/basic.htm\" \"\" \"path2/dir/detail.htm\" \"tmp/mydetail.htm\" Log \"subflow returned with success?\" outcome.success In an indented block using the Override templates keyword, several string literals can be provided. They specify the paths of the (subflows) templates that will be overriden by the parent and the corresponding new paths. In the example above, templates path/basic.htm and path2/dir/detail.htm rendered by flow PersonalInfoGathering (or its subflows) won't be picked from these locations but from the base path of the current (parent) flow using names basic.htm and tmp/mydetail.htm respectively. Usage of empty string denotes reusing the same file name than the original file. Alternatively, every pair of original vs. new path can be specified in a single line for more clarity, like this: outcome = Trigger jo.jo.PersonalInfoGathering Override templates \"path/basic.htm\" \"\" \"path2/dir/detail.htm\" \"tmp/mydetail.htm\" ... Note The new (overriding) templates will be injected with the same data original templates would receive. In other words, this directive only \"modifies\" the first parameter of RRF instructions.", "title": "Template overrides"}, {"location": "agama/language-reference/#foreign-routines", "text": "Business logic implemented in languages other than Agama can be re-used by means of the Call instruction. Call plays a key role because Agama code serves fundamentally as a depiction of a flow hiding most of the internal details and low-level computations which are in turn delegated to foreign routines. The syntax of this directive is very general and actual semantics are left to the concrete engine. Roughly, here is how a Call can be structured: ( var_expr? ('|' var_name)? = )? Call alnum(.alnum)* (#alnum)? arg* where: var_name is a variable name , e.g.: x , fooBar , x_0 var_expr is a variable expression, e.g.: x , x.a , x[1].b , etc. alnum is syntactically identical to var_name but does not necessarily refer to an existing variable in the code, for instance, it may describe a path to locate a routine in a library arg is a var_expr or any string , number , boolean , null literal So the below are all syntactically valid invocations: Call apple#pear Call apple#pear \"Hi\" x 16 Call apple.banana#pear \"Hi\" abc 16 foo = Call apple.banana#pear \"Hi\" abc 16 foo | error = Call apple.banana#pear \"Hi\" abc 16 | error = Call apple.banana#pear \"Hi\" abc 16 x[0].ahoy.ahoy foo = Call street fighters true false Again, the semantics are given by the specific engine. Consult your engine documentation for examples. Unless otherwise stated by the concrete engine implementation, list and map literals should not be passed as arguments to method calls directly. This means the following is illegal: Call co.Utils#routine { key: [ 1, 2 , 3] } [ \"Yeeha!\" ] .", "title": "Foreign routines"}, {"location": "agama/language-reference/#advanced-and-special-cases-in-variable-manipulation", "text": "", "title": "Advanced and special cases in variable manipulation"}, {"location": "agama/language-reference/#indexing-in-lists", "text": "Accessing/modifying list elements requires providing a numeric index between the brackets, e.g. x[ 0 ] . Note variables can also be used for indexing, like x[ y ] where y is a positive integer or zero. For the below table, assume x = [ \"one\", \"two\", \"three\" ] . x[1] //\"two\" y = 1 x[y] //\"two\" x[\"1\"] //illegal x[ z[0] ] //illegal: variable expressions not allowed for indexes x[obj.property] //illegal: variable expressions not allowed for indexes", "title": "Indexing in lists"}, {"location": "agama/language-reference/#maps-and-dot-notation", "text": "The regular \u201cdot\u201d notation is limited in the sense it is fairly static: developers have to have prior knowledge about the keys' names, in other words, about the structure of maps and nested submaps, like in person.homeAddress.postalCode . Also, there might be cases where a key name does not fit the required pattern, like in person.street-address or persona.direcci\u00f3n ; even worse, there might be cases where the actual key is only known at runtime. There are ways to overcome this: Example Notes x.\"- wow!\" Access the value associated to the key named -wow! prop = ... x.$prop Access the value associated to the key whose name is contained in the variable prop (that holds a string value). Note actual value of prop may be originated from a Java call or another form of computation propA = ... propB = ... x.$propA.c.\"d\".$propB A mix of notations is valid. For example, if x= { a: { b: 0, c: { c: true, d: { e: null, f: \"hello\" } } } } , propA is equal to \"a\" , and propB to \"f\" , the expression on the left evaluates \"hello\" Usage of .$ requires to supply a variable after the dollar sign: grouped variable expressions are not supported. Thus, it is not possible to achieve something like x.a.c.($map.mykey).f in order to obtain \"hello\" if map = { mykey: \"d\" } .", "title": "Maps and dot notation"}, {"location": "agama/language-reference/#indexing-in-maps", "text": "For convenience, when a key name \u201clooks like\u201d a positive integer (or zero), e.g. \"2\" , \"10\" , etc., numeric values can directly be used to get/set data in a map: x = { } x.\"1\" = \"golf\" x[1] //retrieves \"golf\" x[2] = \"polo\" //adds the key/value pair \"2\" / \"polo\"", "title": "Indexing in maps"}, {"location": "agama/language-reference/#language-keywords", "text": "The following is a list of reserved words and as such, cannot be used as variable names or maps keys (in literal notation). Keyword Purpose/usage Basepath header declaration Call Java interaction Configs header declaration Finish termination Flow header declaration Inputs header declaration Iterate over loops Log logging Match conditionals Otherwise conditionals Override templates web interaction Quit conditionals and loops Repeat loops RFAC web interaction RRF web interaction seconds header declaration times max loops to conditionals Timeout header declaration Trigger subflow calls using loops When conditionals Operator and is is not or Special literals true false null", "title": "Language keywords"}, {"location": "casa/user-guide/", "tags": ["Casa", "user guide"], "text": "Jans Casa User Guide # Jans Casa (\"Casa\") is a self-service web portal for managing account security preferences. The primary use-case for Casa is self-service 2FA, but other use cases and functionalities can be supported via Casa plugins. The options displayed in the user portal will always depend upon which settings have been enabled by the administrator. Sign in for the first time # To log in to Casa, navigate to https:///jans-casa . If you have an existing account, sign in with your standard username and password. Credential Dashboard # The credential dashboard displays widgets for each type of supported 2FA credential (e.g. U2F keys, OTP apps, etc.). Each widget includes summary details of enrolled credentials and a button to add / change credentials. To manage existing credentials and enroll new credentials, click the Manage button: 2FA overview # Turn 2FA on/off # After the minimum number of credentials have been enrolled (as specified by the system admin), 2FA can be turned on by clicking the switch in the Second Factor Authentication widget: If the switch is not visible, your administrator may have configured the system so that 2FA is turned on automatically when enough credentials are available. When prompted for 2FA, the specific credential to be prompted first varies depending on the priority of credentials established by the administrator and the user's preferred method, if set. If at any time the credential prompted is unavailable, you have the option to present any other previously enrolled 2FA credential type. To turn off 2FA, click again the switch. 2FA settings and trusted devices # If enabled by the system administrator, you can set your own policy for when 2FA is enforced. To manage your settings, after enrolling credentials and turning on 2FA, click the Manage your 2FA settings button in the Preferred Authentication Mechanism widget. By default, you will be able to choose from a few 2FA policies: Always (upon every login attempt) If the location (e.g. city) detected in the login attempt is unrecognized If the device used to login is unrecognized If you opt for 2FA based on location, device, or both, a new widget will appear to display your trusted devices. 2FA best practices # Depending on the device used to get access, some credentials are more convenient to use than others. For instance, security keys may not be compatible with mobile phones or certain browsers. To reduce the chance of account lockout , enroll at least two different types of 2FA credentials -- e.g. one security key and one OTP app; or one OTP app and one SMS phone number, etc. This way, regardless which device you're using to access a protected resource, you will have a usable option for passing strong authentication. 2FA credential details & enrollment # The details page provides additional information about each enrolled credential, for instance its name and date of enrollment. Nicknames can be edited, credentials can be deleted and new credentials can be enrolled and nicknamed. Depending on administrator configurations, some of the below sections may nor may not be available, or sections not listed here may appear. Warning When a credential is deleted, it cannot be recovered. Deleting credentials may result in 2FA being turned off. FIDO 2 security keys # To add a new FIDO 2 credential, navigate to 2FA credentials > Security Keys . Insert the fido key and click Ready . Casa will prompt to press the button on the key. Add a nickname and click Add . Once added, the new device will appear in a list on the same page. Click the pencil to edit the device's nickname or the trashcan to delete the device. Super Gluu Devices # To add a new Super Gluu device, navigate to 2FA credentials > Super Gluu Devices . The Super Gluu enrollment QR code will pop up. Scan it in the Super Gluu app and approve the enrollment. Add a nickname for the device and click Add . Once it's added, the new device will appear in a list on the same page. Click the pencil to edit the device's nickname or the trashcan to delete the device. OTP Tokens # To add a new OTP token, navigate to 2FA credentials > OTP Tokens . To add a soft OTP token, choose the Soft token option and follow the same steps as Super Gluu . For a hard token, choose the Hard Token option. Add the key associated with the device and the 6 digit code. Add a nickname for the device and click Add . Once it's added, the new device will appear in a list on the same page. Click the pencil to edit the device's nickname or the trashcan to delete the device. Mobile Phone Numbers # To add a new mobile phone number for one-time passcodes, navigate to 2FA credentials > Mobile Phone Numbers . Enter a phone number and click 'Send SMS' to get the passcode. Enter the code received, nickname the mobile number, and click Add . Once it's added, the new mobile number will appear in a list on the same page. Click the pencil to edit the mobile number's nickname or the trashcan to delete the mobile number. Password Reset # If enabled by the system administrator, Casa can also be used to change your password. Navigate to the Password Reset widget. Enter your current and new passwords, then click Change password . Consent Management # If the administrator has enabled the Consent Management plugin, it will appear in the navigation menu for all users. New entries are added automatically whenever the user is prompted for, and authorizes the release of their personal data to an application accessed using their Janssen Server account. Revoking consent # When a previously granted consent decision is revoked, the user will be re-prompted to authorize release of their data if/when they attempt to access the application again.", "title": "User Guide"}, {"location": "casa/user-guide/#jans-casa-user-guide", "text": "Jans Casa (\"Casa\") is a self-service web portal for managing account security preferences. The primary use-case for Casa is self-service 2FA, but other use cases and functionalities can be supported via Casa plugins. The options displayed in the user portal will always depend upon which settings have been enabled by the administrator.", "title": "Jans Casa User Guide"}, {"location": "casa/user-guide/#sign-in-for-the-first-time", "text": "To log in to Casa, navigate to https:///jans-casa . If you have an existing account, sign in with your standard username and password.", "title": "Sign in for the first time"}, {"location": "casa/user-guide/#credential-dashboard", "text": "The credential dashboard displays widgets for each type of supported 2FA credential (e.g. U2F keys, OTP apps, etc.). Each widget includes summary details of enrolled credentials and a button to add / change credentials. To manage existing credentials and enroll new credentials, click the Manage button:", "title": "Credential Dashboard"}, {"location": "casa/user-guide/#2fa-overview", "text": "", "title": "2FA overview"}, {"location": "casa/user-guide/#turn-2fa-onoff", "text": "After the minimum number of credentials have been enrolled (as specified by the system admin), 2FA can be turned on by clicking the switch in the Second Factor Authentication widget: If the switch is not visible, your administrator may have configured the system so that 2FA is turned on automatically when enough credentials are available. When prompted for 2FA, the specific credential to be prompted first varies depending on the priority of credentials established by the administrator and the user's preferred method, if set. If at any time the credential prompted is unavailable, you have the option to present any other previously enrolled 2FA credential type. To turn off 2FA, click again the switch.", "title": "Turn 2FA on/off"}, {"location": "casa/user-guide/#2fa-settings-and-trusted-devices", "text": "If enabled by the system administrator, you can set your own policy for when 2FA is enforced. To manage your settings, after enrolling credentials and turning on 2FA, click the Manage your 2FA settings button in the Preferred Authentication Mechanism widget. By default, you will be able to choose from a few 2FA policies: Always (upon every login attempt) If the location (e.g. city) detected in the login attempt is unrecognized If the device used to login is unrecognized If you opt for 2FA based on location, device, or both, a new widget will appear to display your trusted devices.", "title": "2FA settings and trusted devices"}, {"location": "casa/user-guide/#2fa-best-practices", "text": "Depending on the device used to get access, some credentials are more convenient to use than others. For instance, security keys may not be compatible with mobile phones or certain browsers. To reduce the chance of account lockout , enroll at least two different types of 2FA credentials -- e.g. one security key and one OTP app; or one OTP app and one SMS phone number, etc. This way, regardless which device you're using to access a protected resource, you will have a usable option for passing strong authentication.", "title": "2FA best practices"}, {"location": "casa/user-guide/#2fa-credential-details-enrollment", "text": "The details page provides additional information about each enrolled credential, for instance its name and date of enrollment. Nicknames can be edited, credentials can be deleted and new credentials can be enrolled and nicknamed. Depending on administrator configurations, some of the below sections may nor may not be available, or sections not listed here may appear. Warning When a credential is deleted, it cannot be recovered. Deleting credentials may result in 2FA being turned off.", "title": "2FA credential details & enrollment"}, {"location": "casa/user-guide/#fido-2-security-keys", "text": "To add a new FIDO 2 credential, navigate to 2FA credentials > Security Keys . Insert the fido key and click Ready . Casa will prompt to press the button on the key. Add a nickname and click Add . Once added, the new device will appear in a list on the same page. Click the pencil to edit the device's nickname or the trashcan to delete the device.", "title": "FIDO 2 security keys"}, {"location": "casa/user-guide/#super-gluu-devices", "text": "To add a new Super Gluu device, navigate to 2FA credentials > Super Gluu Devices . The Super Gluu enrollment QR code will pop up. Scan it in the Super Gluu app and approve the enrollment. Add a nickname for the device and click Add . Once it's added, the new device will appear in a list on the same page. Click the pencil to edit the device's nickname or the trashcan to delete the device.", "title": "Super Gluu Devices"}, {"location": "casa/user-guide/#otp-tokens", "text": "To add a new OTP token, navigate to 2FA credentials > OTP Tokens . To add a soft OTP token, choose the Soft token option and follow the same steps as Super Gluu . For a hard token, choose the Hard Token option. Add the key associated with the device and the 6 digit code. Add a nickname for the device and click Add . Once it's added, the new device will appear in a list on the same page. Click the pencil to edit the device's nickname or the trashcan to delete the device.", "title": "OTP Tokens"}, {"location": "casa/user-guide/#mobile-phone-numbers", "text": "To add a new mobile phone number for one-time passcodes, navigate to 2FA credentials > Mobile Phone Numbers . Enter a phone number and click 'Send SMS' to get the passcode. Enter the code received, nickname the mobile number, and click Add . Once it's added, the new mobile number will appear in a list on the same page. Click the pencil to edit the mobile number's nickname or the trashcan to delete the mobile number.", "title": "Mobile Phone Numbers"}, {"location": "casa/user-guide/#password-reset", "text": "If enabled by the system administrator, Casa can also be used to change your password. Navigate to the Password Reset widget. Enter your current and new passwords, then click Change password .", "title": "Password Reset"}, {"location": "casa/user-guide/#consent-management", "text": "If the administrator has enabled the Consent Management plugin, it will appear in the navigation menu for all users. New entries are added automatically whenever the user is prompted for, and authorizes the release of their personal data to an application accessed using their Janssen Server account.", "title": "Consent Management"}, {"location": "casa/user-guide/#revoking-consent", "text": "When a previously granted consent decision is revoked, the user will be re-prompted to authorize release of their data if/when they attempt to access the application again.", "title": "Revoking consent"}, {"location": "casa/administration/2fa-basics/", "tags": ["Casa", "2FA", "two-factor"], "text": "About Two-Factor Authentication (2FA) # Note You can tailor different aspects of 2FA behavior in Casa using the plugin developed for this purpose. Availability # By default, strong (two-factor) authentication will be available to users of Casa once they have added at least two credentials. By requiring users to register two strong credentials, the number of account lockouts that require admin intervention will be greatly reduced. If one credential is lost, there will be at least one fallback mechanism available. Avoiding user lockout is important because it prevents a serious burden for IT administrators. There is no limit to the number of credentials a user can enroll, and credentials do not need to be of the same type: any combination is valid. Supported types of 2FA # Users will only be able to add credentials with a type matching one of the already enabled authentication methods in the admin console . Other methods may be supported via plugins . Resetting a user's 2FA availability # In the event a user loses access to his account, admins can revert the user's authentication method to \"password only\" by following the steps shown in the troubleshooting guide . Associated \"strength\" of credentials # When authenticating, a user with 2FA turned on, will be challenged to present the credential having the \"strongest\" authentication method (from his already available enrolled credentials). The relative strength of methods can be assigned in the authentication methods screen of the admin console. Forcing users to enroll a specific credential before 2FA is available # To further reduce the likelihood of lockouts, you can force users to initially enroll, for instance, one OTP credential before any other. OTP credentials are generally more accessible than their counterparts (like Fido) since they normally don't demand special conditions from the device used to access, like having a USB port. To do so, add a property named 2fa_requisite to the configuration of the Agama flow that backs the given authentication method, and assign true as its value. You can do this via TUI . Note this mechanism is applicable for the out-of-the box authentication methods supported by Casa. For other methods contributed via plugins, consult their respective documentation. You can flag more than one method as requisite. In this case users will be encouraged to enroll one credential associated to any of the flagged methods. If a user attempts to delete their only available credential matching the requisite method, a prompt will appear warning that doing so will disable 2FA, that is, resetting to password authentication. If you are a developer coding a plugin that adds an authentication method, you can make the method a requisite by properly implementing method mayBe2faActivationRequisite part of interface AuthnMethod . Enrolling credentials upon registration or first login # If the previous scenario is not enough for your needs, you can force users to enroll credentials and turn 2FA on before the first usage of the application. This can be done in two ways: Creating a new Agama project that takes charge of credentials enrollment and then reuses the flows bundled with the standard Agama project which performs the actual authentication. Learn more about this in the developer pages Making enrollments occur at registration time (through the application you use for this purpose)", "title": "About 2FA"}, {"location": "casa/administration/2fa-basics/#about-two-factor-authentication-2fa", "text": "Note You can tailor different aspects of 2FA behavior in Casa using the plugin developed for this purpose.", "title": "About Two-Factor Authentication (2FA)"}, {"location": "casa/administration/2fa-basics/#availability", "text": "By default, strong (two-factor) authentication will be available to users of Casa once they have added at least two credentials. By requiring users to register two strong credentials, the number of account lockouts that require admin intervention will be greatly reduced. If one credential is lost, there will be at least one fallback mechanism available. Avoiding user lockout is important because it prevents a serious burden for IT administrators. There is no limit to the number of credentials a user can enroll, and credentials do not need to be of the same type: any combination is valid.", "title": "Availability"}, {"location": "casa/administration/2fa-basics/#supported-types-of-2fa", "text": "Users will only be able to add credentials with a type matching one of the already enabled authentication methods in the admin console . Other methods may be supported via plugins .", "title": "Supported types of 2FA"}, {"location": "casa/administration/2fa-basics/#resetting-a-users-2fa-availability", "text": "In the event a user loses access to his account, admins can revert the user's authentication method to \"password only\" by following the steps shown in the troubleshooting guide .", "title": "Resetting a user's 2FA availability"}, {"location": "casa/administration/2fa-basics/#associated-strength-of-credentials", "text": "When authenticating, a user with 2FA turned on, will be challenged to present the credential having the \"strongest\" authentication method (from his already available enrolled credentials). The relative strength of methods can be assigned in the authentication methods screen of the admin console.", "title": "Associated \"strength\" of credentials"}, {"location": "casa/administration/2fa-basics/#forcing-users-to-enroll-a-specific-credential-before-2fa-is-available", "text": "To further reduce the likelihood of lockouts, you can force users to initially enroll, for instance, one OTP credential before any other. OTP credentials are generally more accessible than their counterparts (like Fido) since they normally don't demand special conditions from the device used to access, like having a USB port. To do so, add a property named 2fa_requisite to the configuration of the Agama flow that backs the given authentication method, and assign true as its value. You can do this via TUI . Note this mechanism is applicable for the out-of-the box authentication methods supported by Casa. For other methods contributed via plugins, consult their respective documentation. You can flag more than one method as requisite. In this case users will be encouraged to enroll one credential associated to any of the flagged methods. If a user attempts to delete their only available credential matching the requisite method, a prompt will appear warning that doing so will disable 2FA, that is, resetting to password authentication. If you are a developer coding a plugin that adds an authentication method, you can make the method a requisite by properly implementing method mayBe2faActivationRequisite part of interface AuthnMethod .", "title": "Forcing users to enroll a specific credential before 2FA is available"}, {"location": "casa/administration/2fa-basics/#enrolling-credentials-upon-registration-or-first-login", "text": "If the previous scenario is not enough for your needs, you can force users to enroll credentials and turn 2FA on before the first usage of the application. This can be done in two ways: Creating a new Agama project that takes charge of credentials enrollment and then reuses the flows bundled with the standard Agama project which performs the actual authentication. Learn more about this in the developer pages Making enrollments occur at registration time (through the application you use for this purpose)", "title": "Enrolling credentials upon registration or first login"}, {"location": "casa/administration/admin-console/", "tags": ["Casa", "administration", "admin console"], "text": "Admin Console # This document reviews the available options for configuring Casa. All configuration changes applied via the admin console take effect immediately with no restart or other actions required. Authentication methods # Here you can choose the type of 2FA credentials you want to support in Casa. Every authentication method is represented by a widget you can enable or disable. Administrators can arrange widgets according to perceived \"strength\" order, that is, methods considered safer than others can be placed on top of the list. This ordering has two practical consequences: When a user has 2FA turned on, he will be prompted safer methods first when authenticating. However, if the user has already chosen a preferred method in his dashboard, the prompt favors his choice In the user's dashboard enrolling options are presented following the defined order Widgets shown vary according to plugins installed. In a fresh installation, the following are supported out-of-the-box: OTP via SMS TOTP/HOTP: mobile OTP apps and hard tokens (cards, key fobs, dongles, etc.) FIDO devices Super Gluu for push notifications To add more authentication methods, please check the developer guide . Pass reset config # An admin can give users the ability to reset their password from inside Casa. To enable the password reset functionality, navigate to Pass reset config and click the toggle to ON . Reset to password authentication # If a user is locked out for any reason (e.g. lost device, etc.), an admin can navigate to Reset to password authentication in the admin console to turn 2FA off for them. Type the username (or part of) in the text field and then press search. Once the user has been located, click the checkbox and click the Reset to password button. The row will become disabled, and a success message will be displayed. Branding # Most organizations will want to custom brand Jans Casa. Follow our guide to learn more about custom branding Casa . Plugins # Through an easy-to-use screen, administrators can easily manage installed plugins and add new ones. Logging # Application logs are useful sources of information to diagnose anomalies and understand possible causes of errors if presented. Casa uses the Log4J2 logging framework for this. The severity level for logs can be modified at runtime and requires no restart. For more information about logging, check the FAQ entry . CORS domains # If a given plugin exposes one or more web services that are to be consumed from within a web browser, you can whitelist the origin domains from which consumption can takes place. 2FA settings # Warning This feature is only if the 2FA settings plugin is installed In the 2FA settings screen, an admin can: Specify the minimum number of credentials a user must enroll before 2FA can be turned on Determine whether 2FA should be automatically enabled upon credential enrollment Whether users can turn 2FA on and off their own Whether users can choose a preferred authentication method Choose from a few predefined policies for when 2FA should be prompted. To reduce the chance of lockouts, we recommend setting a minimum of two (2) strong credentials. Predefined 2FA policy options include: Enforce strong authentication for every login attempt Prompt for 2FA when users' location is unrecognized Prompt for 2FA when users' device is unrecognized Allow the user to set their own strong authentication policy The default policy is to enforce 2FA for every login attempt. If the admin opts to allow users to manager their own policy, a new widget will appear in the user-facing dashboard as described in the user guide . In addition, the plugin exposes an API to programmatically manipulate these settings.", "title": "Admin console"}, {"location": "casa/administration/admin-console/#admin-console", "text": "This document reviews the available options for configuring Casa. All configuration changes applied via the admin console take effect immediately with no restart or other actions required.", "title": "Admin Console"}, {"location": "casa/administration/admin-console/#authentication-methods", "text": "Here you can choose the type of 2FA credentials you want to support in Casa. Every authentication method is represented by a widget you can enable or disable. Administrators can arrange widgets according to perceived \"strength\" order, that is, methods considered safer than others can be placed on top of the list. This ordering has two practical consequences: When a user has 2FA turned on, he will be prompted safer methods first when authenticating. However, if the user has already chosen a preferred method in his dashboard, the prompt favors his choice In the user's dashboard enrolling options are presented following the defined order Widgets shown vary according to plugins installed. In a fresh installation, the following are supported out-of-the-box: OTP via SMS TOTP/HOTP: mobile OTP apps and hard tokens (cards, key fobs, dongles, etc.) FIDO devices Super Gluu for push notifications To add more authentication methods, please check the developer guide .", "title": "Authentication methods"}, {"location": "casa/administration/admin-console/#pass-reset-config", "text": "An admin can give users the ability to reset their password from inside Casa. To enable the password reset functionality, navigate to Pass reset config and click the toggle to ON .", "title": "Pass reset config"}, {"location": "casa/administration/admin-console/#reset-to-password-authentication", "text": "If a user is locked out for any reason (e.g. lost device, etc.), an admin can navigate to Reset to password authentication in the admin console to turn 2FA off for them. Type the username (or part of) in the text field and then press search. Once the user has been located, click the checkbox and click the Reset to password button. The row will become disabled, and a success message will be displayed.", "title": "Reset to password authentication"}, {"location": "casa/administration/admin-console/#branding", "text": "Most organizations will want to custom brand Jans Casa. Follow our guide to learn more about custom branding Casa .", "title": "Branding"}, {"location": "casa/administration/admin-console/#plugins", "text": "Through an easy-to-use screen, administrators can easily manage installed plugins and add new ones.", "title": "Plugins"}, {"location": "casa/administration/admin-console/#logging", "text": "Application logs are useful sources of information to diagnose anomalies and understand possible causes of errors if presented. Casa uses the Log4J2 logging framework for this. The severity level for logs can be modified at runtime and requires no restart. For more information about logging, check the FAQ entry .", "title": "Logging"}, {"location": "casa/administration/admin-console/#cors-domains", "text": "If a given plugin exposes one or more web services that are to be consumed from within a web browser, you can whitelist the origin domains from which consumption can takes place.", "title": "CORS domains"}, {"location": "casa/administration/admin-console/#2fa-settings", "text": "Warning This feature is only if the 2FA settings plugin is installed In the 2FA settings screen, an admin can: Specify the minimum number of credentials a user must enroll before 2FA can be turned on Determine whether 2FA should be automatically enabled upon credential enrollment Whether users can turn 2FA on and off their own Whether users can choose a preferred authentication method Choose from a few predefined policies for when 2FA should be prompted. To reduce the chance of lockouts, we recommend setting a minimum of two (2) strong credentials. Predefined 2FA policy options include: Enforce strong authentication for every login attempt Prompt for 2FA when users' location is unrecognized Prompt for 2FA when users' device is unrecognized Allow the user to set their own strong authentication policy The default policy is to enforce 2FA for every login attempt. If the admin opts to allow users to manager their own policy, a new widget will appear in the user-facing dashboard as described in the user guide . In addition, the plugin exposes an API to programmatically manipulate these settings.", "title": "2FA settings"}, {"location": "casa/administration/change-context-path/", "tags": ["Casa", "administration", "context path"], "text": "Change Application Context Path # To publish the application at a location other than /casa , do the following: Log into Janssen Server using SSH Edit tag in file /opt/jans/jetty/jans-casa/webapps/jans-casa.xml with the new path you want to use. For example, if you chose /creds , you would do the following: /creds Edit tag in file /opt/jans/jetty/jans-casa/webapps/jans-casa_web_resources.xml appropriately with the new path you want to use. Adjust Apache's .conf file: Locate the https_jans.conf file. The exact location will vary depending on your distribution. In Ubuntu, for example, you can find it at /etc/apache2/sites-available Find the section starting with and replace the 2 occurrences of casa with the path of your choice. Do not use trailing slashes Add the following directive: Redirect /casa / before all and sections Adjust custom script settings: adjust the \"supergluu_app_id\" property of the casa custom script accordingly Wait for around 1 minute (so the server picks the script changes), then restart Casa and Apache services. Use this page as a guide The application should be accessible now at the new URL.", "title": "URL path customization"}, {"location": "casa/administration/change-context-path/#change-application-context-path", "text": "To publish the application at a location other than /casa , do the following: Log into Janssen Server using SSH Edit tag in file /opt/jans/jetty/jans-casa/webapps/jans-casa.xml with the new path you want to use. For example, if you chose /creds , you would do the following: /creds Edit tag in file /opt/jans/jetty/jans-casa/webapps/jans-casa_web_resources.xml appropriately with the new path you want to use. Adjust Apache's .conf file: Locate the https_jans.conf file. The exact location will vary depending on your distribution. In Ubuntu, for example, you can find it at /etc/apache2/sites-available Find the section starting with and replace the 2 occurrences of casa with the path of your choice. Do not use trailing slashes Add the following directive: Redirect /casa / before all and sections Adjust custom script settings: adjust the \"supergluu_app_id\" property of the casa custom script accordingly Wait for around 1 minute (so the server picks the script changes), then restart Casa and Apache services. Use this page as a guide The application should be accessible now at the new URL.", "title": "Change Application Context Path"}, {"location": "casa/administration/custom-branding/", "tags": ["Casa", "administration", "custom branding", "brand"], "text": "Custom branding # In Casa, administrators can supply their own logo and favicon to better match the organization's look and feel. If you want to apply more advanced customizations, adding the custom branding plugin is the way to go. Note This page covers customizations available through the custom branding plugin . It is assumed you have already added it to your Casa installation. The plugin allows administrators to easily alter the appearance of Casa. There are two ways to tweak the design: a quick point-and-click set of changes that you can preview immediately, or a lower-level approach that allows you to supply your own CSS file and images (this is known as external assets directory usage). Quick design customization # Click on Custom branding in the admin console, and choose Upload images and pick colors . With this branding alternative, you can apply some visual changes effortlessly with zero CSS coding. You can: Supply your company logo and favicon Choose the background color for the page header Choose button colors Edit the footer text Once you supply your files, color values, and footer text, click on Save and see the changes take immediately by navigating to a different page or opening a new browser tab. Repeat the process till you get the combination that best matches your organization's look and feel. With \"Primary buttons\" we refer to the vast majority of buttons that trigger some action such as saving, updating or accepting - whether in the user pages or the admin UI itself. \"Cancel\" covers undo, close or cancel, while \"Misc\" is for anything not fitting any of the previous usages. You can choose \"Use defaults\" if you feel comfortable with the Bootstrap-like colors offered in Jans Casa. Using the external assets directory # Note Intermediate-level knowledge of CSS is required for this task. Background # Casa's UI design is driven by one CSS stylesheet and a few images. Specifically, Casa leverages the following UI frameworks: ZK Tachyons 4.11 Font Awesome 5.12 Particularly, ZK's default theme CSS file was disabled to offer a higher degree of flexibility in design. This enables Tachyons to claim control over style rules applied to HTML markup. External assets directory # In the /opt/jans/jetty/casa/static folder, you can place your own version of the main stylesheet and images Casa uses. No other stylesheet should be overriden. To start, log in to the Janssen Server and do the following: cd /opt/jans/jetty/jans-casa/static jar -xf ../webapps/jans-casa.war images styles/gluu/style.css This will copy the files you can edit later (these are the original versions provided out of the box in Casa). If you place additional files in this directory, ensure ownership is set to recursive. For instance, you can: $ chown -R jetty:jetty /opt/jans/jetty/jans-casa/static/ Enable and apply your customizations # In the admin console, navigate to Custom branding > Use Casa external assets directory . From that point on, your installation is reading relevant files from the static directory. Note In CSS, the rules' order of appearance is important. For all Casa pages, style.css is loaded first, then tachyons.css. This means rules for Tachyons have higher priority unless !important is used. The main stylesheet ( style.css ) is located at /opt/jans/jetty/jans-casa/static/styles/gluu if you have followed the instructions above. Here are some tips for applying your customizations: Get acquainted with functional CSS. This is the approach followed in Casa. Here , here , and here you can find useful introductory material. Inspect the DOM tree generated for application pages and determine the CSS selectors you need to edit or things you have to add in order to alter the appearance. Use your web browser's facilities to inspect web page composition: this is usually part of any browser's developer toolbar. Moreover, they allow you to change styles on the fly so you can play a lot before applying the real changes. Don't override rules that are already defined in Tachyons. Conversely, ZK rules (which are prefixed with z- ) are safe to be re-defined since ZK CSS isn't included. In most circumstances, your work will come down to editing existing rules in style.css . HTML markup will show rules (in the class attribute) prefixed with cust- that are apparently not defined anywhere. These rules are intended to give admins the opportunity to add their design tastes. The following is a list of custom selectors you can add to style.css . Names are in general self-explanatory, the images below help clarify more. cust-menu-item cust-content-heading cust-sections-wrapper cust-section cust-panel cust-modal-window cust-edit-button cust-link-button cust-delete-button cust-primary-button cust-cancel-button cust-misc-button cust-text-input cust-progress-bar Viewing your changes # There is no need to restart the application for the changes to take effect. However, most static files are cached by browsers, so you will need to open a fresh private browsing (incognito) session. If you tried the above and still don't see changes, try hitting the resource URL directly in a new browser tab. For example, to load the style.css file in your browser, visit https:///casa/custom/styles/gluu/style.css . That way, you can determine if your changes are there. Reverting to Default Theme # If for any reason you wish to restore the default theme, select \"Use default (Gluu Inc.) theme\" in the admin dashboard. Examples # Here are solutions for common use cases: Use a different logo # Just replace images/logo.png (relative to the static directory) with your own image. Use a Different Favicon # Replace images/favicon.ico with your own image. Change the Font Used in Text # The vast majority of text that appears in the application uses the same font. To set the default font, locate at the bottom of style.css a declaration like @import url('https://fonts.googleapis.com... and point to one of your choosing. Check out this page to learn more about Google fonts. Then, scroll down and modify the html and body selectors appropriately with the font you picked. If you want to use your own fonts instead of Google's, you can use @font-face for this purpose. Copy your ttf , woff , svg or eot files somewhere in the static directory and link them appropriately. To use the more classical fonts like \"Helvetica\", \"Arial\", etc., simply update html and body selectors passing the font-family name.", "title": "Custom branding"}, {"location": "casa/administration/custom-branding/#custom-branding", "text": "In Casa, administrators can supply their own logo and favicon to better match the organization's look and feel. If you want to apply more advanced customizations, adding the custom branding plugin is the way to go. Note This page covers customizations available through the custom branding plugin . It is assumed you have already added it to your Casa installation. The plugin allows administrators to easily alter the appearance of Casa. There are two ways to tweak the design: a quick point-and-click set of changes that you can preview immediately, or a lower-level approach that allows you to supply your own CSS file and images (this is known as external assets directory usage).", "title": "Custom branding"}, {"location": "casa/administration/custom-branding/#quick-design-customization", "text": "Click on Custom branding in the admin console, and choose Upload images and pick colors . With this branding alternative, you can apply some visual changes effortlessly with zero CSS coding. You can: Supply your company logo and favicon Choose the background color for the page header Choose button colors Edit the footer text Once you supply your files, color values, and footer text, click on Save and see the changes take immediately by navigating to a different page or opening a new browser tab. Repeat the process till you get the combination that best matches your organization's look and feel. With \"Primary buttons\" we refer to the vast majority of buttons that trigger some action such as saving, updating or accepting - whether in the user pages or the admin UI itself. \"Cancel\" covers undo, close or cancel, while \"Misc\" is for anything not fitting any of the previous usages. You can choose \"Use defaults\" if you feel comfortable with the Bootstrap-like colors offered in Jans Casa.", "title": "Quick design customization"}, {"location": "casa/administration/custom-branding/#using-the-external-assets-directory", "text": "Note Intermediate-level knowledge of CSS is required for this task.", "title": "Using the external assets directory"}, {"location": "casa/administration/custom-branding/#background", "text": "Casa's UI design is driven by one CSS stylesheet and a few images. Specifically, Casa leverages the following UI frameworks: ZK Tachyons 4.11 Font Awesome 5.12 Particularly, ZK's default theme CSS file was disabled to offer a higher degree of flexibility in design. This enables Tachyons to claim control over style rules applied to HTML markup.", "title": "Background"}, {"location": "casa/administration/custom-branding/#external-assets-directory", "text": "In the /opt/jans/jetty/casa/static folder, you can place your own version of the main stylesheet and images Casa uses. No other stylesheet should be overriden. To start, log in to the Janssen Server and do the following: cd /opt/jans/jetty/jans-casa/static jar -xf ../webapps/jans-casa.war images styles/gluu/style.css This will copy the files you can edit later (these are the original versions provided out of the box in Casa). If you place additional files in this directory, ensure ownership is set to recursive. For instance, you can: $ chown -R jetty:jetty /opt/jans/jetty/jans-casa/static/", "title": "External assets directory"}, {"location": "casa/administration/custom-branding/#enable-and-apply-your-customizations", "text": "In the admin console, navigate to Custom branding > Use Casa external assets directory . From that point on, your installation is reading relevant files from the static directory. Note In CSS, the rules' order of appearance is important. For all Casa pages, style.css is loaded first, then tachyons.css. This means rules for Tachyons have higher priority unless !important is used. The main stylesheet ( style.css ) is located at /opt/jans/jetty/jans-casa/static/styles/gluu if you have followed the instructions above. Here are some tips for applying your customizations: Get acquainted with functional CSS. This is the approach followed in Casa. Here , here , and here you can find useful introductory material. Inspect the DOM tree generated for application pages and determine the CSS selectors you need to edit or things you have to add in order to alter the appearance. Use your web browser's facilities to inspect web page composition: this is usually part of any browser's developer toolbar. Moreover, they allow you to change styles on the fly so you can play a lot before applying the real changes. Don't override rules that are already defined in Tachyons. Conversely, ZK rules (which are prefixed with z- ) are safe to be re-defined since ZK CSS isn't included. In most circumstances, your work will come down to editing existing rules in style.css . HTML markup will show rules (in the class attribute) prefixed with cust- that are apparently not defined anywhere. These rules are intended to give admins the opportunity to add their design tastes. The following is a list of custom selectors you can add to style.css . Names are in general self-explanatory, the images below help clarify more. cust-menu-item cust-content-heading cust-sections-wrapper cust-section cust-panel cust-modal-window cust-edit-button cust-link-button cust-delete-button cust-primary-button cust-cancel-button cust-misc-button cust-text-input cust-progress-bar", "title": "Enable and apply your customizations"}, {"location": "casa/administration/custom-branding/#viewing-your-changes", "text": "There is no need to restart the application for the changes to take effect. However, most static files are cached by browsers, so you will need to open a fresh private browsing (incognito) session. If you tried the above and still don't see changes, try hitting the resource URL directly in a new browser tab. For example, to load the style.css file in your browser, visit https:///casa/custom/styles/gluu/style.css . That way, you can determine if your changes are there.", "title": "Viewing your changes"}, {"location": "casa/administration/custom-branding/#reverting-to-default-theme", "text": "If for any reason you wish to restore the default theme, select \"Use default (Gluu Inc.) theme\" in the admin dashboard.", "title": "Reverting to Default Theme"}, {"location": "casa/administration/custom-branding/#examples", "text": "Here are solutions for common use cases:", "title": "Examples"}, {"location": "casa/administration/custom-branding/#use-a-different-logo", "text": "Just replace images/logo.png (relative to the static directory) with your own image.", "title": "Use a different logo"}, {"location": "casa/administration/custom-branding/#use-a-different-favicon", "text": "Replace images/favicon.ico with your own image.", "title": "Use a Different Favicon"}, {"location": "casa/administration/custom-branding/#change-the-font-used-in-text", "text": "The vast majority of text that appears in the application uses the same font. To set the default font, locate at the bottom of style.css a declaration like @import url('https://fonts.googleapis.com... and point to one of your choosing. Check out this page to learn more about Google fonts. Then, scroll down and modify the html and body selectors appropriately with the font you picked. If you want to use your own fonts instead of Google's, you can use @font-face for this purpose. Copy your ttf , woff , svg or eot files somewhere in the static directory and link them appropriately. To use the more classical fonts like \"Helvetica\", \"Arial\", etc., simply update html and body selectors passing the font-family name.", "title": "Change the Font Used in Text"}, {"location": "casa/administration/faq/", "tags": ["Casa", "administration", "faq"], "text": "Frequently Asked Questions # Common administrative tasks # Where are the logs? # The application logs are located at /opt/jans/jetty/jans-casa/logs . By default, Casa uses the INFO level for messages. You can change the log level at will using the app's admin UI. How do I custom brand Casa? # We have a dedicated page covering the topic of custom branding here . What ports are used by the application? # Casa uses port 8080 . One way to see if the app is up and running is by checking whether this port is open by issuing a command like netstat -nltp . How to turn 2FA off for a user? # If a user has been locked out for any reason (e.g. lost devices), you can reset his \"authentication method\" to password by accessing the admin console and choosing the menu item labelled \"Reset users preference\". Type the username (or part of) in the text field and then press search. Once you locate the user in the result grid, click the corresponding row and then hit \"Change to password\". The row will become disabled, and you'll see a success message. If you've followed the steps as described above, next time he attempts to log in, he won't be asked to present any credentials other than password to enter. How to adjust the issuer for OTP tokens # When people add OTP mobile apps, the enrollment appears in the device associated with an \"issuer\", so it is easy to recognize where the OTPs generated can be used. To keep track of which OTPs are valid for which IDPs, the issuer property can be adjusted in flow io.jans.casa.authn.otp part of Casa Agama project - you can use TUI for this purpose. For example, you might want to set the issuer property to ACME Dev on your dev server, and ACME, Inc. on your production server. Errors shown in the UI # A page with a \"Service Temporarily Unavailable\" message appears when accessing the application # This is the 503 HTTP error. There is an Apache server in front of the application and this means the reverse proxy couldn't establish a communication internally with the app. This usually happens when Casa hasn't started completely, so it's usually a matter of waiting a few seconds. An \"Unauthorized access\" error is shown when accessing the application # This is caused by an unauthorized access attempt (e.g. users requesting URLs without ever logging in or after session has expired). \"An error occurred: Casa did not start properly\" is shown when accessing the application # This occurs whenever the application failed to start successfully. Check the log to diagnose the problem. Try to find a message like \"WEBAPP INITIALIZATION FAILED\" and see the traces above it. Often, error messages are self-explanatory. Once fixed, please restart the application. You will have to see a \"WEBAPP INITIALIZED SUCCESSFULLY\" message to know that it's working. Miscellanenous # Admin console is not shown # If you have logged in using an administrative account and cannot find any admin features in the UI ensure you have gone through these steps . A previously enabled method is not available anymore # Check if the plugin that contributed the given authentication method was removed. The out-of-the-box methods will always appear listed. What kind of TOTP/HOTP devices are supported? # Both soft (mobile apps) or hard tokens (keyfobs, cards, etc.) are supported. Supported algorithms are HmacSHA1 , HmacSHA256 , and HmacSHA512 . Authentication fails when using TOTP or HOTP with no apparent reason # For Time-based OTP, ensure the time of your server is correctly synchronized (use NTP for instance). The time lag of the authentication device used (for instance, a mobile phone) with respect to server time should not be representative. Big time differences can cause unsuccessful attempts to enroll TOTP credentials in Casa. For Event-based OTP (HOTP), ensure you are using a suitable value for look ahead window (we suggest at least 10). Check the configuration of flow io.jans.casa.authn.otp part of Casa Agama project - you can use TUI for this purpose. The user interface is not showing any means to enroll credentials # In the administration console, ensure one or more authentication methods have been enabled. A user cannot turn 2FA on # To turn 2FA on, the user has to have enrolled at least a certain number of credentials through the app. Only after this is met, he will be able to perform this action. In the administration console you can specify the minimum number of enrolled credentials needed to enable second factor authentication for users. Please check the 2FA Settings plugin for more details. My problem is not listed here # Feel free to ask Janssen Server community .", "title": "FAQ"}, {"location": "casa/administration/faq/#frequently-asked-questions", "text": "", "title": "Frequently Asked Questions"}, {"location": "casa/administration/faq/#common-administrative-tasks", "text": "", "title": "Common administrative tasks"}, {"location": "casa/administration/faq/#where-are-the-logs", "text": "The application logs are located at /opt/jans/jetty/jans-casa/logs . By default, Casa uses the INFO level for messages. You can change the log level at will using the app's admin UI.", "title": "Where are the logs?"}, {"location": "casa/administration/faq/#how-do-i-custom-brand-casa", "text": "We have a dedicated page covering the topic of custom branding here .", "title": "How do I custom brand Casa?"}, {"location": "casa/administration/faq/#what-ports-are-used-by-the-application", "text": "Casa uses port 8080 . One way to see if the app is up and running is by checking whether this port is open by issuing a command like netstat -nltp .", "title": "What ports are used by the application?"}, {"location": "casa/administration/faq/#how-to-turn-2fa-off-for-a-user", "text": "If a user has been locked out for any reason (e.g. lost devices), you can reset his \"authentication method\" to password by accessing the admin console and choosing the menu item labelled \"Reset users preference\". Type the username (or part of) in the text field and then press search. Once you locate the user in the result grid, click the corresponding row and then hit \"Change to password\". The row will become disabled, and you'll see a success message. If you've followed the steps as described above, next time he attempts to log in, he won't be asked to present any credentials other than password to enter.", "title": "How to turn 2FA off for a user?"}, {"location": "casa/administration/faq/#how-to-adjust-the-issuer-for-otp-tokens", "text": "When people add OTP mobile apps, the enrollment appears in the device associated with an \"issuer\", so it is easy to recognize where the OTPs generated can be used. To keep track of which OTPs are valid for which IDPs, the issuer property can be adjusted in flow io.jans.casa.authn.otp part of Casa Agama project - you can use TUI for this purpose. For example, you might want to set the issuer property to ACME Dev on your dev server, and ACME, Inc. on your production server.", "title": "How to adjust the issuer for OTP tokens"}, {"location": "casa/administration/faq/#errors-shown-in-the-ui", "text": "", "title": "Errors shown in the UI"}, {"location": "casa/administration/faq/#a-page-with-a-service-temporarily-unavailable-message-appears-when-accessing-the-application", "text": "This is the 503 HTTP error. There is an Apache server in front of the application and this means the reverse proxy couldn't establish a communication internally with the app. This usually happens when Casa hasn't started completely, so it's usually a matter of waiting a few seconds.", "title": "A page with a \"Service Temporarily Unavailable\" message appears when accessing the application"}, {"location": "casa/administration/faq/#an-unauthorized-access-error-is-shown-when-accessing-the-application", "text": "This is caused by an unauthorized access attempt (e.g. users requesting URLs without ever logging in or after session has expired).", "title": "An \"Unauthorized access\" error is shown when accessing the application"}, {"location": "casa/administration/faq/#an-error-occurred-casa-did-not-start-properly-is-shown-when-accessing-the-application", "text": "This occurs whenever the application failed to start successfully. Check the log to diagnose the problem. Try to find a message like \"WEBAPP INITIALIZATION FAILED\" and see the traces above it. Often, error messages are self-explanatory. Once fixed, please restart the application. You will have to see a \"WEBAPP INITIALIZED SUCCESSFULLY\" message to know that it's working.", "title": "\"An error occurred: Casa did not start properly\" is shown when accessing the application"}, {"location": "casa/administration/faq/#miscellanenous", "text": "", "title": "Miscellanenous"}, {"location": "casa/administration/faq/#admin-console-is-not-shown", "text": "If you have logged in using an administrative account and cannot find any admin features in the UI ensure you have gone through these steps .", "title": "Admin console is not shown"}, {"location": "casa/administration/faq/#a-previously-enabled-method-is-not-available-anymore", "text": "Check if the plugin that contributed the given authentication method was removed. The out-of-the-box methods will always appear listed.", "title": "A previously enabled method is not available anymore"}, {"location": "casa/administration/faq/#what-kind-of-totphotp-devices-are-supported", "text": "Both soft (mobile apps) or hard tokens (keyfobs, cards, etc.) are supported. Supported algorithms are HmacSHA1 , HmacSHA256 , and HmacSHA512 .", "title": "What kind of TOTP/HOTP devices are supported?"}, {"location": "casa/administration/faq/#authentication-fails-when-using-totp-or-hotp-with-no-apparent-reason", "text": "For Time-based OTP, ensure the time of your server is correctly synchronized (use NTP for instance). The time lag of the authentication device used (for instance, a mobile phone) with respect to server time should not be representative. Big time differences can cause unsuccessful attempts to enroll TOTP credentials in Casa. For Event-based OTP (HOTP), ensure you are using a suitable value for look ahead window (we suggest at least 10). Check the configuration of flow io.jans.casa.authn.otp part of Casa Agama project - you can use TUI for this purpose.", "title": "Authentication fails when using TOTP or HOTP with no apparent reason"}, {"location": "casa/administration/faq/#the-user-interface-is-not-showing-any-means-to-enroll-credentials", "text": "In the administration console, ensure one or more authentication methods have been enabled.", "title": "The user interface is not showing any means to enroll credentials"}, {"location": "casa/administration/faq/#a-user-cannot-turn-2fa-on", "text": "To turn 2FA on, the user has to have enrolled at least a certain number of credentials through the app. Only after this is met, he will be able to perform this action. In the administration console you can specify the minimum number of enrolled credentials needed to enable second factor authentication for users. Please check the 2FA Settings plugin for more details.", "title": "A user cannot turn 2FA on"}, {"location": "casa/administration/faq/#my-problem-is-not-listed-here", "text": "Feel free to ask Janssen Server community .", "title": "My problem is not listed here"}, {"location": "casa/administration/localization/", "tags": ["Casa", "administration", "localization"], "text": "Casa localization # Casa supports multilingual support through resource bundles. Administrators supply bundles as plaintext files ending with the .properties file extension. By default, Casa contains three bundles, each in a separate file. These bundles contain the internationalization labels in the English language, as displayed in a default Casa installation. For example, to add support for French, you would have to create the following files: File Description user_fr.properties Contains labels mostly found in user-facing pages admin_fr.properties Contains labels mostly found in administrator-facing pages general_fr.properties Contains labels found widely across the app and plugins Adding internationalization labels # To supply labels in a particular language (or even if you want to override the English translation provided), do the following: Log in to the Janssen Server using SSH Extract the Casa default labels: /opt/jre/bin/jar -xf /opt/jans/jetty/jans-casa/webapps/casa.war WEB-INF/classes/labels Run cp WEB-INF/classes/labels/*.properties . and delete WEB-INF dir: rm -R WEB-INF/ Add the appropriate suffix to the properties files found in the current directory, ie. _de for German, _es for Spanish, _ja for Japanese, etc. Edit the contents of files accordingly. Use UTF-8 encoding for opening and saving cd to /opt/jans/jetty/jans-casa/static Create directory i18n if it does not exist: mkdir i18n Transfer the properties files to the i18n folder Ensure jetty user has permission for reading the files Restart casa Log in to the application and review your work. Make necessary edits and repeat the process. How are labels picked? # In Casa, the rule for displaying contents is leveraged from the underlying framework . In short, the locale to use per session is picked based on the end-user browser settings. As an example, if the browser was configured to use U.S. English, the locale will be en_US . This means that files ending in _en_US.properties will be considered first. Then, the country suffix is removed and thus _en.properties is looked up. Finally the non-suffixed ones are considered, that is, the default label files bundled with Casa. Additionally, end users can pick the language of their preference by selecting a language item from the dropdown list appearing at the bottom of any Casa page. The list is only shown if there are two or more languages available to display. Localization in plugins # Plugins also support localization through the \"zk-label\" bundle. If you have installed plugins developed by Gluu, they will only contain a single default English file. To add your own translation for plugin texts, proceed as follows: cd to the folder where you stored the jar file of the plugin of interest. Extract the plugin's default labels (requires Java bin on your path): jar -xf JAR_FILE labels/zk-label.properties cd to labels folder Add the appropriate suffix to the properties file, ie. _de for German, _es for Spanish, _ja for Japanese, etc. Edit the contents accordingly. Use UTF-8 encoding for opening and saving Connect to your Janssen Server using SSH cd to /opt/jans/jetty/jans-casa/static Create directory i18n if it does not exist: mkdir i18n Transfer the properties file to the i18n folder Ensure jetty user has permission for reading Restart casa Note If your plugins have a zk-label.properties , you can accumulate all plugin texts into a single file, or you can use a different filename for each plugin. Properties file syntax # Administrators acquainted with the format used for properties files in Java will find Casa resource bundle files familiar. The format used in Casa differs slightly, but it is more powerful. To learn more about this topic, visit this page . Tips # Not all entries present in default label files have to be translated in your own localized versions. If you are comfortable with the current text for a particular entry, you can simply remove it to use the one in the default files. There is no need to supply specific translations for countries. While supported, most of time it suffices to create files suffixed with the language code, for instance _es , and not with country code (e.g _es_CO , _es_AR , _es_EC , _es_ES , etc.) Actual filenames for properties files are not relevant. Upon start, Casa will parse all properties files present in i18n folder.", "title": "Localization"}, {"location": "casa/administration/localization/#casa-localization", "text": "Casa supports multilingual support through resource bundles. Administrators supply bundles as plaintext files ending with the .properties file extension. By default, Casa contains three bundles, each in a separate file. These bundles contain the internationalization labels in the English language, as displayed in a default Casa installation. For example, to add support for French, you would have to create the following files: File Description user_fr.properties Contains labels mostly found in user-facing pages admin_fr.properties Contains labels mostly found in administrator-facing pages general_fr.properties Contains labels found widely across the app and plugins", "title": "Casa localization"}, {"location": "casa/administration/localization/#adding-internationalization-labels", "text": "To supply labels in a particular language (or even if you want to override the English translation provided), do the following: Log in to the Janssen Server using SSH Extract the Casa default labels: /opt/jre/bin/jar -xf /opt/jans/jetty/jans-casa/webapps/casa.war WEB-INF/classes/labels Run cp WEB-INF/classes/labels/*.properties . and delete WEB-INF dir: rm -R WEB-INF/ Add the appropriate suffix to the properties files found in the current directory, ie. _de for German, _es for Spanish, _ja for Japanese, etc. Edit the contents of files accordingly. Use UTF-8 encoding for opening and saving cd to /opt/jans/jetty/jans-casa/static Create directory i18n if it does not exist: mkdir i18n Transfer the properties files to the i18n folder Ensure jetty user has permission for reading the files Restart casa Log in to the application and review your work. Make necessary edits and repeat the process.", "title": "Adding internationalization labels"}, {"location": "casa/administration/localization/#how-are-labels-picked", "text": "In Casa, the rule for displaying contents is leveraged from the underlying framework . In short, the locale to use per session is picked based on the end-user browser settings. As an example, if the browser was configured to use U.S. English, the locale will be en_US . This means that files ending in _en_US.properties will be considered first. Then, the country suffix is removed and thus _en.properties is looked up. Finally the non-suffixed ones are considered, that is, the default label files bundled with Casa. Additionally, end users can pick the language of their preference by selecting a language item from the dropdown list appearing at the bottom of any Casa page. The list is only shown if there are two or more languages available to display.", "title": "How are labels picked?"}, {"location": "casa/administration/localization/#localization-in-plugins", "text": "Plugins also support localization through the \"zk-label\" bundle. If you have installed plugins developed by Gluu, they will only contain a single default English file. To add your own translation for plugin texts, proceed as follows: cd to the folder where you stored the jar file of the plugin of interest. Extract the plugin's default labels (requires Java bin on your path): jar -xf JAR_FILE labels/zk-label.properties cd to labels folder Add the appropriate suffix to the properties file, ie. _de for German, _es for Spanish, _ja for Japanese, etc. Edit the contents accordingly. Use UTF-8 encoding for opening and saving Connect to your Janssen Server using SSH cd to /opt/jans/jetty/jans-casa/static Create directory i18n if it does not exist: mkdir i18n Transfer the properties file to the i18n folder Ensure jetty user has permission for reading Restart casa Note If your plugins have a zk-label.properties , you can accumulate all plugin texts into a single file, or you can use a different filename for each plugin.", "title": "Localization in plugins"}, {"location": "casa/administration/localization/#properties-file-syntax", "text": "Administrators acquainted with the format used for properties files in Java will find Casa resource bundle files familiar. The format used in Casa differs slightly, but it is more powerful. To learn more about this topic, visit this page .", "title": "Properties file syntax"}, {"location": "casa/administration/localization/#tips", "text": "Not all entries present in default label files have to be translated in your own localized versions. If you are comfortable with the current text for a particular entry, you can simply remove it to use the one in the default files. There is no need to supply specific translations for countries. While supported, most of time it suffices to create files suffixed with the language code, for instance _es , and not with country code (e.g _es_CO , _es_AR , _es_EC , _es_ES , etc.) Actual filenames for properties files are not relevant. Upon start, Casa will parse all properties files present in i18n folder.", "title": "Tips"}, {"location": "casa/administration/quick-start/", "tags": ["Casa", "quick start"], "text": "Jans Casa Quick Start Guide # Note This document is intended for administrators only. Learn here how to \"grant\" administrative privileges for Casa. Use this guide to install and configure your Casa deployment. Installation # Jans Casa can be used with Janssen Server or Gluu Flex Server . At installation time (applies to any of these two products), you will be prompted if you desire to include Casa. If you want to add Casa post-installation, you will simply have to re-run the installer and ensure to select Casa. Configuration # Enable authentication methods # The \"out-of-the-box\" login experience in Casa consists of the usual username and password prompt. To start leveraging a stronger authentication login to Casa with an administrative account (visit https:///jans-casa ) and activate the methods you want to offer Casa users. Important notes : Usage of OTP via SMS requires the setup of a Twilio account and populating configuration properties of flow io.jans.casa.authn.twilio_sms found in Casa Agama project. You can do the latter via TUI . We encourage you to use the online Twilio testing tools beforehand to ensure you can send SMS to the countries you are targetting Usage of Super Gluu has some preliminar requisites described here Add the strong authentication settings plugin # This step is optional. Check this page for more information. Use this plugin if you need to exercise an advanced control on how 2FA behaves in your Casa deployment. Test enrollment and 2FA # Do the following steps using a testing account with no administrative privileges: Login to Casa. Only username and password should be prompted Use the menu on the left to access the screens from which enrollment of credentials can be performed Ensure at least two credentials have been added. In the home page, turn on 2FA Log off and log back in. From now on, besides username and password, one credential has to be presented to get access Click here to learn more about 2FA in Casa. Finish configuration # Once you are done with testing, you may use casa as the default authentication method of Janssen Server using TUI to log in users via Casa for all applications the server protects. Finally, as a security measure you can thoroughly disable access to the administrative console of Casa by following the steps below: Connect to your server Navigate to /opt/jans/jetty/jans-casa remove file .administrable (ie. rm .administrable ) If you want to make the admin console available again you need to recreate the marker file: Create an empty file (eg. touch .administrable ) Run chown casa:casa .administrable (do this only if you are on FIPS environment) Logout in case you have an open browser session, and login again Check out available plugins # Browse our catalog of plugins to add features and expand Casa!.", "title": "Quick Start"}, {"location": "casa/administration/quick-start/#jans-casa-quick-start-guide", "text": "Note This document is intended for administrators only. Learn here how to \"grant\" administrative privileges for Casa. Use this guide to install and configure your Casa deployment.", "title": "Jans Casa Quick Start Guide"}, {"location": "casa/administration/quick-start/#installation", "text": "Jans Casa can be used with Janssen Server or Gluu Flex Server . At installation time (applies to any of these two products), you will be prompted if you desire to include Casa. If you want to add Casa post-installation, you will simply have to re-run the installer and ensure to select Casa.", "title": "Installation"}, {"location": "casa/administration/quick-start/#configuration", "text": "", "title": "Configuration"}, {"location": "casa/administration/quick-start/#enable-authentication-methods", "text": "The \"out-of-the-box\" login experience in Casa consists of the usual username and password prompt. To start leveraging a stronger authentication login to Casa with an administrative account (visit https:///jans-casa ) and activate the methods you want to offer Casa users. Important notes : Usage of OTP via SMS requires the setup of a Twilio account and populating configuration properties of flow io.jans.casa.authn.twilio_sms found in Casa Agama project. You can do the latter via TUI . We encourage you to use the online Twilio testing tools beforehand to ensure you can send SMS to the countries you are targetting Usage of Super Gluu has some preliminar requisites described here", "title": "Enable authentication methods"}, {"location": "casa/administration/quick-start/#add-the-strong-authentication-settings-plugin", "text": "This step is optional. Check this page for more information. Use this plugin if you need to exercise an advanced control on how 2FA behaves in your Casa deployment.", "title": "Add the strong authentication settings plugin"}, {"location": "casa/administration/quick-start/#test-enrollment-and-2fa", "text": "Do the following steps using a testing account with no administrative privileges: Login to Casa. Only username and password should be prompted Use the menu on the left to access the screens from which enrollment of credentials can be performed Ensure at least two credentials have been added. In the home page, turn on 2FA Log off and log back in. From now on, besides username and password, one credential has to be presented to get access Click here to learn more about 2FA in Casa.", "title": "Test enrollment and 2FA"}, {"location": "casa/administration/quick-start/#finish-configuration", "text": "Once you are done with testing, you may use casa as the default authentication method of Janssen Server using TUI to log in users via Casa for all applications the server protects. Finally, as a security measure you can thoroughly disable access to the administrative console of Casa by following the steps below: Connect to your server Navigate to /opt/jans/jetty/jans-casa remove file .administrable (ie. rm .administrable ) If you want to make the admin console available again you need to recreate the marker file: Create an empty file (eg. touch .administrable ) Run chown casa:casa .administrable (do this only if you are on FIPS environment) Logout in case you have an open browser session, and login again", "title": "Finish configuration"}, {"location": "casa/administration/quick-start/#check-out-available-plugins", "text": "Browse our catalog of plugins to add features and expand Casa!.", "title": "Check out available plugins"}, {"location": "casa/developer/add-authn-methods/", "tags": ["Casa", "developer guide"], "text": "Onboarding custom authentication methods # Out-of-the-box Casa supports some useful authentication methods for a secure, pleasant authentication experience. Adding more authentication mechanisms is possible and requires certain development effort. In this guide we summarize the steps required to do so and give you some useful pointers to start your coding journey. Supporting a new authentication mechanisms consists of two tasks: coding an Agama flow and creating a plugin that contributes an authentication method. The former has to do with the authentication flow the user experiences (to access Casa or other apps), while the latter with the credential enrollment process. Agama flow # Note Acquaintance with Agama framework and Agama project management is required About Casa authentication flow # Authentication in Casa is implemented through an Agama project called casa - in TUI you can see it listed in the Agama management screen. As a first step, the user is requested to enter the username and password combination, then depending on how the application is configured, personal user settings, and access policies defined, a second factor may be requested. The casa project allows to onboard new types of second factors (authentication mechanisms) and also provides a user experience that supports backtracking: if a user is asked to present a specific credential and that credential is not currently available or is not working, he can choose an alternative method for authentication where a different type of credential will be prompted. Users can backtrack several times. Flow requisites # To code the flow corresponding to the authentication method to add, you can use the Agama project found here as a canvas. Ensure the following conditions are met so that it properly integrates in the main Casa flow: The flow will be passed an Agama map containing information of the person attempting the authentication. This input parameter will contain at least three keys: uid , inum , and name . uid and inum map directly to attributes stored in the user's profile and are never empty, name is a displayable name which may come from attribute givenName or displayName . All values are strings . The flow should terminate with a true outcome if the user successfully passes the challenge, presents the expected credential, etc. In any other case, false must be returned and an optional error message can be included for the caller flow ( io.jans.casa.authn.main ) to show it in the screen. Any additional data attached in the Finish instruction will not be processed. If for some reason your flow crashes, the corresponding exception will be printed to the logs, the caller will continue running, and the browser taken to the selector page where an error message will be displayed. Note your project may contain more flows to serve as utilitarians or simply to break down the authentication flow into smaller, more manageable pieces. About templates # Regarding UI templates, it is recommended to re-use a couple of Freemarker macros available in the casa project. This will allow your flow's UI to have the same look-and-feel of flows bundled out-of-the box, like OTP and fido. Additionally this will allow to properly incorporate backtracking. Import the commons template in your UI page: <#import \"../kz1vc3/commons.ftlh\" as com> Copy the above line of code in the first line of your templates, preferably. Note you may need to add extra ../ fragments in the path to commons.ftlh depending on the directory level where your template resides inside the web subdirectory of your Agama project. Then call the main macro and supply your markup, like this: <@com.main> <@com.main> The above will generate a page incorporating the required CSS files and will render the header and footer appropriately while leaving your content in the center of the page. The casa project makes heavy use the Tachyons CSS. You may like to use those for building templates instead of incorporating yet another styling framework. It is highly recommended to include the following near the bottom of your markup (still inside the main call block): <@com.alternative /> This will render a form with a text and a link that will allow users to \"escape\" from your flow and take another route, i.e. to backtrack: Then, in your flow's code, you handle the escape this way: data = RRF \"mytemplate.ftlh\" ... When data.skipped is \"\" Finish false The above means your flow can finish with false not only if the authentication did not succeed but also when users wants to backtrack. The selector page # When backtracking, a selector page is shown where all available methods for the given user are displayed - sorted by strength. From here, the user can take another route to be challenged for an alternative credential. Every element in the list has an icon and descriptive text associated. These elements are configurable and for the case of adding an authentication method, both icon and text should be supplied. To do so, locate in TUI the casa Agama project. See how the flow io.jans.casa.authn.main has a selector section in its configurations. This is a dictionary (JSON object) where keys are qualified names of flows and values are dictionaries at the same time - this where you can provide the required info. For example, if your authentication method is backed by a flow com.acme.authn.food , the casa project configuration may look like { \"io.jans.casa.authn.main\": { \"selector\": { \"com.acme.authn.food\": { \"icon\": \"\", \"text\": \"A sentence describing what the user is supposed to present in the next screen\" }, ... } }, ... } Alternatively, a pointer to a localized message can be used instead of text . This is the recommended practice if localization/internationalization is relevant. In this case, something like the below will work: ... \"com.acme.authn.food\": { \"icon\": \"\", \"textKey\": \"foodAuth.methodTitle\" } ... as long as the message key foodAuth.methodTitle is defined in the project's labels.txt file, or elsewhere in another project. Note textKey takes precedence over text when rendering the page. Both icon and textKey (or text ) may contain HTML markup. In this example we are using the font awesome library available in the selector page for rendering a nice icon but we could have used any other thing here like an img tag, for instance. Ensure to properly escape double quotes if necessary. Also make the markup a one-liner: JSON strings cannot span several lines. Recommended practices # Note Ensure to go through this page before proceeding Config settings # Use a single place to store configuration settings for your authentication method. The most convenient place is in the Agama project itself. You may have configs associated to each flow in your project and they can be accessed directly in your flows code. Additionally, they can be easily read from your plugin's Java code this way: ips = io.jans.casa.misc.Utils.managedBean(IPersistenceService.class); JSONObject p = ips.getAgamaFlowConfigProperties(\"flow qname\"); Out-of-the-box methods in Casa employ this strategy. Also when you do this, every time a change in project configuration is detected, your Java code gets notified: a call to method reloadConfiguration of your extension is issued, see class SampleCredentialAuthnMethod in the sample credential plugin. Retries # Giving the user only one chance to pass an authentication challenge is unfair. Code your flow so users have a couple of opportunities to fail before finishing with false as outcome. Agama's Repeat directive helps you cover this case. Key questions # As you try to assemble your project, you will come up with some design decisions, for instance: How to model and store credentials associated to the authentication method? What kind of parameters are relevant for the authentication method? What's the algorithm for authenticating users once they have supplied a valid username/password combination? Depending on the answers, you may like to start instead with plugin development first. This is not always the case though, however, getting your hands on the plugin might help unclutter the path. Enrollment plugin # Coding a Casa plugin is mainly a Java development task. You can use the \"Sample credential\" plugin as a template to start the work. Ensure you have: A Jans Server installation that includes Jans Casa - prefer a VM environment over the CN edition for development purposes. Also, you'll need a way to connect to your server via SSH A copy of the Jans repository (a shallow clone of main branch is OK): https://github.com/JanssenProject/jans Plugin deployment # Start with deploying the plugin to get acquainted with the process: In the local development machine, cd to ./jans/jans-casa/plugins/samples/sample-cred Run mvn -Dmaven.test.skip package . This may take several minutes (lots of network requests). Once you get it done, the next time you can add the -o switch (offline mode) for faster results A target folder with a couple of jar files in it will be generated Access Casa admin console and in the plugins page, upload the file suffixed with jar-with-dependencies.jar . After one minute approximately, visit the \"Authentication methods\" page, check the \"Favorite color\" widget, and click on \"Save\". Then logout. Login again, this time with a non administrative account. In the landing page (user's dashboard), an item labeled \"Your favorite color\" will be shown on the left (under the \"2FA credentials\" heading). Also, a panel in the central area of the page will be added in accordance. Click on \"Your favorite color\" and you'll land a page to let Casa know what your favorite color is!. This color will be used as a second factor for authentication. Ensure you have enabled another method such as OTP so you can enroll an additional credential in order to be able to active 2FA for this account. Study the sample project # Now it's time for you to go through the project folder checking one file at a time. Most of files contain comments that explain the purpose of things. Ensure you make a deep inspection of file ./src/main/resources/assets/user/cred_details.zul . It contains the markup of the page you visited earlier. Make an excursion to interface AuthnMethod found in shared maven module. Note it brings a couple of default methods. Class SampleCredentialAuthnMethod implements this interface. Editing the project # Modifying the project may require you to edit files mainly with .java , .zul , or .properties extensions. Most Java classes used in this plugin can be found in: The repository you cloned earlier The ZK framework documentation Standard Java SE API docs You can remove the plugin and add it as many times as you like - no restarts are needed unless things go really weird. You can do so either via the admin console or by dropping/removing the file directly in the filesystem (the path is /opt/jans/jetty/jans-casa/plugins ). Page tweaks # If you alter a .zul file and then package and redeploy the plugin, you will most probably not see any change taking effect in the UI page. This is because the ZK framework caches the .zul pages by default for a very long period. To change this behavior do the following: Connect to your VM and cd to /opt/gluu/jetty/jans-casa/webapps Extract ZK descriptor: # jar -xf jans-casa.war WEB-INF/zk.xml Locate XML tag file-check-period and remove it including its surrounding parent desktop-config Save the file and patch the application war: # jar -uf jans-casa.war WEB-INF/zk.xml Restart casa (e.g. systemctl casa restart ) From now on, any template change will take effect after 5 seconds.", "title": "Adding authentication methods"}, {"location": "casa/developer/add-authn-methods/#onboarding-custom-authentication-methods", "text": "Out-of-the-box Casa supports some useful authentication methods for a secure, pleasant authentication experience. Adding more authentication mechanisms is possible and requires certain development effort. In this guide we summarize the steps required to do so and give you some useful pointers to start your coding journey. Supporting a new authentication mechanisms consists of two tasks: coding an Agama flow and creating a plugin that contributes an authentication method. The former has to do with the authentication flow the user experiences (to access Casa or other apps), while the latter with the credential enrollment process.", "title": "Onboarding custom authentication methods"}, {"location": "casa/developer/add-authn-methods/#agama-flow", "text": "Note Acquaintance with Agama framework and Agama project management is required", "title": "Agama flow"}, {"location": "casa/developer/add-authn-methods/#about-casa-authentication-flow", "text": "Authentication in Casa is implemented through an Agama project called casa - in TUI you can see it listed in the Agama management screen. As a first step, the user is requested to enter the username and password combination, then depending on how the application is configured, personal user settings, and access policies defined, a second factor may be requested. The casa project allows to onboard new types of second factors (authentication mechanisms) and also provides a user experience that supports backtracking: if a user is asked to present a specific credential and that credential is not currently available or is not working, he can choose an alternative method for authentication where a different type of credential will be prompted. Users can backtrack several times.", "title": "About Casa authentication flow"}, {"location": "casa/developer/add-authn-methods/#flow-requisites", "text": "To code the flow corresponding to the authentication method to add, you can use the Agama project found here as a canvas. Ensure the following conditions are met so that it properly integrates in the main Casa flow: The flow will be passed an Agama map containing information of the person attempting the authentication. This input parameter will contain at least three keys: uid , inum , and name . uid and inum map directly to attributes stored in the user's profile and are never empty, name is a displayable name which may come from attribute givenName or displayName . All values are strings . The flow should terminate with a true outcome if the user successfully passes the challenge, presents the expected credential, etc. In any other case, false must be returned and an optional error message can be included for the caller flow ( io.jans.casa.authn.main ) to show it in the screen. Any additional data attached in the Finish instruction will not be processed. If for some reason your flow crashes, the corresponding exception will be printed to the logs, the caller will continue running, and the browser taken to the selector page where an error message will be displayed. Note your project may contain more flows to serve as utilitarians or simply to break down the authentication flow into smaller, more manageable pieces.", "title": "Flow requisites"}, {"location": "casa/developer/add-authn-methods/#about-templates", "text": "Regarding UI templates, it is recommended to re-use a couple of Freemarker macros available in the casa project. This will allow your flow's UI to have the same look-and-feel of flows bundled out-of-the box, like OTP and fido. Additionally this will allow to properly incorporate backtracking. Import the commons template in your UI page: <#import \"../kz1vc3/commons.ftlh\" as com> Copy the above line of code in the first line of your templates, preferably. Note you may need to add extra ../ fragments in the path to commons.ftlh depending on the directory level where your template resides inside the web subdirectory of your Agama project. Then call the main macro and supply your markup, like this: <@com.main> <@com.main> The above will generate a page incorporating the required CSS files and will render the header and footer appropriately while leaving your content in the center of the page. The casa project makes heavy use the Tachyons CSS. You may like to use those for building templates instead of incorporating yet another styling framework. It is highly recommended to include the following near the bottom of your markup (still inside the main call block): <@com.alternative /> This will render a form with a text and a link that will allow users to \"escape\" from your flow and take another route, i.e. to backtrack: Then, in your flow's code, you handle the escape this way: data = RRF \"mytemplate.ftlh\" ... When data.skipped is \"\" Finish false The above means your flow can finish with false not only if the authentication did not succeed but also when users wants to backtrack.", "title": "About templates"}, {"location": "casa/developer/add-authn-methods/#the-selector-page", "text": "When backtracking, a selector page is shown where all available methods for the given user are displayed - sorted by strength. From here, the user can take another route to be challenged for an alternative credential. Every element in the list has an icon and descriptive text associated. These elements are configurable and for the case of adding an authentication method, both icon and text should be supplied. To do so, locate in TUI the casa Agama project. See how the flow io.jans.casa.authn.main has a selector section in its configurations. This is a dictionary (JSON object) where keys are qualified names of flows and values are dictionaries at the same time - this where you can provide the required info. For example, if your authentication method is backed by a flow com.acme.authn.food , the casa project configuration may look like { \"io.jans.casa.authn.main\": { \"selector\": { \"com.acme.authn.food\": { \"icon\": \"\", \"text\": \"A sentence describing what the user is supposed to present in the next screen\" }, ... } }, ... } Alternatively, a pointer to a localized message can be used instead of text . This is the recommended practice if localization/internationalization is relevant. In this case, something like the below will work: ... \"com.acme.authn.food\": { \"icon\": \"\", \"textKey\": \"foodAuth.methodTitle\" } ... as long as the message key foodAuth.methodTitle is defined in the project's labels.txt file, or elsewhere in another project. Note textKey takes precedence over text when rendering the page. Both icon and textKey (or text ) may contain HTML markup. In this example we are using the font awesome library available in the selector page for rendering a nice icon but we could have used any other thing here like an img tag, for instance. Ensure to properly escape double quotes if necessary. Also make the markup a one-liner: JSON strings cannot span several lines.", "title": "The selector page"}, {"location": "casa/developer/add-authn-methods/#recommended-practices", "text": "Note Ensure to go through this page before proceeding", "title": "Recommended practices"}, {"location": "casa/developer/add-authn-methods/#config-settings", "text": "Use a single place to store configuration settings for your authentication method. The most convenient place is in the Agama project itself. You may have configs associated to each flow in your project and they can be accessed directly in your flows code. Additionally, they can be easily read from your plugin's Java code this way: ips = io.jans.casa.misc.Utils.managedBean(IPersistenceService.class); JSONObject p = ips.getAgamaFlowConfigProperties(\"flow qname\"); Out-of-the-box methods in Casa employ this strategy. Also when you do this, every time a change in project configuration is detected, your Java code gets notified: a call to method reloadConfiguration of your extension is issued, see class SampleCredentialAuthnMethod in the sample credential plugin.", "title": "Config settings"}, {"location": "casa/developer/add-authn-methods/#retries", "text": "Giving the user only one chance to pass an authentication challenge is unfair. Code your flow so users have a couple of opportunities to fail before finishing with false as outcome. Agama's Repeat directive helps you cover this case.", "title": "Retries"}, {"location": "casa/developer/add-authn-methods/#key-questions", "text": "As you try to assemble your project, you will come up with some design decisions, for instance: How to model and store credentials associated to the authentication method? What kind of parameters are relevant for the authentication method? What's the algorithm for authenticating users once they have supplied a valid username/password combination? Depending on the answers, you may like to start instead with plugin development first. This is not always the case though, however, getting your hands on the plugin might help unclutter the path.", "title": "Key questions"}, {"location": "casa/developer/add-authn-methods/#enrollment-plugin", "text": "Coding a Casa plugin is mainly a Java development task. You can use the \"Sample credential\" plugin as a template to start the work. Ensure you have: A Jans Server installation that includes Jans Casa - prefer a VM environment over the CN edition for development purposes. Also, you'll need a way to connect to your server via SSH A copy of the Jans repository (a shallow clone of main branch is OK): https://github.com/JanssenProject/jans", "title": "Enrollment plugin"}, {"location": "casa/developer/add-authn-methods/#plugin-deployment", "text": "Start with deploying the plugin to get acquainted with the process: In the local development machine, cd to ./jans/jans-casa/plugins/samples/sample-cred Run mvn -Dmaven.test.skip package . This may take several minutes (lots of network requests). Once you get it done, the next time you can add the -o switch (offline mode) for faster results A target folder with a couple of jar files in it will be generated Access Casa admin console and in the plugins page, upload the file suffixed with jar-with-dependencies.jar . After one minute approximately, visit the \"Authentication methods\" page, check the \"Favorite color\" widget, and click on \"Save\". Then logout. Login again, this time with a non administrative account. In the landing page (user's dashboard), an item labeled \"Your favorite color\" will be shown on the left (under the \"2FA credentials\" heading). Also, a panel in the central area of the page will be added in accordance. Click on \"Your favorite color\" and you'll land a page to let Casa know what your favorite color is!. This color will be used as a second factor for authentication. Ensure you have enabled another method such as OTP so you can enroll an additional credential in order to be able to active 2FA for this account.", "title": "Plugin deployment"}, {"location": "casa/developer/add-authn-methods/#study-the-sample-project", "text": "Now it's time for you to go through the project folder checking one file at a time. Most of files contain comments that explain the purpose of things. Ensure you make a deep inspection of file ./src/main/resources/assets/user/cred_details.zul . It contains the markup of the page you visited earlier. Make an excursion to interface AuthnMethod found in shared maven module. Note it brings a couple of default methods. Class SampleCredentialAuthnMethod implements this interface.", "title": "Study the sample project"}, {"location": "casa/developer/add-authn-methods/#editing-the-project", "text": "Modifying the project may require you to edit files mainly with .java , .zul , or .properties extensions. Most Java classes used in this plugin can be found in: The repository you cloned earlier The ZK framework documentation Standard Java SE API docs You can remove the plugin and add it as many times as you like - no restarts are needed unless things go really weird. You can do so either via the admin console or by dropping/removing the file directly in the filesystem (the path is /opt/jans/jetty/jans-casa/plugins ).", "title": "Editing the project"}, {"location": "casa/developer/add-authn-methods/#page-tweaks", "text": "If you alter a .zul file and then package and redeploy the plugin, you will most probably not see any change taking effect in the UI page. This is because the ZK framework caches the .zul pages by default for a very long period. To change this behavior do the following: Connect to your VM and cd to /opt/gluu/jetty/jans-casa/webapps Extract ZK descriptor: # jar -xf jans-casa.war WEB-INF/zk.xml Locate XML tag file-check-period and remove it including its surrounding parent desktop-config Save the file and patch the application war: # jar -uf jans-casa.war WEB-INF/zk.xml Restart casa (e.g. systemctl casa restart ) From now on, any template change will take effect after 5 seconds.", "title": "Page tweaks"}, {"location": "casa/developer/overview/", "tags": ["Casa", "developer guide"], "text": "Developer guide # This page gives developers relevant pointers for several tasks including: Plugins development Configuration management Credentials enrollment Customization of Casa's authentication flow Plugins # A plugin is an artifact packaged in a Java ARchive ( jar file) that augments the functionalities available in your default Casa installation. The following is by no means an extensive list of things you can add via plugins: Menu items in user's menu, top-right dropdown menu, or admin's dashboard menu UI pages with arbitrary content (and backend-functionality!), this also applies for the admin dashboard Static files (e.g. Javascript, images, stylesheets, etc.) REST services Authentication mechanisms to be supported by the application In addition to the above: Any plugin can have easy access to the underlying Jans Server database Plugins can onboard their own libraries (jar files) and classes Tools # Acquaintance with the following technologies is recommended: Java 11 or higher, maven ZK 9 framework PF4J framework HTML/CSS/Javascript The underlying database engine used by your Jans Server installation, e.g. PostgreSQL, MySQL, etc. Sample plugins # The best way to start learning Casa plugin development is by playing with the sample plugins you can find here . Clone the repository (a shallow clone of main branch is fine), cd to one of the directories in the folder and run mvn package , then upload the resulting jar-with-dependencies through the administration console. Configuration management # Most aspects of Casa that are configurable through the admin console UI can be programmatically operated using the configuration API. A formal description can be found here . Note all endpoints are protected by OAuth tokens which must have the https://jans.io/casa.config scope. Credentials enrollment # Casa has enrollment capabilities built-in but there are use cases where credential enrollment needs to happen elsewhere in your app ecosystem. A typical scenario is in a user registration application, where users are asked to enroll strong authentication credentials during account creation. To facilitate these tasks, Casa exposes APIs for enrolling the following types of authenticators: Phone numbers for SMS OTP OTP apps or tokens FIDO2 security keys Note Per spec FIDO 2 credentials can only be enrolled from a page belonging to the same domain or subdomain of your Gluu Server. In addition to the above, the API also provides endpoints to query the number/type of credentials currently enrolled by a user as well as means to turn 2FA on and off. Customizing the authentication flow # The authentication experience the user faces when trying to access Casa is implemented in an Agama project which is attached to the authentication server when Casa is installed. As with all authentication flows in Janssen, they belong to (run in the context of) the jans-auth application. This distinction is important because jans-auth and casa are separate Java webapps executed on different Jetty instances. In Casa flow, the user is requested to enter the username and password combination, then depending on how the application is configured, personal user settings, and access policies defined, a second factor may be requested. While this may cater most companies requirements, sometimes there is the need to customize the authentication experience. In fact, Agama facilitates this by design. Here are some things companies would like to do: Alter the UI pages - e.g. look-and-feel, structure, etc. Support more authentication methods Add links to the initial screen to take users to different authentication paths, for instance, to leverage social sites login Include an account registration process Include an extra final screen in case of password expiration Add a \"forgot password\" link Important You might be tempted to take the Agama project archive, apply some editions, add files to it, repack, and redeploy it. While this might seem the easiest thing to do, it is also the worst thing to do. Authentication journeys can be extended/tailored by means of creating additional projects. Try not to hack/patch the original project. Casa ACR update # Given the warning above, there has to be a way to launch a different Agama flow than the one used by default to log into Casa. This can be achieved by supplying a value for Casa's acr startup variable: in VM-based installations, locate the file /etc/default/casa in and modify the variable as needed. The format is agama_ . Then restart Casa. Requisites # Regardless of the customization required, it is desirable to get acquaintance with Agama framework . This is a good time to go through the Agama developer guide pages found in the Administration section of Jans Server docs. Specifically, several of the Agama advanced usages will help you materialize your requirements. Extract the Agama project to your development machine. It is useful to get an idea of how and what the out-of-the-box project does. Also, keep the Freemarker manual at hand. Page customizations # The UI pages of the default Casa flow resemble the design of the Casa app itself. Also, modifications applied through the \"custom branding\" functionalities are automatically reflected in flow pages without any sort of intervention. This is neat, but if you need to go further, you will have to code the UI pages your own based on the existing ones. For this purpose, create a new Agama project with one flow in it. Pick one of the pages you want to change from the original project and build your own - initially keep it really simple: a dummy page is OK. From your new flow, use the Trigger directive to launch flow io.jans.casa.authn.main . Add an Override templates directive to your Trigger so the page in Casa project is superseded by the page you are creating. This is explained here . Pack your new project and deploy it. Wait for around 30 seconds and try to log into Casa to see the changes. Note you have to configure casa so your flow is launched, not the default one, ie. io.jans.casa.authn.main . This was explained earlier . Do as many changes as needed to your page. Then pick another page to alter and feed your Override templates accordingly. Repeat until your are done. Recall there is no need to restart jans-auth or casa . In some cases, the original look-and-feel may be satisfying but it's the text content what you would like to change. Agama engine supports localization and internationalization as explained here so you can supply translated messages in your own project and make templates use those. Note Casa is only bundled with a set of \"default\" labels out-of-the box and thus pages don't change content regardless of browser's language or location. By overriding templates and providing labels in several languages, you can achieve full localization/internationalization in the authentication UI. Support more authentication methods # This is probably the most common requirement. Visit this page to learn more. Other forms of customization # Most forms of customization can be tackled using flow cancellation. Through cancellation, a flow can be aborted while running and the control returned to one of its callers. Learn more about this topic here . As an example, let's assume you want to add a \"don't have an account? register here\" button in the initial screen of Casa flow. Here's what you can do: Create a new Agama project with one flow in it. Copy the page that prompts username and password into your project. Below the login button, add a form containing markup like In your flow, let's call it A , use the Trigger directive to launch flow io.jans.casa.authn.main . Add an Override templates directive to your Trigger so the original login page in Casa project is superseded by the page you created Create another flow, let's call it B . This will be the \"registration\" flow which will present one or more screens to grab data in order to create an account for the user. Make B finish with true outcome if the account was successfully created, otherwise finish with false Back in flow A , add code to check if io.jans.casa.authn.main was aborted, if so, launch flow B . For simplicity, if B didn't go well, terminate A If B went well, show the original login form, that is, no registration button this time Add code for termination So flow A will end up looking more or less like this: ... result = Trigger io.jans.casa.authn.main Override templates \"kz1vc3/main.ftlh\" \"newPage.ftlh\" When result.aborted is true //registration button was clicked result = Trigger B When result.success is false Finish false result = Trigger io.jans.casa.authn.main Finish result Here we have taken a simplistic approach to make the example concise. In practice you may like to be more elaborated and include an \"already have an account?\" button in the registration page, which could create a sort of navigational loop. Here the Repeat directive will emerge in your code for sure. Note When trying to customize an existing flow, familiarize with all possible paths the flow can take you to. Consider all possible screens and determine which require adjustments and the points at which cancellation is of use. Sometimes you will have to glance its .flow file (Agama code) to get a better idea.", "title": "Overview"}, {"location": "casa/developer/overview/#developer-guide", "text": "This page gives developers relevant pointers for several tasks including: Plugins development Configuration management Credentials enrollment Customization of Casa's authentication flow", "title": "Developer guide"}, {"location": "casa/developer/overview/#plugins", "text": "A plugin is an artifact packaged in a Java ARchive ( jar file) that augments the functionalities available in your default Casa installation. The following is by no means an extensive list of things you can add via plugins: Menu items in user's menu, top-right dropdown menu, or admin's dashboard menu UI pages with arbitrary content (and backend-functionality!), this also applies for the admin dashboard Static files (e.g. Javascript, images, stylesheets, etc.) REST services Authentication mechanisms to be supported by the application In addition to the above: Any plugin can have easy access to the underlying Jans Server database Plugins can onboard their own libraries (jar files) and classes", "title": "Plugins"}, {"location": "casa/developer/overview/#tools", "text": "Acquaintance with the following technologies is recommended: Java 11 or higher, maven ZK 9 framework PF4J framework HTML/CSS/Javascript The underlying database engine used by your Jans Server installation, e.g. PostgreSQL, MySQL, etc.", "title": "Tools"}, {"location": "casa/developer/overview/#sample-plugins", "text": "The best way to start learning Casa plugin development is by playing with the sample plugins you can find here . Clone the repository (a shallow clone of main branch is fine), cd to one of the directories in the folder and run mvn package , then upload the resulting jar-with-dependencies through the administration console.", "title": "Sample plugins"}, {"location": "casa/developer/overview/#configuration-management", "text": "Most aspects of Casa that are configurable through the admin console UI can be programmatically operated using the configuration API. A formal description can be found here . Note all endpoints are protected by OAuth tokens which must have the https://jans.io/casa.config scope.", "title": "Configuration management"}, {"location": "casa/developer/overview/#credentials-enrollment", "text": "Casa has enrollment capabilities built-in but there are use cases where credential enrollment needs to happen elsewhere in your app ecosystem. A typical scenario is in a user registration application, where users are asked to enroll strong authentication credentials during account creation. To facilitate these tasks, Casa exposes APIs for enrolling the following types of authenticators: Phone numbers for SMS OTP OTP apps or tokens FIDO2 security keys Note Per spec FIDO 2 credentials can only be enrolled from a page belonging to the same domain or subdomain of your Gluu Server. In addition to the above, the API also provides endpoints to query the number/type of credentials currently enrolled by a user as well as means to turn 2FA on and off.", "title": "Credentials enrollment"}, {"location": "casa/developer/overview/#customizing-the-authentication-flow", "text": "The authentication experience the user faces when trying to access Casa is implemented in an Agama project which is attached to the authentication server when Casa is installed. As with all authentication flows in Janssen, they belong to (run in the context of) the jans-auth application. This distinction is important because jans-auth and casa are separate Java webapps executed on different Jetty instances. In Casa flow, the user is requested to enter the username and password combination, then depending on how the application is configured, personal user settings, and access policies defined, a second factor may be requested. While this may cater most companies requirements, sometimes there is the need to customize the authentication experience. In fact, Agama facilitates this by design. Here are some things companies would like to do: Alter the UI pages - e.g. look-and-feel, structure, etc. Support more authentication methods Add links to the initial screen to take users to different authentication paths, for instance, to leverage social sites login Include an account registration process Include an extra final screen in case of password expiration Add a \"forgot password\" link Important You might be tempted to take the Agama project archive, apply some editions, add files to it, repack, and redeploy it. While this might seem the easiest thing to do, it is also the worst thing to do. Authentication journeys can be extended/tailored by means of creating additional projects. Try not to hack/patch the original project.", "title": "Customizing the authentication flow"}, {"location": "casa/developer/overview/#casa-acr-update", "text": "Given the warning above, there has to be a way to launch a different Agama flow than the one used by default to log into Casa. This can be achieved by supplying a value for Casa's acr startup variable: in VM-based installations, locate the file /etc/default/casa in and modify the variable as needed. The format is agama_ . Then restart Casa.", "title": "Casa ACR update"}, {"location": "casa/developer/overview/#requisites", "text": "Regardless of the customization required, it is desirable to get acquaintance with Agama framework . This is a good time to go through the Agama developer guide pages found in the Administration section of Jans Server docs. Specifically, several of the Agama advanced usages will help you materialize your requirements. Extract the Agama project to your development machine. It is useful to get an idea of how and what the out-of-the-box project does. Also, keep the Freemarker manual at hand.", "title": "Requisites"}, {"location": "casa/developer/overview/#page-customizations", "text": "The UI pages of the default Casa flow resemble the design of the Casa app itself. Also, modifications applied through the \"custom branding\" functionalities are automatically reflected in flow pages without any sort of intervention. This is neat, but if you need to go further, you will have to code the UI pages your own based on the existing ones. For this purpose, create a new Agama project with one flow in it. Pick one of the pages you want to change from the original project and build your own - initially keep it really simple: a dummy page is OK. From your new flow, use the Trigger directive to launch flow io.jans.casa.authn.main . Add an Override templates directive to your Trigger so the page in Casa project is superseded by the page you are creating. This is explained here . Pack your new project and deploy it. Wait for around 30 seconds and try to log into Casa to see the changes. Note you have to configure casa so your flow is launched, not the default one, ie. io.jans.casa.authn.main . This was explained earlier . Do as many changes as needed to your page. Then pick another page to alter and feed your Override templates accordingly. Repeat until your are done. Recall there is no need to restart jans-auth or casa . In some cases, the original look-and-feel may be satisfying but it's the text content what you would like to change. Agama engine supports localization and internationalization as explained here so you can supply translated messages in your own project and make templates use those. Note Casa is only bundled with a set of \"default\" labels out-of-the box and thus pages don't change content regardless of browser's language or location. By overriding templates and providing labels in several languages, you can achieve full localization/internationalization in the authentication UI.", "title": "Page customizations"}, {"location": "casa/developer/overview/#support-more-authentication-methods", "text": "This is probably the most common requirement. Visit this page to learn more.", "title": "Support more authentication methods"}, {"location": "casa/developer/overview/#other-forms-of-customization", "text": "Most forms of customization can be tackled using flow cancellation. Through cancellation, a flow can be aborted while running and the control returned to one of its callers. Learn more about this topic here . As an example, let's assume you want to add a \"don't have an account? register here\" button in the initial screen of Casa flow. Here's what you can do: Create a new Agama project with one flow in it. Copy the page that prompts username and password into your project. Below the login button, add a form containing markup like In your flow, let's call it A , use the Trigger directive to launch flow io.jans.casa.authn.main . Add an Override templates directive to your Trigger so the original login page in Casa project is superseded by the page you created Create another flow, let's call it B . This will be the \"registration\" flow which will present one or more screens to grab data in order to create an account for the user. Make B finish with true outcome if the account was successfully created, otherwise finish with false Back in flow A , add code to check if io.jans.casa.authn.main was aborted, if so, launch flow B . For simplicity, if B didn't go well, terminate A If B went well, show the original login form, that is, no registration button this time Add code for termination So flow A will end up looking more or less like this: ... result = Trigger io.jans.casa.authn.main Override templates \"kz1vc3/main.ftlh\" \"newPage.ftlh\" When result.aborted is true //registration button was clicked result = Trigger B When result.success is false Finish false result = Trigger io.jans.casa.authn.main Finish result Here we have taken a simplistic approach to make the example concise. In practice you may like to be more elaborated and include an \"already have an account?\" button in the registration page, which could create a sort of navigational loop. Here the Repeat directive will emerge in your code for sure. Note When trying to customize an existing flow, familiarize with all possible paths the flow can take you to. Consider all possible screens and determine which require adjustments and the points at which cancellation is of use. Sometimes you will have to glance its .flow file (Agama code) to get a better idea.", "title": "Other forms of customization"}, {"location": "casa/plugins/2fa-settings/", "tags": ["Casa", "2FA"], "text": "2FA Settings Plugin # Overview # This plugin allows administrators to configure how and when 2FA is applied. Admins may: Specify the minimum number of credentials users must enroll before 2FA can be used Allow 2FA to be automatically enabled upon credential enrollment Prevent users to turn 2FA on and off their own Allow users to choose a preferred method of authentication When (2) is not used, option (3) is disabled. This is the default behavior exhibited in Casa where users explicitly enable or disable 2FA usage. When (2) is active, 2FA is turned on as soon as the user enrolls a credential and the minimum required is fulfilled. Bear in mind: Automatic enablement happens only via GUI: enrollments made using the API will have to turn 2FA on by means of the API itself Plugins attaching authentication methods to Casa have to explicitly call method notifyEnrollment of SndFactorAuthenticationUtils upon successful enrollments (see the javadocs). Also, 2FA is automatically turned on upon login for users with enough credentials registered and not having 2FA turned on yet. With (4) users may choose a preferred type of credential. This means that when requested for a second factor, a credential of such \"preferred\" type will be prompted first instead of the credential considered the \"strongest\". The strength associated to a method is equal to the numeric level assigned to the custom script that represents the method. For more restrictive scenarios, administrators have the option to remove the 2FA switch (3) from the user's dashboard. Additionally this plugin allows to: Choose from a set of predefined policies for when 2FA should be prompted: Always (at every login attempt) When user's location is unrecognized When user's device is unrecognized Users can define their own policy (based on the above) Set how long a location or device can be deemed as recognized Moreover, when administrators allow users to set their own strong authentication policy, users can: View the list of physical devices they have used to login (e.g. PC, tablet, phone) View the time and location (city) associated to the last login event Remove a device from the list (eg. when it should not be considered trustworthy anymore) A device/location is considered trustworthy when the user has presented a strong credential in order to login to Casa in such device/location. Subsequent login attempts from trustworthy (recognized) device/locations will not require them to present a second factor. Requirements # The plugin jar file must match the version of your Janssen Server installation. Installation # Download the plugin Log in to Casa using an administrator account Navigate to Administration console > Casa plugins Click on Add a plugin... and select the plugin jar file Click on Add How to use # For administrators, a new link labeled \"2FA settings\" appears in the dashboard menu to access the function. For regular users, proper details appear in the widget where 2FA is turned on. API # Configurations provided by this plugin can also be applied by means of the API exposed for this purpose. A formal description of the API can be found in this swagger file. Note all endpoints are protected by tokens which must have the https://jans.io/casa.config OAuth scope.", "title": "2FA Settings"}, {"location": "casa/plugins/2fa-settings/#2fa-settings-plugin", "text": "", "title": "2FA Settings Plugin"}, {"location": "casa/plugins/2fa-settings/#overview", "text": "This plugin allows administrators to configure how and when 2FA is applied. Admins may: Specify the minimum number of credentials users must enroll before 2FA can be used Allow 2FA to be automatically enabled upon credential enrollment Prevent users to turn 2FA on and off their own Allow users to choose a preferred method of authentication When (2) is not used, option (3) is disabled. This is the default behavior exhibited in Casa where users explicitly enable or disable 2FA usage. When (2) is active, 2FA is turned on as soon as the user enrolls a credential and the minimum required is fulfilled. Bear in mind: Automatic enablement happens only via GUI: enrollments made using the API will have to turn 2FA on by means of the API itself Plugins attaching authentication methods to Casa have to explicitly call method notifyEnrollment of SndFactorAuthenticationUtils upon successful enrollments (see the javadocs). Also, 2FA is automatically turned on upon login for users with enough credentials registered and not having 2FA turned on yet. With (4) users may choose a preferred type of credential. This means that when requested for a second factor, a credential of such \"preferred\" type will be prompted first instead of the credential considered the \"strongest\". The strength associated to a method is equal to the numeric level assigned to the custom script that represents the method. For more restrictive scenarios, administrators have the option to remove the 2FA switch (3) from the user's dashboard. Additionally this plugin allows to: Choose from a set of predefined policies for when 2FA should be prompted: Always (at every login attempt) When user's location is unrecognized When user's device is unrecognized Users can define their own policy (based on the above) Set how long a location or device can be deemed as recognized Moreover, when administrators allow users to set their own strong authentication policy, users can: View the list of physical devices they have used to login (e.g. PC, tablet, phone) View the time and location (city) associated to the last login event Remove a device from the list (eg. when it should not be considered trustworthy anymore) A device/location is considered trustworthy when the user has presented a strong credential in order to login to Casa in such device/location. Subsequent login attempts from trustworthy (recognized) device/locations will not require them to present a second factor.", "title": "Overview"}, {"location": "casa/plugins/2fa-settings/#requirements", "text": "The plugin jar file must match the version of your Janssen Server installation.", "title": "Requirements"}, {"location": "casa/plugins/2fa-settings/#installation", "text": "Download the plugin Log in to Casa using an administrator account Navigate to Administration console > Casa plugins Click on Add a plugin... and select the plugin jar file Click on Add", "title": "Installation"}, {"location": "casa/plugins/2fa-settings/#how-to-use", "text": "For administrators, a new link labeled \"2FA settings\" appears in the dashboard menu to access the function. For regular users, proper details appear in the widget where 2FA is turned on.", "title": "How to use"}, {"location": "casa/plugins/2fa-settings/#api", "text": "Configurations provided by this plugin can also be applied by means of the API exposed for this purpose. A formal description of the API can be found in this swagger file. Note all endpoints are protected by tokens which must have the https://jans.io/casa.config OAuth scope.", "title": "API"}, {"location": "casa/plugins/bioid/", "tags": ["Casa", "Biometrical"], "text": "BioID plugin # Overview # This plugin allows users to enroll their BioID facial biometrics. Requirements # A Janssen server installation with Casa installed A BioID account. Register on the BioID site Application credentials from the BWS Portal. Please register an application against your account. You will need the app identifier, app secret, storage and partition. Installation # Download the plugin jar. Log into Casa as an administrator, navigate to Administration Console > Casa plugins and add the plugin jar Restart the casa service: sudo systemctl restart jans-casa Using the TUI, navigate to Auth Server > Clients , open the details for Client for Casa , and add the following redirect URI: https:///jans-casa/pl/bioid-plugin/user/interlude.zul . Replace with the hostname of your server, and save the client. Run the following commands to generate the Agama flow file: git clone --depth 1 --branch main --no-checkout https://github.com/JanssenProject/jans.git cd jans/jans-casa/plugins/bioid/extras/agama zip -r casa-bioid.gama ./* 1. Transfer the casa-bioid.gama file to the server, and deploy it using the TUI 1. Using the TUI, export the sample configuration, edit it according to the specification below and import it back in Agama Configuration # { \"io.jans.agama.bioid.enroll\": { \"host\": \"https:///jans-auth/fl/callback\", \"endpoint\": \"https://bws.bioid.com/extension/\", \"appIdentifier\": \"\", \"appSecret\": \"\", \"storage\": \"\", \"partition\": \"\" } } host : Replace with the hostname of your server endpoint : BioID API endpoint. Leave as default appIdentifier : The app identifier string from BWS Portal - Configuration appSecret : The app secret from BWS Portal - Configuration storage : Storage value from BWS Portal - Configuration partition : Partition value from BWS Portal - Configuration How to use # The plugin provides a user menu. When clicking the Click to Enroll button, Casa launches the io.jans.agama.bioid.enroll flow on the authorization server. This flow queries the BioID database for existing enrollments for the user. If the user has not enrolled, the flow presents the BWS GUI for enrollment. Upon success, the flow redirects back to a Casa landing page. Deletion of credentials is not supported as of now because Casa is unaware of enrollment status of a user.", "title": "BioID"}, {"location": "casa/plugins/bioid/#bioid-plugin", "text": "", "title": "BioID plugin"}, {"location": "casa/plugins/bioid/#overview", "text": "This plugin allows users to enroll their BioID facial biometrics.", "title": "Overview"}, {"location": "casa/plugins/bioid/#requirements", "text": "A Janssen server installation with Casa installed A BioID account. Register on the BioID site Application credentials from the BWS Portal. Please register an application against your account. You will need the app identifier, app secret, storage and partition.", "title": "Requirements"}, {"location": "casa/plugins/bioid/#installation", "text": "Download the plugin jar. Log into Casa as an administrator, navigate to Administration Console > Casa plugins and add the plugin jar Restart the casa service: sudo systemctl restart jans-casa Using the TUI, navigate to Auth Server > Clients , open the details for Client for Casa , and add the following redirect URI: https:///jans-casa/pl/bioid-plugin/user/interlude.zul . Replace with the hostname of your server, and save the client. Run the following commands to generate the Agama flow file: git clone --depth 1 --branch main --no-checkout https://github.com/JanssenProject/jans.git cd jans/jans-casa/plugins/bioid/extras/agama zip -r casa-bioid.gama ./* 1. Transfer the casa-bioid.gama file to the server, and deploy it using the TUI 1. Using the TUI, export the sample configuration, edit it according to the specification below and import it back in", "title": "Installation"}, {"location": "casa/plugins/bioid/#agama-configuration", "text": "{ \"io.jans.agama.bioid.enroll\": { \"host\": \"https:///jans-auth/fl/callback\", \"endpoint\": \"https://bws.bioid.com/extension/\", \"appIdentifier\": \"\", \"appSecret\": \"\", \"storage\": \"\", \"partition\": \"\" } } host : Replace with the hostname of your server endpoint : BioID API endpoint. Leave as default appIdentifier : The app identifier string from BWS Portal - Configuration appSecret : The app secret from BWS Portal - Configuration storage : Storage value from BWS Portal - Configuration partition : Partition value from BWS Portal - Configuration", "title": "Agama Configuration"}, {"location": "casa/plugins/bioid/#how-to-use", "text": "The plugin provides a user menu. When clicking the Click to Enroll button, Casa launches the io.jans.agama.bioid.enroll flow on the authorization server. This flow queries the BioID database for existing enrollments for the user. If the user has not enrolled, the flow presents the BWS GUI for enrollment. Upon success, the flow redirects back to a Casa landing page. Deletion of credentials is not supported as of now because Casa is unaware of enrollment status of a user.", "title": "How to use"}, {"location": "casa/plugins/consent-management/", "tags": ["Casa", "Consent"], "text": "Consent Management Plugin # Overview # The Consent Management plugin gives end-users the ability to view and revoke previously granted authorizations provided to applications accessed with their account in a Janssen Server. Requirements # The plugin jar file must match the version of your Casa (and Janssen Server) installation. Installation # Download the plugin Login to Casa using an administrator account Visit Administration console > Casa plugins Click on Add a plugin... and select the plugin jar file Click on Add User guide # For information on how to use the plugin, see the User Guide", "title": "Consent Management"}, {"location": "casa/plugins/consent-management/#consent-management-plugin", "text": "", "title": "Consent Management Plugin"}, {"location": "casa/plugins/consent-management/#overview", "text": "The Consent Management plugin gives end-users the ability to view and revoke previously granted authorizations provided to applications accessed with their account in a Janssen Server.", "title": "Overview"}, {"location": "casa/plugins/consent-management/#requirements", "text": "The plugin jar file must match the version of your Casa (and Janssen Server) installation.", "title": "Requirements"}, {"location": "casa/plugins/consent-management/#installation", "text": "Download the plugin Login to Casa using an administrator account Visit Administration console > Casa plugins Click on Add a plugin... and select the plugin jar file Click on Add", "title": "Installation"}, {"location": "casa/plugins/consent-management/#user-guide", "text": "For information on how to use the plugin, see the User Guide", "title": "User guide"}, {"location": "casa/plugins/custom-branding/", "tags": ["Casa", "Branding"], "text": "Custom Branding Plugin # Overview # This plugin allows admins to apply a design customization by choosing colors, favicon, logo, and footer text to match their company's look and feel. Alternatively, they can supply all assets (images and CSS files) externally to cover more demanding needs. Requirements # The plugin jar file must match the version of your Casa (and Janssen Server) installation. Installation # Download the plugin Login to Casa using an administrator account Visit Administration console > Casa plugins Click on Add a plugin... and select the plugin jar file Click on Add How to use # See the custom branding page for full instructions.", "title": "Custom Branding"}, {"location": "casa/plugins/custom-branding/#custom-branding-plugin", "text": "", "title": "Custom Branding Plugin"}, {"location": "casa/plugins/custom-branding/#overview", "text": "This plugin allows admins to apply a design customization by choosing colors, favicon, logo, and footer text to match their company's look and feel. Alternatively, they can supply all assets (images and CSS files) externally to cover more demanding needs.", "title": "Overview"}, {"location": "casa/plugins/custom-branding/#requirements", "text": "The plugin jar file must match the version of your Casa (and Janssen Server) installation.", "title": "Requirements"}, {"location": "casa/plugins/custom-branding/#installation", "text": "Download the plugin Login to Casa using an administrator account Visit Administration console > Casa plugins Click on Add a plugin... and select the plugin jar file Click on Add", "title": "Installation"}, {"location": "casa/plugins/custom-branding/#how-to-use", "text": "See the custom branding page for full instructions.", "title": "How to use"}, {"location": "casa/plugins/email-otp/", "tags": ["Casa", "OTP"], "text": "E-mail OTP Plugin # Overview # With this plugin, administrators can onboard a new type of authentication factor consisting of one-time passcodes (OTP) delivered to the user's inbox. This plugin simply shows a list of the already registered e-mail addresses of the user in the UI of Casa, however the accompanying Agama project contributes a new option in the authentication experience where the user is prompted to enter an OTP delivered to one of his e-mail addresses, if any. By adding the plugin and the corresponding Agama project to your server, all users having at least one e-mail address in his profile (database attribute mail ) will be given the option to get a passcode delivered and then prompted for such as a form of 2FA. Requirements # The SMTP configuration must be previously populated in the Jans Server. For this purpose you can use an administrative tool like TUI. Visit the SMTP section and fill the values requested. Ensure to run and pass the test presented before proceeding. Then, restart the authentication server. Installation # Plugin # Download the plugin jar file Login to Casa using an administrative account Visit Administration console > Casa plugins Click on Add a plugin... and select the plugin file Click on Add and wait for one minute Visit the Authentication methods section of the admin console. Tick the Registered e-mails widget, drag it to the desired position, and finally hit Save Agama project # Download the project archive Deploy the project onto the server - you can use TUI for this task Parameterize the project - you can use the project's sample configuration as a guide. The below summarizes the properties used: otp_length : Number of digits the OTPs will have (passcode length) otp_lifetime : Passcode expiration in minutes subject : Subject to use in e-mail messages. You can use %s as a placeholder to insert the value of the generated OTP message : Body of e-mail messages. You can use %s as a placeholder to insert the value of the generated OTP. Basic HTML markup is supported; ensure to properly escape characters like double quotes - keep in mind this is JSON content Parameterize the casa project: in the casa project configuration, locate the selector section under io.jans.casa.authn.main flow and add an entry with key io.jans.casa.authn.emailotp . Assign an icon and a pointer to a short descriptive text. Example: ... \"io.jans.casa.authn.emailotp\": { \"icon\": \"\", \"textKey\": \"email2fa.selector_text\" } ... Test # Create one or more testing users with real e-mail addresses associated to their accounts Log into casa with such users and enroll some credential, like a passkey, SuperGluu, etc. Then turn 2fA for them. Logout and login again. A new option for receiving OTPs via e-mail will be presented User guide # Using the plugin is straightforward and does not require further explanation.", "title": "Email OTP"}, {"location": "casa/plugins/email-otp/#e-mail-otp-plugin", "text": "", "title": "E-mail OTP Plugin"}, {"location": "casa/plugins/email-otp/#overview", "text": "With this plugin, administrators can onboard a new type of authentication factor consisting of one-time passcodes (OTP) delivered to the user's inbox. This plugin simply shows a list of the already registered e-mail addresses of the user in the UI of Casa, however the accompanying Agama project contributes a new option in the authentication experience where the user is prompted to enter an OTP delivered to one of his e-mail addresses, if any. By adding the plugin and the corresponding Agama project to your server, all users having at least one e-mail address in his profile (database attribute mail ) will be given the option to get a passcode delivered and then prompted for such as a form of 2FA.", "title": "Overview"}, {"location": "casa/plugins/email-otp/#requirements", "text": "The SMTP configuration must be previously populated in the Jans Server. For this purpose you can use an administrative tool like TUI. Visit the SMTP section and fill the values requested. Ensure to run and pass the test presented before proceeding. Then, restart the authentication server.", "title": "Requirements"}, {"location": "casa/plugins/email-otp/#installation", "text": "", "title": "Installation"}, {"location": "casa/plugins/email-otp/#plugin", "text": "Download the plugin jar file Login to Casa using an administrative account Visit Administration console > Casa plugins Click on Add a plugin... and select the plugin file Click on Add and wait for one minute Visit the Authentication methods section of the admin console. Tick the Registered e-mails widget, drag it to the desired position, and finally hit Save", "title": "Plugin"}, {"location": "casa/plugins/email-otp/#agama-project", "text": "Download the project archive Deploy the project onto the server - you can use TUI for this task Parameterize the project - you can use the project's sample configuration as a guide. The below summarizes the properties used: otp_length : Number of digits the OTPs will have (passcode length) otp_lifetime : Passcode expiration in minutes subject : Subject to use in e-mail messages. You can use %s as a placeholder to insert the value of the generated OTP message : Body of e-mail messages. You can use %s as a placeholder to insert the value of the generated OTP. Basic HTML markup is supported; ensure to properly escape characters like double quotes - keep in mind this is JSON content Parameterize the casa project: in the casa project configuration, locate the selector section under io.jans.casa.authn.main flow and add an entry with key io.jans.casa.authn.emailotp . Assign an icon and a pointer to a short descriptive text. Example: ... \"io.jans.casa.authn.emailotp\": { \"icon\": \"\", \"textKey\": \"email2fa.selector_text\" } ...", "title": "Agama project"}, {"location": "casa/plugins/email-otp/#test", "text": "Create one or more testing users with real e-mail addresses associated to their accounts Log into casa with such users and enroll some credential, like a passkey, SuperGluu, etc. Then turn 2fA for them. Logout and login again. A new option for receiving OTPs via e-mail will be presented", "title": "Test"}, {"location": "casa/plugins/email-otp/#user-guide", "text": "Using the plugin is straightforward and does not require further explanation.", "title": "User guide"}, {"location": "casa/plugins/accts-linking/account-linking-index/", "tags": ["Casa", "Accounts Linking"], "text": "Accounts Linking Plugin # Overview # This plugin allows users to \"link\" their local Jans account with existing accounts at third-party identity providers like OIDC OPs and social sites, e.g. Apple, Facebook, Google, etc. Besides the usual onboarding of a plugin jar file in Casa, administrators must deploy a number of additional components. This will be regarded later. However let's summary the key points of the accounts linking experience: When a user tries to login to Casa, the usual username/password form is presented but also a list of links that can take him to external sites (third-party identity providers) where authentication takes place Once authenticated, user profile data is grabbed from the external site - this is all backchannel A process called attribute mapping is performed on profile data. This is a transformation process that turns incoming profile data into a shape compatible with a regular Jans database user entry If the mapped profile data matches an existing user in the Jans database, the existing entry is updated with the incoming data, otherwise, a new entry is inserted - this is called user provisioning . When provisioning occurs, the account has no password associated Finally the user is given access to Casa From the perspective of a user already logged into Casa, the experience is as follows: In casa, a menu item is provided which takes the user to a (Casa) page that shows a list of third-party identity providers. For every provider there are options to trigger linking in case there is no account linked yet (external site authentication is launched), or to remove the linked account from the user profile If an account has no password assigned, removal of linked accounts is not allowed. However, a functionality for the user to assign himself a password is provided Components deployment # The pieces that allow materialization of the experience summarized above are the following: a) The Casa plugin jar file b) The Agama inbound identity project c) The Casa accounts linking Agama project Most of work is demanded on setting up project c , where configuration of identity providers and attribute mapping tuning takes place. In the following, it is assumed you have a VM-based installation of Jans Server (or Gluu Flex) available with Casa installed. In a separate machine, ensure you have SSH/SCP/SFTP access to such server and git installed. Download the plugin jar file https://maven.jans.io/maven/io/jans/casa/plugins/acct-linking/0.0.0-nightly/acct-linking-0.0.0-nightly-jar-with-dependencies.jar and copy to your server's /opt/jans/jetty/jans-casa/plugins Download the utility jar file https://maven.jans.io/maven/io/jans/agama-inbound/0.0.0-nightly/agama-inbound-0.0.0-nightly.jar and copy to your server's /opt/jans/jetty/jans-auth/custom/libs In TUI, visit the Clients screen, locate the client labeled \"Client for Casa\". Add the following redirect URI to the list: https:///jans-casa/pl/acct-linking/user/interlude.zul . Replace the name of your Jans server accordingly Run the following commands to generate the archive of the Agama inbound identity project git clone --depth 1 --branch main --no-checkout https://github.com/JanssenProject/jans.git cd jans git sparse-checkout init --cone git sparse-checkout set docs/agama-catalog/jans/inboundID/project git checkout main cd docs/agama-catalog/jans/inboundID/project zip -r inbound.zip * Download the Casa accounts linking Agama project https://maven.jans.io/maven/io/jans/casa/plugins/acct-linking-agama/0.0.0-nightly/acct-linking-agama-0.0.0-nightly-project.zip Transfer the two zip files to a location in the server, deploy both archives using TUI (Agama menu) Finally restart the authentication server Configuration # The first step is figuring out the external sites to support. Keep in mind only OpenID or OAuth 2.0 based providers can be onboarded. There is not support for SAML IDPs. The procedures for getting configuration settings in order to integrate third party providers vary widely. Here, only basic guidelines are given: If the provider is OpenId-compliant and supports dynamic client registration, obtain the OP URL and the scopes list to use when requesting user profile information. Most of times the scopes openid , profile and email will fit the bill If the provider is OpenId-compliant and does not support dynamic client registration, obtain the OP URL and scopes as in the previous case, and also a client ID and secret If the provider does not support OpenId. Obtain the following: The authorization endpoint URL The token endpoint URL The endpoint URL where profile data can be retrieved Client credentials (ID and secret) Scopes to use when requesting user profile information The steps required to grab the above data vary among providers. Normally this is obtained through a sort of administrative developer GUI tool. If you are prompted for a \"redirect URI\" in such tool, provide https:///jans-auth/fl/callback . Now it's time to supply the settings grabbed. The component these configurations are injected to is the Casa accounts linking Agama project. To make the effort easier, this project is bundled with some dummy configuration properties you can use as a template. Proceed as follows: In TUI, open the Agama tab and scroll through the list of projects until the casa-account-linking is highlighted Open the configuration management dialog (press c ) and choose to export the sample configuration to a file on disk Apply changes as needed - this is covered in a separate doc page here . Note you can add or remove sections in the file at will, and that providers can also be disabled so they are not listed in the login page or in Casa app Still in TUI, choose to import the file you have edited For VM-based installations, update the file /etc/default/jans-casa . Locate a segment that reads -Dacr= and assign agama_io.jans.casa.authn.acctlinking as new value. This will make Casa use the flow found in the accounts linking project - not the flow bundled out-of-the-box. Finally restart Casa and conduct your testing. You will now see the login page contains a list of links to the configured identity providers.", "title": "Accounts Linking Plugin"}, {"location": "casa/plugins/accts-linking/account-linking-index/#accounts-linking-plugin", "text": "", "title": "Accounts Linking Plugin"}, {"location": "casa/plugins/accts-linking/account-linking-index/#overview", "text": "This plugin allows users to \"link\" their local Jans account with existing accounts at third-party identity providers like OIDC OPs and social sites, e.g. Apple, Facebook, Google, etc. Besides the usual onboarding of a plugin jar file in Casa, administrators must deploy a number of additional components. This will be regarded later. However let's summary the key points of the accounts linking experience: When a user tries to login to Casa, the usual username/password form is presented but also a list of links that can take him to external sites (third-party identity providers) where authentication takes place Once authenticated, user profile data is grabbed from the external site - this is all backchannel A process called attribute mapping is performed on profile data. This is a transformation process that turns incoming profile data into a shape compatible with a regular Jans database user entry If the mapped profile data matches an existing user in the Jans database, the existing entry is updated with the incoming data, otherwise, a new entry is inserted - this is called user provisioning . When provisioning occurs, the account has no password associated Finally the user is given access to Casa From the perspective of a user already logged into Casa, the experience is as follows: In casa, a menu item is provided which takes the user to a (Casa) page that shows a list of third-party identity providers. For every provider there are options to trigger linking in case there is no account linked yet (external site authentication is launched), or to remove the linked account from the user profile If an account has no password assigned, removal of linked accounts is not allowed. However, a functionality for the user to assign himself a password is provided", "title": "Overview"}, {"location": "casa/plugins/accts-linking/account-linking-index/#components-deployment", "text": "The pieces that allow materialization of the experience summarized above are the following: a) The Casa plugin jar file b) The Agama inbound identity project c) The Casa accounts linking Agama project Most of work is demanded on setting up project c , where configuration of identity providers and attribute mapping tuning takes place. In the following, it is assumed you have a VM-based installation of Jans Server (or Gluu Flex) available with Casa installed. In a separate machine, ensure you have SSH/SCP/SFTP access to such server and git installed. Download the plugin jar file https://maven.jans.io/maven/io/jans/casa/plugins/acct-linking/0.0.0-nightly/acct-linking-0.0.0-nightly-jar-with-dependencies.jar and copy to your server's /opt/jans/jetty/jans-casa/plugins Download the utility jar file https://maven.jans.io/maven/io/jans/agama-inbound/0.0.0-nightly/agama-inbound-0.0.0-nightly.jar and copy to your server's /opt/jans/jetty/jans-auth/custom/libs In TUI, visit the Clients screen, locate the client labeled \"Client for Casa\". Add the following redirect URI to the list: https:///jans-casa/pl/acct-linking/user/interlude.zul . Replace the name of your Jans server accordingly Run the following commands to generate the archive of the Agama inbound identity project git clone --depth 1 --branch main --no-checkout https://github.com/JanssenProject/jans.git cd jans git sparse-checkout init --cone git sparse-checkout set docs/agama-catalog/jans/inboundID/project git checkout main cd docs/agama-catalog/jans/inboundID/project zip -r inbound.zip * Download the Casa accounts linking Agama project https://maven.jans.io/maven/io/jans/casa/plugins/acct-linking-agama/0.0.0-nightly/acct-linking-agama-0.0.0-nightly-project.zip Transfer the two zip files to a location in the server, deploy both archives using TUI (Agama menu) Finally restart the authentication server", "title": "Components deployment"}, {"location": "casa/plugins/accts-linking/account-linking-index/#configuration", "text": "The first step is figuring out the external sites to support. Keep in mind only OpenID or OAuth 2.0 based providers can be onboarded. There is not support for SAML IDPs. The procedures for getting configuration settings in order to integrate third party providers vary widely. Here, only basic guidelines are given: If the provider is OpenId-compliant and supports dynamic client registration, obtain the OP URL and the scopes list to use when requesting user profile information. Most of times the scopes openid , profile and email will fit the bill If the provider is OpenId-compliant and does not support dynamic client registration, obtain the OP URL and scopes as in the previous case, and also a client ID and secret If the provider does not support OpenId. Obtain the following: The authorization endpoint URL The token endpoint URL The endpoint URL where profile data can be retrieved Client credentials (ID and secret) Scopes to use when requesting user profile information The steps required to grab the above data vary among providers. Normally this is obtained through a sort of administrative developer GUI tool. If you are prompted for a \"redirect URI\" in such tool, provide https:///jans-auth/fl/callback . Now it's time to supply the settings grabbed. The component these configurations are injected to is the Casa accounts linking Agama project. To make the effort easier, this project is bundled with some dummy configuration properties you can use as a template. Proceed as follows: In TUI, open the Agama tab and scroll through the list of projects until the casa-account-linking is highlighted Open the configuration management dialog (press c ) and choose to export the sample configuration to a file on disk Apply changes as needed - this is covered in a separate doc page here . Note you can add or remove sections in the file at will, and that providers can also be disabled so they are not listed in the login page or in Casa app Still in TUI, choose to import the file you have edited For VM-based installations, update the file /etc/default/jans-casa . Locate a segment that reads -Dacr= and assign agama_io.jans.casa.authn.acctlinking as new value. This will make Casa use the flow found in the accounts linking project - not the flow bundled out-of-the-box. Finally restart Casa and conduct your testing. You will now see the login page contains a list of links to the configured identity providers.", "title": "Configuration"}, {"location": "casa/plugins/accts-linking/accts-linking-agama/", "tags": ["Casa", "Accounts Linking", "Agama"], "text": "Accounts linking project configuration # Overview # The accounts linking Agama project must be configured in order to integrate third-party identity providers. The configuration of this project is supplied in a JSON file whose structure is like: { \"io.jans.casa.authn.acctlinking\": { \"providerID_1\": { ... }, \"providerID_2\": { ... }, ... } } Each property part of the JSON object io.jans.casa.auth.acctlinking holds the configuration of a different identity provider. Here's a how a typical configuration of a provider looks like: { \"displayName\": \"Goooogle\", \"flowQname\": \"io.jans.inbound.GenericProvider\", \"mappingClassField\": \"io.jans.casa.acctlinking.Mappings.GOOGLE\", \"oauthParams\": { \"authzEndpoint\": \"https://accounts.google.com/o/oauth2/v2/auth\", \"tokenEndpoint\": \"https://oauth2.googleapis.com/token\", \"userInfoEndpoint\": \"https://www.googleapis.com/oauth2/v3/userinfo\", \"clientId\": \"202403151302\", \"clientSecret\": \"m|a1l2d3i4t5a6S7h8a9k0i'r\u00bfa\", \"scopes\": [\"email\", \"profile\"] } } In this case, we are populating the configuration of an OAuth-based provider called \"Goooogle\". The tables shown in this page list all possible properties to configure a provider. Particularly, two properties deserve the most detail: flowQname . Agama projects are made up of flows - think of small \"web journeys\". This property must contain the name of an existing flow capable of interfacing with the identity provider of interest. Often, there is no need to write such \"interfacing\" flow. The below are ready-to-use and cover most of real-world cases, specifically OpenId/OAuth providers that support the authorization code grant (see section 1.3 of rfc6749 ): io.jans.inbound.GenericProvider . It implements the authorization code flow where the user's browser is taken to the external site. When authentication completes, a code is received at a designated redirect (callback) URL. With such code an access token is obtained as well as user's profile data. This flow supports dynamic client registration io.jans.inbound.Apple . It implements the authorization code flow with some nuances required in order to integrate \"Apple Sign In\" mappingClassField . This is key for performing the attribute mapping process and the user provisioning. The remainder of this document is dedicated to these two aspects Note Recall enabled is a handy property that can be used to temporarily \"deactive\" a given identity provider. Configuring attribute mappings # An introduction to attribute mapping can be found here . Unless an elaborated processing of attributes is required, a basic knowledge of Java language suffices to write a useful mapping. To write a mapping, you can use the samples provided as a guideline (see folder lib/io/jans/casa/acctlinking in the Agama accounts linking project). You can add your mapping in the same file or create a new Java class for this purpose. Then save your changes, re-package (zip) the project, re-deploy, and update (re-import) the configuration if necessary. Specifically, for Casa accounts linking, the mapping must include an attribute named ID . While ID is not part of the Jans database, here it is used to supply what could be understood as the identifier of the user at the external site. For instance, in a social site this may be the username or email. The example below shows how to set ID assuming the username was returned by the external site in an attribute named userId : profile -> { Map map = new HashMap<>(); map.put(\"ID\", profile.get(\"userId\")); ... return map; } In the above example, profile is a Map that holds the attribute-value pairs the third-party identity provider released for this user. For the interested, profile contents are dumped to the server logs (check jans-auth_script.log ) so it is easy to peak into the values. Check for a message in debug level starting with \"Profile data\". Both the ID of identity provider and the ID of the user will end up stored in an auxiliary database attribute. This helps to identify if the incoming user is already known (has been onboarded previously). When the attribute mapping is applied, the uid attribute is set as well. This is the username the incoming user will be assigned in the local Jans database. The uid is automatically generated based on ID unless the mapping already populates the uid directly. The return value of the mapping is a Map . This caters for cases where resulting attributes hold booleans, dates, numbers, strings, etc. When the attribute has to hold multiple values, you can use an array or a Java Collection object, like a List . User provisioning # After attribute mapping occurs, the local database is checked to determine if the incoming user is known (based on the ID in the mapping and the ID of the provider in question). If no match is found, the user is onboarded: a new entry is created in the database using the information found in the resulting mapping. Otherwise, the exact behavior varies depending on the provider configuration as follows: If skipProfileUpdate is set to false , the existing database entry is left untouched, otherwise: If cumulativeUpdate is set to false , the existing attributes in the entry which are part of the mapping are overwritten If cumulativeUpdate is set to true , the existing attribute values in the entry are preserved and new values are added if present in the mapping The updates just referenced apply to the matching entry based on mapping and provider ID, however, when emailLinkingSafe is set to true and the mapping comes with a mail value equal to an existing e-mail in the database, the update is carried over the e-mail matching entry.", "title": "Configuring Agama Project"}, {"location": "casa/plugins/accts-linking/accts-linking-agama/#accounts-linking-project-configuration", "text": "", "title": "Accounts linking project configuration"}, {"location": "casa/plugins/accts-linking/accts-linking-agama/#overview", "text": "The accounts linking Agama project must be configured in order to integrate third-party identity providers. The configuration of this project is supplied in a JSON file whose structure is like: { \"io.jans.casa.authn.acctlinking\": { \"providerID_1\": { ... }, \"providerID_2\": { ... }, ... } } Each property part of the JSON object io.jans.casa.auth.acctlinking holds the configuration of a different identity provider. Here's a how a typical configuration of a provider looks like: { \"displayName\": \"Goooogle\", \"flowQname\": \"io.jans.inbound.GenericProvider\", \"mappingClassField\": \"io.jans.casa.acctlinking.Mappings.GOOGLE\", \"oauthParams\": { \"authzEndpoint\": \"https://accounts.google.com/o/oauth2/v2/auth\", \"tokenEndpoint\": \"https://oauth2.googleapis.com/token\", \"userInfoEndpoint\": \"https://www.googleapis.com/oauth2/v3/userinfo\", \"clientId\": \"202403151302\", \"clientSecret\": \"m|a1l2d3i4t5a6S7h8a9k0i'r\u00bfa\", \"scopes\": [\"email\", \"profile\"] } } In this case, we are populating the configuration of an OAuth-based provider called \"Goooogle\". The tables shown in this page list all possible properties to configure a provider. Particularly, two properties deserve the most detail: flowQname . Agama projects are made up of flows - think of small \"web journeys\". This property must contain the name of an existing flow capable of interfacing with the identity provider of interest. Often, there is no need to write such \"interfacing\" flow. The below are ready-to-use and cover most of real-world cases, specifically OpenId/OAuth providers that support the authorization code grant (see section 1.3 of rfc6749 ): io.jans.inbound.GenericProvider . It implements the authorization code flow where the user's browser is taken to the external site. When authentication completes, a code is received at a designated redirect (callback) URL. With such code an access token is obtained as well as user's profile data. This flow supports dynamic client registration io.jans.inbound.Apple . It implements the authorization code flow with some nuances required in order to integrate \"Apple Sign In\" mappingClassField . This is key for performing the attribute mapping process and the user provisioning. The remainder of this document is dedicated to these two aspects Note Recall enabled is a handy property that can be used to temporarily \"deactive\" a given identity provider.", "title": "Overview"}, {"location": "casa/plugins/accts-linking/accts-linking-agama/#configuring-attribute-mappings", "text": "An introduction to attribute mapping can be found here . Unless an elaborated processing of attributes is required, a basic knowledge of Java language suffices to write a useful mapping. To write a mapping, you can use the samples provided as a guideline (see folder lib/io/jans/casa/acctlinking in the Agama accounts linking project). You can add your mapping in the same file or create a new Java class for this purpose. Then save your changes, re-package (zip) the project, re-deploy, and update (re-import) the configuration if necessary. Specifically, for Casa accounts linking, the mapping must include an attribute named ID . While ID is not part of the Jans database, here it is used to supply what could be understood as the identifier of the user at the external site. For instance, in a social site this may be the username or email. The example below shows how to set ID assuming the username was returned by the external site in an attribute named userId : profile -> { Map map = new HashMap<>(); map.put(\"ID\", profile.get(\"userId\")); ... return map; } In the above example, profile is a Map that holds the attribute-value pairs the third-party identity provider released for this user. For the interested, profile contents are dumped to the server logs (check jans-auth_script.log ) so it is easy to peak into the values. Check for a message in debug level starting with \"Profile data\". Both the ID of identity provider and the ID of the user will end up stored in an auxiliary database attribute. This helps to identify if the incoming user is already known (has been onboarded previously). When the attribute mapping is applied, the uid attribute is set as well. This is the username the incoming user will be assigned in the local Jans database. The uid is automatically generated based on ID unless the mapping already populates the uid directly. The return value of the mapping is a Map . This caters for cases where resulting attributes hold booleans, dates, numbers, strings, etc. When the attribute has to hold multiple values, you can use an array or a Java Collection object, like a List .", "title": "Configuring attribute mappings"}, {"location": "casa/plugins/accts-linking/accts-linking-agama/#user-provisioning", "text": "After attribute mapping occurs, the local database is checked to determine if the incoming user is known (based on the ID in the mapping and the ID of the provider in question). If no match is found, the user is onboarded: a new entry is created in the database using the information found in the resulting mapping. Otherwise, the exact behavior varies depending on the provider configuration as follows: If skipProfileUpdate is set to false , the existing database entry is left untouched, otherwise: If cumulativeUpdate is set to false , the existing attributes in the entry which are part of the mapping are overwritten If cumulativeUpdate is set to true , the existing attribute values in the entry are preserved and new values are added if present in the mapping The updates just referenced apply to the matching entry based on mapping and provider ID, however, when emailLinkingSafe is set to true and the mapping comes with a mail value equal to an existing e-mail in the database, the update is carried over the e-mail matching entry.", "title": "User provisioning"}, {"location": "cedarling/cedarling-authz/", "tags": ["administration", "lock", "authorization / authz", "Cedar", "Cedarling"], "text": "Authorization Using Cedarling # The Policy Store contains the Cedar Policies, Cedar Schema, and optionally, a list of the Trusted IDPs. The Cedarling loads its Policy Store during initialization as a static JSON file or fetched via HTTPS. In enterprise deployments, the Cedarling can retrieve its Policy Store from a Jans Lock Server OAuth protected endpoint. Developers need to define Cedar Schema that makes sense for their application. For example, a developer writing a customer support application might define an \"Issue\" Resource and Actions like \"Reply\" or \"Close\". Once the schema is defined, developers can author policies to model the fine grain access controls needed to implement the business rules of their application. The easiest way to define schema and policies is to use the AgamaLab Policy Designer. This is a free developer tool hosted by Gluu . The JWTs, Resource, Action, and Context are sent in the authz request. Cedar Pricipals entities are derived from JWT tokens. The OpenID Connect (\"OIDC\") JWTs are joined by the Cedarling to create User and Role entities; the OAuth access token is used to create a Workload entity, which is the software that is acting on behalf of the Person (or autonomously). The Cedarling validates that given its policies, Role, Person and Workload are authorized. If one of Role or Person and Workload is authorized then the request is allowed to proceed. The Cedarling maps \"Roles\" out-of-the-box. In Cedar, Roles are a special kind of Principal. Instead of saying \"User can perform action\", we can say \"Role can perform action\"--a convenient way to implement RBAC. Developers can specify which JWT claim is used to map Cedar Roles. For example, one domain may use the role user claim of the OpenID Userinfo token; another domain may use the memberOf claim in the OIDC id_token. Developers can also express a variety of policies beyond the limitations of RBAC by expressing ABAC conditions, or combining ABAC and RBAC conditions. For example, a policy like Admins can access a \"private\" Resource from the private network, during business hours. In this case \"Admins\" is the role, but the other conditions are ABAC. Policy evaluation is fast because Cedar uses the RBAC role to \"slice\" the data, minimizing the number of entries on which to evaluate the ABAC conditions. The OIDC id_token JWT represents a Person authentication event. The access token JWT represents a Workload authentication event. These tokens contain other interesting contextual data. The id_token tells you who authenticated, when they authenticated, how they authenticatated, and optionally other claims like the User's roles. An OAuth access token can tell you information about the Workload that obtained the JWT, its extent of access as defined by the OAuth Authorization Server ( i.e. the values of the scope claim), or other claims--domains frequently enhance the access token to contain business specific data needed for policy evaluation. The Cedarling authorizes a Person using a certain piece of software, which is called a \"Workload\". From a logical perspective, ( person_allowed AND workload_allowed ) must be True . The JWT's, Action, Resource and Context is sent by the application in the authorization request. For example, this is a sample request from a hypothetical application: const bootstrap_config = {...}; const cedarling = await init ( bootstrap_config ); let input = { \"tokens\" : { \"access_token\" : \"eyJhbGc....\" , \"id_token\" : \"eyJjbGc...\" , \"userinfo_token\" : \"eyJjbGc...\" , }, \"action\" : \"View\" , \"resource\" : { \"id\" : \"ticket-10101\" , \"type\" : \"Ticket\" , \"owner\" : \"bob@acme.com\" , \"org_id\" : \"Acme\" }, \"context\" : { \"ip_address\" : \"54.9.21.201\" , \"network_type\" : \"VPN\" , \"user_agent\" : \"Chrome 125.0.6422.77 (Official Build) (arm64)\" , \"time\" : \"1719266610.98636\" , } } decision_result = await cedarling ( input ) Automatically Adding Entity References to the Context # Cedarling simplifies context creation by automatically including certain entities. This means you don't need to manually pass their references when using them in your policies. The following entities are automatically added to the context, along with their naming conventions in lower_snake_case format: Workload Entity : workload User Entity : user Resource Entity : resource Access Token Entity : access_token ID Token Entity : id_token Userinfo Token Entity : userinfo_token Example Policy # Below is an example policy schema that illustrates how entities are used: type Context = { \"access_token\": Access_token, \"time\": Long, \"user\": User, \"workload\": Workload }; type Url = { \"host\": String, \"path\": String, \"protocol\": String }; entity Access_token = { \"exp\": Long, \"iss\": TrustedIssuer }; entity Issue = { \"country\": String, \"org_id\": String }; entity Role; entity TrustedIssuer = { \"issuer_entity_id\": Url }; entity User in [Role] = { \"country\": String, \"email\": String, \"sub\": String, \"username\": String }; entity Workload = { \"client_id\": String, \"iss\": TrustedIssuer, \"name\": String, \"org_id\": String }; action \"Update\" appliesTo { principal: [Role, Workload, User], resource: [Issue], context: { \"access_token\": Access_token, \"time\": Long, \"user\": User, \"workload\": Workload } }; action \"View\" appliesTo { principal: [Role, Workload, User], resource: [Issue], context: Context }; With this schema, you only need to provide the fields that are not automatically included. For instance, to define the time in the context: let context = { \"time\" : 1719266610.98636 , }", "title": "Authz"}, {"location": "cedarling/cedarling-authz/#authorization-using-cedarling", "text": "The Policy Store contains the Cedar Policies, Cedar Schema, and optionally, a list of the Trusted IDPs. The Cedarling loads its Policy Store during initialization as a static JSON file or fetched via HTTPS. In enterprise deployments, the Cedarling can retrieve its Policy Store from a Jans Lock Server OAuth protected endpoint. Developers need to define Cedar Schema that makes sense for their application. For example, a developer writing a customer support application might define an \"Issue\" Resource and Actions like \"Reply\" or \"Close\". Once the schema is defined, developers can author policies to model the fine grain access controls needed to implement the business rules of their application. The easiest way to define schema and policies is to use the AgamaLab Policy Designer. This is a free developer tool hosted by Gluu . The JWTs, Resource, Action, and Context are sent in the authz request. Cedar Pricipals entities are derived from JWT tokens. The OpenID Connect (\"OIDC\") JWTs are joined by the Cedarling to create User and Role entities; the OAuth access token is used to create a Workload entity, which is the software that is acting on behalf of the Person (or autonomously). The Cedarling validates that given its policies, Role, Person and Workload are authorized. If one of Role or Person and Workload is authorized then the request is allowed to proceed. The Cedarling maps \"Roles\" out-of-the-box. In Cedar, Roles are a special kind of Principal. Instead of saying \"User can perform action\", we can say \"Role can perform action\"--a convenient way to implement RBAC. Developers can specify which JWT claim is used to map Cedar Roles. For example, one domain may use the role user claim of the OpenID Userinfo token; another domain may use the memberOf claim in the OIDC id_token. Developers can also express a variety of policies beyond the limitations of RBAC by expressing ABAC conditions, or combining ABAC and RBAC conditions. For example, a policy like Admins can access a \"private\" Resource from the private network, during business hours. In this case \"Admins\" is the role, but the other conditions are ABAC. Policy evaluation is fast because Cedar uses the RBAC role to \"slice\" the data, minimizing the number of entries on which to evaluate the ABAC conditions. The OIDC id_token JWT represents a Person authentication event. The access token JWT represents a Workload authentication event. These tokens contain other interesting contextual data. The id_token tells you who authenticated, when they authenticated, how they authenticatated, and optionally other claims like the User's roles. An OAuth access token can tell you information about the Workload that obtained the JWT, its extent of access as defined by the OAuth Authorization Server ( i.e. the values of the scope claim), or other claims--domains frequently enhance the access token to contain business specific data needed for policy evaluation. The Cedarling authorizes a Person using a certain piece of software, which is called a \"Workload\". From a logical perspective, ( person_allowed AND workload_allowed ) must be True . The JWT's, Action, Resource and Context is sent by the application in the authorization request. For example, this is a sample request from a hypothetical application: const bootstrap_config = {...}; const cedarling = await init ( bootstrap_config ); let input = { \"tokens\" : { \"access_token\" : \"eyJhbGc....\" , \"id_token\" : \"eyJjbGc...\" , \"userinfo_token\" : \"eyJjbGc...\" , }, \"action\" : \"View\" , \"resource\" : { \"id\" : \"ticket-10101\" , \"type\" : \"Ticket\" , \"owner\" : \"bob@acme.com\" , \"org_id\" : \"Acme\" }, \"context\" : { \"ip_address\" : \"54.9.21.201\" , \"network_type\" : \"VPN\" , \"user_agent\" : \"Chrome 125.0.6422.77 (Official Build) (arm64)\" , \"time\" : \"1719266610.98636\" , } } decision_result = await cedarling ( input )", "title": "Authorization Using Cedarling"}, {"location": "cedarling/cedarling-authz/#automatically-adding-entity-references-to-the-context", "text": "Cedarling simplifies context creation by automatically including certain entities. This means you don't need to manually pass their references when using them in your policies. The following entities are automatically added to the context, along with their naming conventions in lower_snake_case format: Workload Entity : workload User Entity : user Resource Entity : resource Access Token Entity : access_token ID Token Entity : id_token Userinfo Token Entity : userinfo_token", "title": "Automatically Adding Entity References to the Context"}, {"location": "cedarling/cedarling-authz/#example-policy", "text": "Below is an example policy schema that illustrates how entities are used: type Context = { \"access_token\": Access_token, \"time\": Long, \"user\": User, \"workload\": Workload }; type Url = { \"host\": String, \"path\": String, \"protocol\": String }; entity Access_token = { \"exp\": Long, \"iss\": TrustedIssuer }; entity Issue = { \"country\": String, \"org_id\": String }; entity Role; entity TrustedIssuer = { \"issuer_entity_id\": Url }; entity User in [Role] = { \"country\": String, \"email\": String, \"sub\": String, \"username\": String }; entity Workload = { \"client_id\": String, \"iss\": TrustedIssuer, \"name\": String, \"org_id\": String }; action \"Update\" appliesTo { principal: [Role, Workload, User], resource: [Issue], context: { \"access_token\": Access_token, \"time\": Long, \"user\": User, \"workload\": Workload } }; action \"View\" appliesTo { principal: [Role, Workload, User], resource: [Issue], context: Context }; With this schema, you only need to provide the fields that are not automatically included. For instance, to define the time in the context: let context = { \"time\" : 1719266610.98636 , }", "title": "Example Policy"}, {"location": "cedarling/cedarling-jwt/", "tags": ["administration", "lock", "authorization / authz", "Cedar", "Cedarling", "JWT"], "text": "Cedarling JWT Flow # Json Web Token Validation # Note: To enable Json Web Token (JWT) Validation in Cedarling, it is required to populate the trusted_issuers field in the Policy Store . Enabling JWT Signature Validation # Cedarling can validate JWT signatures for enhanced security. To enable this feature, set the CEDARLING_JWT_VALIDATION bootstrap property to True . For development and testing purposes, you can set this property to False and submit an unsigned JWT, such as one generated from JWT.io . Public Key Management # When token validation is enabled, Cedarling downloads the public keys of the Trusted IDPs specified in the policy store during initialization. Cedarling uses the JWT iss claim to select the appropriate keys for validation. JWT Revocation # In enterprise deployments, Cedarling can also check for JWT revocation. This is achieved by following the mechanism described in the OAuth Status Lists draft. Token status enforcement helps mitigate risks associated with account takeover by enabling immediate revocation of all tokens issued to an attacker. Additionally, domains may choose to use Token Status to implement single-use transaction tokens. Summary of JWT Validation Mechanisms # Depending on your bootstrap properties, Cedarling may validate JWTs through the following methods: Validate signatures from Trusted Issuers Check JWT status for revocation Discard id_token if the aud claim does not match the client_id of the access token Discard Userinfo tokens that are not associated with a sub claim from the id_token Verify exp (expiration) and nbf (not before) claims of access tokens and id_tokens, if timestamps are provided in the context", "title": "JWT"}, {"location": "cedarling/cedarling-jwt/#cedarling-jwt-flow", "text": "", "title": "Cedarling JWT Flow"}, {"location": "cedarling/cedarling-jwt/#json-web-token-validation", "text": "Note: To enable Json Web Token (JWT) Validation in Cedarling, it is required to populate the trusted_issuers field in the Policy Store .", "title": "Json Web Token Validation"}, {"location": "cedarling/cedarling-jwt/#enabling-jwt-signature-validation", "text": "Cedarling can validate JWT signatures for enhanced security. To enable this feature, set the CEDARLING_JWT_VALIDATION bootstrap property to True . For development and testing purposes, you can set this property to False and submit an unsigned JWT, such as one generated from JWT.io .", "title": "Enabling JWT Signature Validation"}, {"location": "cedarling/cedarling-jwt/#public-key-management", "text": "When token validation is enabled, Cedarling downloads the public keys of the Trusted IDPs specified in the policy store during initialization. Cedarling uses the JWT iss claim to select the appropriate keys for validation.", "title": "Public Key Management"}, {"location": "cedarling/cedarling-jwt/#jwt-revocation", "text": "In enterprise deployments, Cedarling can also check for JWT revocation. This is achieved by following the mechanism described in the OAuth Status Lists draft. Token status enforcement helps mitigate risks associated with account takeover by enabling immediate revocation of all tokens issued to an attacker. Additionally, domains may choose to use Token Status to implement single-use transaction tokens.", "title": "JWT Revocation"}, {"location": "cedarling/cedarling-jwt/#summary-of-jwt-validation-mechanisms", "text": "Depending on your bootstrap properties, Cedarling may validate JWTs through the following methods: Validate signatures from Trusted Issuers Check JWT status for revocation Discard id_token if the aud claim does not match the client_id of the access token Discard Userinfo tokens that are not associated with a sub claim from the id_token Verify exp (expiration) and nbf (not before) claims of access tokens and id_tokens, if timestamps are provided in the context", "title": "Summary of JWT Validation Mechanisms"}, {"location": "cedarling/cedarling-logs/", "tags": ["administration", "lock", "authorization / authz", "Cedar", "Cedarling", "logging", "audit"], "text": "Cedarling Logs # Cedarling Audit Logs # The Cedarling logs contains a record of all a Cedarling's decisions and token validations. Cedarling has four logging options, which are configurable via the CEDARLING_LOG_TYPE bootstrap property: off - no logging memory - logs stored in Cedarling in-memory KV store, fetched by client via logging interface. This is ideal for batching logs without impeding authz performance std_out - write logs synchronously to std_out lock - periodically POST logs to Jans Lock Server /audit endpoint for central archiving. There are three different log records produced by the Cedarling: Decision - The result and diagnostics of an authz decision System - Startup, debug and other Cedarling messages not related to authz Metric - Performance and usage data System Log Levels # This is set by CEDARLING_LOG_LEVEL FATAL : Indicates very severe error events that will likely lead the application to abort. These are the most critical issues. ERROR : Designates error events that might still allow the application to continue running but indicate a significant problem. WARN : Designates potentially harmful situations that should be addressed to prevent future issues. INFO : Provides informational messages that highlight the progress of the application at a coarse-grained level. DEBUG : Designates fine-grained informational events useful for debugging the application. TRACE : Provides finer-grained informational events than DEBUG. It is often used for detailed tracing of program execution. Jans Lock Server # In enterprise deployments, Janssen Lock Server collects Cedarling logs and can stream to a database or S3 bucket. The Cedarling decision logs provide compliance evidence of usage of the domain's externalized policies. The logs are also useful for forensic analysis to show everything the attacker attempted, both allowed and denied. Sample logs # The JSON in this document is formatted for readability but is not prettified in the actual implementation. Startup Message # { \"request_id\" : \"0193b8a8-efc0-77ce-bd90-4a62a2998462\" , \"timestamp\" : \"2024-12-12T04:18:19.456Z\" , \"log_kind\" : \"System\" , \"pdp_id\" : \"d47e245e-beaa-4ea4-b899-b8184cd3eb7e\" , \"level\" : \"DEBUG\" , \"msg\" : \"configuration parsed successfully\" } { \"request_id\" : \"0193b8a8-efc1-7e42-9678-b2480268b91f\" , \"timestamp\" : \"2024-12-12T04:18:19.457Z\" , \"log_kind\" : \"System\" , \"pdp_id\" : \"d47e245e-beaa-4ea4-b899-b8184cd3eb7e\" , \"level\" : \"INFO\" , \"msg\" : \"Cedarling Authz initialized successfully\" , \"application_id\" : \"My App\" , \"cedar_lang_version\" : \"4.1.0\" , \"cedar_sdk_version\" : \"4.2.2\" } Decision Log # Example of decision log. { \"request_id\" : \"019394db-f52b-7b06-88b8-a288670a32c2\" , \"timestamp\" : \"2024-12-05T05:27:43.403Z\" , \"log_type\" : \"Decision\" , \"pdp_id\" : \"9e189c4b-96ae-4818-8e7f-75a42186af15\" , \"policystore_id\" : \"a1bf93115de86de760ee0bea1d529b521489e5a11747\" , \"policystore_version\" : \"undefined\" , \"principal\" : \"User & Workload\" , \"User\" : { \"username\" : \"admin@gluu.org\" }, \"Workload\" : { \"org_id\" : \"some_long_id\" }, \"diagnostics\" : { \"reason\" : [ { \"id\" : \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" , \"description\" : \"policy for user\" } ], \"errors\" : [] }, \"lock_client_id\" : null , \"action\" : \"Jans::Action::\\\"Update\\\"\" , \"resource\" : \"Jans::Issue::\\\"random_id\\\"\" , \"decision\" : \"ALLOW\" , \"tokens\" : { \"id_token\" : { \"jti\" : \"id_tkn_jti\" }, \"Userinfo\" : { \"jti\" : \"usrinfo_tkn_jti\" }, \"access\" : { \"jti\" : \"access_tkn_jti\" } }, \"decision_time_ms\" : 3 } Field Definitions # request_id : unique identifier for the decision request timestamp : Derived if possible from the system or context--may be empty in cases where WASM can't access the system clock, and the time wasn't sent in the context. pdp_id : unique identifier for the Cedarling policystore_id : What policystore this Cedarling instance is using policystore_version : What version of the policystore the Cedarling is using principal : User | Workload User : A list of claims, specified by the CEDARLING_DECISION_LOG_USER_CLAIMS property, that must be present in the Cedar User entity Workload : A list of claims, specified by the CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS property, that must be present in the Cedar Workload entity lock_client_id : If this Cedarling has registered with a Lock Server, what is the client_id it received action : From the request resource : From the Request decision : ALLOW or DENY tokens : Dictionary with the token type and claims which should be included in the log decision_time_ms : how long the decision took Debug Log Sample # The result of the authorization is quite extensive because we log all cedar-policy entity information for forensic analysis. We cannot truncate the data, as it may contain critical information. { \"id\" : \"01937015-4649-7aad-8df8-4976e4bd8565\" , \"time\" : 1732752262 , \"log_type\" : \"Decision\" , \"level\" : \"DEBUG\" , \"pdp_id\" : \"75f0dc93-0a90-4076-95fa-dc16d3f00375\" , \"msg\" : \"Result of authorize.\" , \"application_id\" : \"TestApp\" , \"action\" : \"Jans::Action::\\\"Read\\\"\" , \"resource\" : \"Jans::Application::\\\"some_id\\\"\" , \"context\" : { \"user_agent\" : \"Linux\" , \"operating_system\" : \"Linux\" , \"network_type\" : \"Local\" , \"network\" : \"127.0.0.1\" , \"geolocation\" : [ \"America\" ], \"fraud_indicators\" : [ \"Allowed\" ], \"device_health\" : [ \"Healthy\" ], \"current_time\" : 1732752262 }, \"entities\" : [ { \"uid\" : { \"type\" : \"Jans::User\" , \"id\" : \"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\" }, \"attrs\" : { \"sub\" : \"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\" , \"role\" : [ \"CasaAdmin\" ], \"email\" : { \"domain\" : \"jans.test\" , \"uid\" : \"admin\" } }, \"parents\" : [ { \"type\" : \"Jans::Role\" , \"id\" : \"CasaAdmin\" } ] }, { \"uid\" : { \"type\" : \"Jans::id_token\" , \"id\" : \"ijLZO1ooRyWrgIn7cIdNyA\" }, \"attrs\" : { \"sub\" : \"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\" , \"acr\" : \"simple_password_auth\" , \"exp\" : 1731956630 , \"jti\" : \"ijLZO1ooRyWrgIn7cIdNyA\" , \"amr\" : [], \"aud\" : \"d7f71bea-c38d-4caf-a1ba-e43c74a11a62\" , \"iss\" : { \"__entity\" : { \"type\" : \"Jans::TrustedIssuer\" , \"id\" : \"https://account.gluu.org\" } }, \"iat\" : 1731953030 }, \"parents\" : [] }, ... { \"uid\" : { \"type\" : \"Jans::Action\" , \"id\" : \"Tag\" }, \"attrs\" : {}, \"parents\" : [] } ], \"person_principal\" : \"Jans::User::\\\"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\\\"\" , \"person_diagnostics\" : { \"reason\" : [ { \"id\" : \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" , \"description\" : \"simple policy example for principal user\" } ], \"errors\" : [] }, \"person_decision\" : \"ALLOW\" , \"workload_principal\" : \"Jans::Workload::\\\"d7f71bea-c38d-4caf-a1ba-e43c74a11a62\\\"\" , \"workload_diagnostics\" : { \"reason\" : [ { \"id\" : \"444da5d85403f35ea76519ed1a18a33989f855bf1cf8\" , \"description\" : \"simple policy example for principal workload\" } ], \"errors\" : [] }, \"workload_decision\" : \"ALLOW\" , \"authorized\" : true }", "title": "Logs"}, {"location": "cedarling/cedarling-logs/#cedarling-logs", "text": "", "title": "Cedarling Logs"}, {"location": "cedarling/cedarling-logs/#cedarling-audit-logs", "text": "The Cedarling logs contains a record of all a Cedarling's decisions and token validations. Cedarling has four logging options, which are configurable via the CEDARLING_LOG_TYPE bootstrap property: off - no logging memory - logs stored in Cedarling in-memory KV store, fetched by client via logging interface. This is ideal for batching logs without impeding authz performance std_out - write logs synchronously to std_out lock - periodically POST logs to Jans Lock Server /audit endpoint for central archiving. There are three different log records produced by the Cedarling: Decision - The result and diagnostics of an authz decision System - Startup, debug and other Cedarling messages not related to authz Metric - Performance and usage data", "title": "Cedarling Audit Logs"}, {"location": "cedarling/cedarling-logs/#system-log-levels", "text": "This is set by CEDARLING_LOG_LEVEL FATAL : Indicates very severe error events that will likely lead the application to abort. These are the most critical issues. ERROR : Designates error events that might still allow the application to continue running but indicate a significant problem. WARN : Designates potentially harmful situations that should be addressed to prevent future issues. INFO : Provides informational messages that highlight the progress of the application at a coarse-grained level. DEBUG : Designates fine-grained informational events useful for debugging the application. TRACE : Provides finer-grained informational events than DEBUG. It is often used for detailed tracing of program execution.", "title": "System Log Levels"}, {"location": "cedarling/cedarling-logs/#jans-lock-server", "text": "In enterprise deployments, Janssen Lock Server collects Cedarling logs and can stream to a database or S3 bucket. The Cedarling decision logs provide compliance evidence of usage of the domain's externalized policies. The logs are also useful for forensic analysis to show everything the attacker attempted, both allowed and denied.", "title": "Jans Lock Server"}, {"location": "cedarling/cedarling-logs/#sample-logs", "text": "The JSON in this document is formatted for readability but is not prettified in the actual implementation.", "title": "Sample logs"}, {"location": "cedarling/cedarling-logs/#startup-message", "text": "{ \"request_id\" : \"0193b8a8-efc0-77ce-bd90-4a62a2998462\" , \"timestamp\" : \"2024-12-12T04:18:19.456Z\" , \"log_kind\" : \"System\" , \"pdp_id\" : \"d47e245e-beaa-4ea4-b899-b8184cd3eb7e\" , \"level\" : \"DEBUG\" , \"msg\" : \"configuration parsed successfully\" } { \"request_id\" : \"0193b8a8-efc1-7e42-9678-b2480268b91f\" , \"timestamp\" : \"2024-12-12T04:18:19.457Z\" , \"log_kind\" : \"System\" , \"pdp_id\" : \"d47e245e-beaa-4ea4-b899-b8184cd3eb7e\" , \"level\" : \"INFO\" , \"msg\" : \"Cedarling Authz initialized successfully\" , \"application_id\" : \"My App\" , \"cedar_lang_version\" : \"4.1.0\" , \"cedar_sdk_version\" : \"4.2.2\" }", "title": "Startup Message"}, {"location": "cedarling/cedarling-logs/#decision-log", "text": "Example of decision log. { \"request_id\" : \"019394db-f52b-7b06-88b8-a288670a32c2\" , \"timestamp\" : \"2024-12-05T05:27:43.403Z\" , \"log_type\" : \"Decision\" , \"pdp_id\" : \"9e189c4b-96ae-4818-8e7f-75a42186af15\" , \"policystore_id\" : \"a1bf93115de86de760ee0bea1d529b521489e5a11747\" , \"policystore_version\" : \"undefined\" , \"principal\" : \"User & Workload\" , \"User\" : { \"username\" : \"admin@gluu.org\" }, \"Workload\" : { \"org_id\" : \"some_long_id\" }, \"diagnostics\" : { \"reason\" : [ { \"id\" : \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" , \"description\" : \"policy for user\" } ], \"errors\" : [] }, \"lock_client_id\" : null , \"action\" : \"Jans::Action::\\\"Update\\\"\" , \"resource\" : \"Jans::Issue::\\\"random_id\\\"\" , \"decision\" : \"ALLOW\" , \"tokens\" : { \"id_token\" : { \"jti\" : \"id_tkn_jti\" }, \"Userinfo\" : { \"jti\" : \"usrinfo_tkn_jti\" }, \"access\" : { \"jti\" : \"access_tkn_jti\" } }, \"decision_time_ms\" : 3 }", "title": "Decision Log"}, {"location": "cedarling/cedarling-logs/#field-definitions", "text": "request_id : unique identifier for the decision request timestamp : Derived if possible from the system or context--may be empty in cases where WASM can't access the system clock, and the time wasn't sent in the context. pdp_id : unique identifier for the Cedarling policystore_id : What policystore this Cedarling instance is using policystore_version : What version of the policystore the Cedarling is using principal : User | Workload User : A list of claims, specified by the CEDARLING_DECISION_LOG_USER_CLAIMS property, that must be present in the Cedar User entity Workload : A list of claims, specified by the CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS property, that must be present in the Cedar Workload entity lock_client_id : If this Cedarling has registered with a Lock Server, what is the client_id it received action : From the request resource : From the Request decision : ALLOW or DENY tokens : Dictionary with the token type and claims which should be included in the log decision_time_ms : how long the decision took", "title": "Field Definitions"}, {"location": "cedarling/cedarling-logs/#debug-log-sample", "text": "The result of the authorization is quite extensive because we log all cedar-policy entity information for forensic analysis. We cannot truncate the data, as it may contain critical information. { \"id\" : \"01937015-4649-7aad-8df8-4976e4bd8565\" , \"time\" : 1732752262 , \"log_type\" : \"Decision\" , \"level\" : \"DEBUG\" , \"pdp_id\" : \"75f0dc93-0a90-4076-95fa-dc16d3f00375\" , \"msg\" : \"Result of authorize.\" , \"application_id\" : \"TestApp\" , \"action\" : \"Jans::Action::\\\"Read\\\"\" , \"resource\" : \"Jans::Application::\\\"some_id\\\"\" , \"context\" : { \"user_agent\" : \"Linux\" , \"operating_system\" : \"Linux\" , \"network_type\" : \"Local\" , \"network\" : \"127.0.0.1\" , \"geolocation\" : [ \"America\" ], \"fraud_indicators\" : [ \"Allowed\" ], \"device_health\" : [ \"Healthy\" ], \"current_time\" : 1732752262 }, \"entities\" : [ { \"uid\" : { \"type\" : \"Jans::User\" , \"id\" : \"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\" }, \"attrs\" : { \"sub\" : \"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\" , \"role\" : [ \"CasaAdmin\" ], \"email\" : { \"domain\" : \"jans.test\" , \"uid\" : \"admin\" } }, \"parents\" : [ { \"type\" : \"Jans::Role\" , \"id\" : \"CasaAdmin\" } ] }, { \"uid\" : { \"type\" : \"Jans::id_token\" , \"id\" : \"ijLZO1ooRyWrgIn7cIdNyA\" }, \"attrs\" : { \"sub\" : \"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\" , \"acr\" : \"simple_password_auth\" , \"exp\" : 1731956630 , \"jti\" : \"ijLZO1ooRyWrgIn7cIdNyA\" , \"amr\" : [], \"aud\" : \"d7f71bea-c38d-4caf-a1ba-e43c74a11a62\" , \"iss\" : { \"__entity\" : { \"type\" : \"Jans::TrustedIssuer\" , \"id\" : \"https://account.gluu.org\" } }, \"iat\" : 1731953030 }, \"parents\" : [] }, ... { \"uid\" : { \"type\" : \"Jans::Action\" , \"id\" : \"Tag\" }, \"attrs\" : {}, \"parents\" : [] } ], \"person_principal\" : \"Jans::User::\\\"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\\\"\" , \"person_diagnostics\" : { \"reason\" : [ { \"id\" : \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" , \"description\" : \"simple policy example for principal user\" } ], \"errors\" : [] }, \"person_decision\" : \"ALLOW\" , \"workload_principal\" : \"Jans::Workload::\\\"d7f71bea-c38d-4caf-a1ba-e43c74a11a62\\\"\" , \"workload_diagnostics\" : { \"reason\" : [ { \"id\" : \"444da5d85403f35ea76519ed1a18a33989f855bf1cf8\" , \"description\" : \"simple policy example for principal workload\" } ], \"errors\" : [] }, \"workload_decision\" : \"ALLOW\" , \"authorized\" : true }", "title": "Debug Log Sample"}, {"location": "cedarling/cedarling-overview/", "tags": ["administration", "lock", "authorization / authz", "Cedar", "Cedarling"], "text": "Cedarling Overview # What is Cedar # Cedar is a policy syntax invented by Amazon and used by their Verified Permission service. Cedar policies enable developers to implement fine-grain access control and externalize policies. To learn more about why the design of Cedar is intuitive , fast and safe , read this article or watch this video Cedar uses the PARC syntax: P rincipal A ction R esource C ontext For example, you may have a policy that says Admins can write to the /config folder. The Admin role is the Principal, write is the Action, and the /config folder is the Resource. The Context is used to specify information about the enivironment, like the time of day or network address. Fine grain access control makes sense in both the frontend and backend. In the frontend, mastery of authz can help developers build better UX. For example, why display form fields a user is not authorized to see? In the backend, fine grain policies are necessary for a zero trust architecture. What is the Cedarling # Architecturally, the Cedarling is an embeddable stateful Policy Decision Point, or \"PDP\". It is stateful because it implements an in-memory cache which makes it possible to batch logs and implement other performance optimizations. The Cedarling is written in Rust with bindings to WASM, iOS, Android, and Python--this makes it possible for web, mobile, and cloud developers to incorporate the Cedarling into their applications. The Cedarling is used for both frontend and backend security. Because the frontend is more constrained with regard to memory and compute, this requirement was critical to the design. For example, in the backend, a PDP could run in a Linux container. But in the frontend, the Cedarling must run in a browser, using the browser WASM engine. How does the Cedarling get the data to calculate a decision? The Principal data is contained in the JWTs--a person, a workload, or both. The Action, Resource and Context are sent by the application as arguments in the authz request. The Cedarling is fast because it has all the data it needs to make a local decision. No cloud round-trips are needed to return an authz decision--a cloud roundtrip may kill the performance of a frontend application. The Cedarling can execute many requests in less then 1ms--this is critical for UX fine grain authorization. Below is a conceptual diagram showing how you can archiect the Cedarling for frontend and backend security. The Cedarling is used to determine if the Mobile Application should be allowed to register. For example, perhaps the IDP wants to execute a policy that restricts registration to mobile applications that present a Google Integrity API attestation to indicate the checksum of the binary has not changed, and that the phone is not rooted. The Cedarling is used to authenticate the person using the mobile application, i.e. the \"User\". For example, perhaps the IDP wants to execute a policy that says that 2FA is required from a non trusted network. The Cedarling is used to determine which scopes to add to the OAuth access token. For example, perhaps if the mobile application presents a software statement assertion JWT (i.e. and \"SSA\") issued by the IDP, the application may request the financial scope. Once JWT tokens are issued by the IDP, the frontend can use these tokens to evaluate local policies. For example, perhaps the mobile application only allows access to certain features if the Userinfo JWT contains a role claim for a \"Manager\". The mobile application may send an OAuth access token to call an API. This API Gateway may route this request to a backend service, but only after evaluating certain security policies. For example, perhaps the Action POST is only allowed on a Resource (e.g. \"URI\") when the access token JWT contains a certain scope. Finally, the Backend API can use the Cedarling to perform its own fine grain authorization. For example, perhaps the Backend only allows transaction greater than $10,000 if the access token contains scope value high-net-worth . This is just a hypothetical example, but hopefully you can see how the Cedarling is used to achieve multilayer security. Each Cedarling has it's own specific policy store. The API Gateway Cedarling instance does not need to know the policies or schema for the mobile application. By layering security, you can implement a zero trust architecture. Cedarling Interfaces # The developer using the Cedarling to build an application uses three easy interfaces: (\" init \"), authorization (\" authz \") and logging (\" log \"). Developers call the init interface on startup of their application, causing the Cedarling to read its bootstrap properties and load its policy store . If configured, the Cedarling will also retrieve the most recent IDP public keys and request JWT status updates. The authz interface provides the main functionality of the Cedarling: to authorize a PARC request from the application by mapping the data sent in the request, and evaluating it with the embedded Rust Cedar Engine . The authz interface answers the question: \"Is this action, on this resource, given this context, allowed with these JWTs?\". The Cedarling returns the decion-- allow or deny . If denied, the Cedarling returns \"diagnostics\"--additional context if the decision is denied. During authz , the Cedarling can perform two more important jobs: (1) validate JWT tokens; (2) log the resulting decision. The log interface enables developers to retrieve decision and system logs from the Cedarling's in-memory cache. See the Cedarling log documentation for more information. Cedarling Components # As a developer, you don't really need to understand how the Cedarling is constructed. But this section is meant to give you an idea to help you get a better understand of what it's actually doing. The following diagram is a very high level picture: Cedar Engine is the latest code released from the open source Rust Cedar project. Thanks Amazon for supporting this fabulous technology! SparKV is an in-memory key-value store that support automatic expiration of data. For example, we don't want to store logs for more then a few minutes. The Cedarling is a stateful PDP, but of course it doesn't write anything to disk. The state is stored entirely in Memory, and SparKV provides an easy way to do this. Init, Authz, and Log Engines perform actions similar to those described in the interfaces above. JWT Engine is used to validate JWT signatures and to check the status of a JWT token. Lock Engine is used for enterprise deployments, where the Cedarling is one of many instances, and it needs to pick up its Policy Store from a trusted source and send to store its logs centrally, for example in a SIEM. So you can see that the Cedar Engine is central to the functionality of the Cedarling. However, the other helper engines make it easier for developer to use Cedar for application security when they are using JWT tokens as the source of Person and Workload identity.", "title": "Overview"}, {"location": "cedarling/cedarling-overview/#cedarling-overview", "text": "", "title": "Cedarling Overview"}, {"location": "cedarling/cedarling-overview/#what-is-cedar", "text": "Cedar is a policy syntax invented by Amazon and used by their Verified Permission service. Cedar policies enable developers to implement fine-grain access control and externalize policies. To learn more about why the design of Cedar is intuitive , fast and safe , read this article or watch this video Cedar uses the PARC syntax: P rincipal A ction R esource C ontext For example, you may have a policy that says Admins can write to the /config folder. The Admin role is the Principal, write is the Action, and the /config folder is the Resource. The Context is used to specify information about the enivironment, like the time of day or network address. Fine grain access control makes sense in both the frontend and backend. In the frontend, mastery of authz can help developers build better UX. For example, why display form fields a user is not authorized to see? In the backend, fine grain policies are necessary for a zero trust architecture.", "title": "What is Cedar"}, {"location": "cedarling/cedarling-overview/#what-is-the-cedarling", "text": "Architecturally, the Cedarling is an embeddable stateful Policy Decision Point, or \"PDP\". It is stateful because it implements an in-memory cache which makes it possible to batch logs and implement other performance optimizations. The Cedarling is written in Rust with bindings to WASM, iOS, Android, and Python--this makes it possible for web, mobile, and cloud developers to incorporate the Cedarling into their applications. The Cedarling is used for both frontend and backend security. Because the frontend is more constrained with regard to memory and compute, this requirement was critical to the design. For example, in the backend, a PDP could run in a Linux container. But in the frontend, the Cedarling must run in a browser, using the browser WASM engine. How does the Cedarling get the data to calculate a decision? The Principal data is contained in the JWTs--a person, a workload, or both. The Action, Resource and Context are sent by the application as arguments in the authz request. The Cedarling is fast because it has all the data it needs to make a local decision. No cloud round-trips are needed to return an authz decision--a cloud roundtrip may kill the performance of a frontend application. The Cedarling can execute many requests in less then 1ms--this is critical for UX fine grain authorization. Below is a conceptual diagram showing how you can archiect the Cedarling for frontend and backend security. The Cedarling is used to determine if the Mobile Application should be allowed to register. For example, perhaps the IDP wants to execute a policy that restricts registration to mobile applications that present a Google Integrity API attestation to indicate the checksum of the binary has not changed, and that the phone is not rooted. The Cedarling is used to authenticate the person using the mobile application, i.e. the \"User\". For example, perhaps the IDP wants to execute a policy that says that 2FA is required from a non trusted network. The Cedarling is used to determine which scopes to add to the OAuth access token. For example, perhaps if the mobile application presents a software statement assertion JWT (i.e. and \"SSA\") issued by the IDP, the application may request the financial scope. Once JWT tokens are issued by the IDP, the frontend can use these tokens to evaluate local policies. For example, perhaps the mobile application only allows access to certain features if the Userinfo JWT contains a role claim for a \"Manager\". The mobile application may send an OAuth access token to call an API. This API Gateway may route this request to a backend service, but only after evaluating certain security policies. For example, perhaps the Action POST is only allowed on a Resource (e.g. \"URI\") when the access token JWT contains a certain scope. Finally, the Backend API can use the Cedarling to perform its own fine grain authorization. For example, perhaps the Backend only allows transaction greater than $10,000 if the access token contains scope value high-net-worth . This is just a hypothetical example, but hopefully you can see how the Cedarling is used to achieve multilayer security. Each Cedarling has it's own specific policy store. The API Gateway Cedarling instance does not need to know the policies or schema for the mobile application. By layering security, you can implement a zero trust architecture.", "title": "What is the Cedarling"}, {"location": "cedarling/cedarling-overview/#cedarling-interfaces", "text": "The developer using the Cedarling to build an application uses three easy interfaces: (\" init \"), authorization (\" authz \") and logging (\" log \"). Developers call the init interface on startup of their application, causing the Cedarling to read its bootstrap properties and load its policy store . If configured, the Cedarling will also retrieve the most recent IDP public keys and request JWT status updates. The authz interface provides the main functionality of the Cedarling: to authorize a PARC request from the application by mapping the data sent in the request, and evaluating it with the embedded Rust Cedar Engine . The authz interface answers the question: \"Is this action, on this resource, given this context, allowed with these JWTs?\". The Cedarling returns the decion-- allow or deny . If denied, the Cedarling returns \"diagnostics\"--additional context if the decision is denied. During authz , the Cedarling can perform two more important jobs: (1) validate JWT tokens; (2) log the resulting decision. The log interface enables developers to retrieve decision and system logs from the Cedarling's in-memory cache. See the Cedarling log documentation for more information.", "title": "Cedarling Interfaces"}, {"location": "cedarling/cedarling-overview/#cedarling-components", "text": "As a developer, you don't really need to understand how the Cedarling is constructed. But this section is meant to give you an idea to help you get a better understand of what it's actually doing. The following diagram is a very high level picture: Cedar Engine is the latest code released from the open source Rust Cedar project. Thanks Amazon for supporting this fabulous technology! SparKV is an in-memory key-value store that support automatic expiration of data. For example, we don't want to store logs for more then a few minutes. The Cedarling is a stateful PDP, but of course it doesn't write anything to disk. The state is stored entirely in Memory, and SparKV provides an easy way to do this. Init, Authz, and Log Engines perform actions similar to those described in the interfaces above. JWT Engine is used to validate JWT signatures and to check the status of a JWT token. Lock Engine is used for enterprise deployments, where the Cedarling is one of many instances, and it needs to pick up its Policy Store from a trusted source and send to store its logs centrally, for example in a SIEM. So you can see that the Cedar Engine is central to the functionality of the Cedarling. However, the other helper engines make it easier for developer to use Cedar for application security when they are using JWT tokens as the source of Person and Workload identity.", "title": "Cedarling Components"}, {"location": "cedarling/cedarling-policy-store/", "tags": ["administration", "lock", "authorization / authz", "Cedar", "Cedarling", "policy store"], "text": "Cedarling Policy Store # The Cedarling Policy Store uses a JSON file named cedarling_store.json to store all necessary data for evaluating policies and verifying JWT tokens. The structure includes the following key components: Cedar Schema : The Cedar schema encoded in Base64. Cedar Policies : The Cedar policies encoded in Base64. Trusted Issuers : Details about the trusted issuers (see below for syntax). Note: The cedarling_store.json file is only needed if the bootstrap properties: CEDARLING_LOCK ; CEDARLING_POLICY_STORE_URI ; and CEDARLING_POLICY_STORE_ID are not set to a local location. If you're fetching the policies remotely, you don't need a cedarling_store.json file. JSON Schema # The JSON Schema accepted by cedarling is defined as follows: { \"cedar_version\" : \"v4.0.0\" , \"policy_stores\" : { \"some_unique_string_id\" : { \"name\" : \"TestPolicy\" , \"description\" : \"Once upon a time there was a Policy, that lived in a Store.\" , \"policies\" : { ... }, \"schema\" : { ... }, \"trusted_issuers\" : { ... } } } } cedar_version : ( String ) The version of Cedar policy . The protocols of this version will be followed when processing Cedar schema and policies. policies : ( Object ) Object containing one or more policy IDs as keys, with their corresponding objects as values. See: policies schema . schema : ( String | Object ) The Cedar Schema. See schema below. trusted_issuers : ( Object of {unique_id => IdentitySource}(#trusted-issuer-schema) ) List of metadata for Identity Sources. schema # Either String or Object , where Object is preferred. Where Object - An object with encoding , content_type and body keys. For example: \"schema\" : { \"encoding\" : \"none\" , // can be one of \"none\" or \"base64\" \"content_type\" : \"cedar\" , // can be one of \"cedar\" or \"cedar-json\" \"body\" : \"namespace Jans {\\ntype Url = {\" hos t \": String, \" pa t h \": String, \" pro t ocol \": String};...\" } Where String - The schema in cedar-json format, encoded as Base64. For example: \"schema\" : \"cGVybWl0KAogICAgc...\" Cedar Policies Schema # The policies field describes the Cedar policies that will be used in Cedarling. Multiple policies can be defined, with each policy requiring a unique_policy_id . \"policies\" : { \"unique_policy_id\" : { \"cedar_version\" : \"v4.0.0\" , \"name\" : \"Policy for Unique Id\" , \"description\" : \"simple policy example\" , \"creation_date\" : \"2024-09-20T17:22:39.996050\" , \"policy_content\" : { ... }, }, ... } unique_policy_id : ( String ) A uniqe policy ID used to for tracking and auditing purposes. name : ( String ) A name for the policy description : ( String ) A brief description of cedar policy creation_date : ( String ) Policy creating date in YYYY-MM-DDTHH:MM:SS.ssssss policy_content : ( String | Object ) The Cedar Policy. See policy_content below. policy_content # Either String or Object , where Object is preferred. Where Object - An object with encoding , content_type and body keys. For example: \"policy_content\" : { \"encoding\" : \"none\" , // can be one of \"none\" or \"base64\" \"content_type\" : \"cedar\" , // ONLY \"cedar\" for now due to limitations in cedar-policy crate \"body\" : \"permit(\\n principal is Jans::User,\\n action in [Jans::Action::\\\"Update\\\"],\\n resource is Jans::Issue\\n)when{\\n principal.country == resource.country\\n};\" } Where String - The policy in cedar format, encoded as Base64. For example: \"policy_content\" : \"cGVybWl0KAogICAgc...\" Example of policies # Here is a non-normative example of the policies field: \"policies\" : { \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" : { \"cedar_version\" : \"v2.7.4\" , \"name\" : \"Policy-the-first\" , \"description\" : \"simple policy example for principal workload\" , \"creation_date\" : \"2024-09-20T17:22:39.996050\" , \"policy_content\" : \"cGVybWl0KAogICAgc...\" }, \"0fo1kl928Afa0sc9123scma0123891asklajsh1233ab\" : { \"cedar_version\" : \"v2.7.4\" , \"name\" : \"Policy-the-second\" , \"description\" : \"another policy example\" , \"creation_date\" : \"2024-09-20T18:22:39.192051\" , \"policy_content\" : \"kJW1bWl0KA0g3CAxa...\" }, \"1fo1kl928Afa0sc9123scma0123891asklajsh1233ac\" : { \"cedar_version\" : \"v2.7.4\" , \"name\" : \"Policy-the-third\" , \"description\" : \"another policy example\" , \"creation_date\" : \"2024-09-20T18:22:39.192051\" , \"policy_content\" : { \"encoding\" : \"none\" , \"content_type\" : \"cedar\" , \"body\" : \"permit(...) where {...}\" } }, \"2fo1kl928Afa0sc9123scma0123891asklajsh1233ad\" : { \"cedar_version\" : \"v2.7.4\" , \"name\" : \"Policy-the-fourth\" , \"description\" : \"another policy example\" , \"creation_date\" : \"2024-09-20T18:22:39.192051\" , \"policy_content\" : { \"encoding\" : \"base64\" , \"content_type\" : \"cedar\" , \"body\" : \"kJW1bWl0KA0g3CAxa...\" } }, ... } Trusted Issuers Schema # This record contains the information needed to validate tokens from this issuer: \"identity_source\" : { \"some_unique_id\" : { \"name\" : \"name_of_the_trusted_issuer\" , \"description\" : \"description for the trusted issuer\" , \"openid_configuration_endpoint\" : \"https:///.well-known/openid-configuration\" , \"access_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"jti\" , ... }, \"id_tokens\" : { ... }, \"userinfo_tokens\" : { ... }, \"tx_tokens\" : { ... }, } ... } name : ( String ) The name of the trusted issuer. description : ( String ) A brief description of the trusted issuer, providing context for administrators. openid_configuration_endpoint : ( String ) The HTTPS URL for the OpenID Connect configuration endpoint (usually found at /.well-known/openid-configuration ). identity_source : ( Object , optional ) Metadata related to the tokens issued by this issuer. access_tokens , id_tokens , userinfo_tokens , and tx_tokens : See: Token Metadata Schema . Token Metadata Schema # The Token Entity Metadata Schema defines how tokens are mapped, parsed, and transformed within Cedarling. It allows you to specify how to extract user IDs, roles, and other claims from a token using customizable parsers. { \"trusted\" : bool , \"principal_identifier\" : \"str\" , \"user_id\" : \"\" , \"role_mapping\" : \"\" , \"claim_mapping\" : { \"mapping_target\" : { \"parser\" : \"\" , \"type\" : \"\" , \"...\" : \"Additional configurations specific to the parser\" }, }, } Role mapping # role_mapping : (String OR Array of String, Optional ) Indicates which field in the token should be used for role-based access control. If not needed, set to an empty string ( \"\" ). You can include a role_mapping in each token, all of them will be executed by Cedarling. If none role_mapping defined the Cedarling will try to find role in userinfo token in field role . Claim mapping # claim_mapping: Defines how to extract and transform specific claims from the token. Each claim can have its own parser ( regex or json ) and type ( Acme::email_address , Acme::Url , etc.). In regex attribute mapping like \"UID\": {\"attr\": \"uid\", \"type\":\"String\"}, , type field can contain possible variants: String - to string without transformation, Number - parse string to float64 (JSON number) if error returns default value Boolean - if string NOT empty map to true else false Note, use of regex named capture groups which is more readable by referring to parts of a regex match by descriptive names rather than numbers. For example, (?P...) defines a named capture group where name is the identifier, and ... is the regex pattern for what you want to capture. When you use (?x) modifier in regexp, ensure that you escaped character # => \\# . example of mapping email_address and Url : ... \"claim_mapping\" : { \"email\" : { \"parser\" : \"regex\" , \"type\" : \"Test::email_address\" , \"regex_expression\" : \"^(?P[^@]+)@(?P.+)$\" , \"UID\" : { \"attr\" : \"uid\" , \"type\" : \"String\" }, \"DOMAIN\" : { \"attr\" : \"domain\" , \"type\" : \"String\" } }, \"profile\" : { \"parser\" : \"regex\" , \"type\" : \"Test::Url\" , \"regex_expression\" : \"(?x) ^(?P[a-zA-Z][a-zA-Z0-9+.-]*):\\\\/\\\\/(?P[^\\\\/:\\\\#?]+)(?::(?\\\\d+))?(?P\\\\/[^?\\\\#]*)?(?:\\\\?(?P[^\\\\#]*))?(?:(?P.*))?\" , \"SCHEME\" : { \"attr\" : \"scheme\" , \"type\" : \"String\" }, \"HOST\" : { \"attr\" : \"host\" , \"type\" : \"String\" }, \"PORT\" : { \"attr\" : \"port\" , \"type\" : \"String\" }, \"PATH\" : { \"attr\" : \"path\" , \"type\" : \"String\" }, \"QUERY\" : { \"attr\" : \"query\" , \"type\" : \"String\" }, \"FRAGMENT\" : { \"attr\" : \"fragment\" , \"type\" : \"String\" } } } ... Example Policy store # Here is a non-normative example of a cedarling_store.json file: { \"cedar_version\" : \"v4.0.0\" , \"policies\" : { \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" : { \"description\" : \"simple policy example\" , \"creation_date\" : \"2024-09-20T17:22:39.996050\" , \"policy_content\" : \"cedar_policy_encoded_in_base64\" } }, \"schema\" : \"schema_encoded_in_base64\" , \"identity_source\" : { \"08c6c18a654f492adcf3fe069d729b4d9e6bf82605cb\" : { \"name\" : \"Google\" , \"description\" : \"Consumer IDP\" , \"openid_configuration_endpoint\" : \"https://accounts.google.com/.well-known/openid-configuration\" , \"access_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"\" , \"role_mapping\" : \"\" , }, \"id_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"sub\" , \"role_mapping\" : \"\" , }, \"userinfo_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"\" , \"role_mapping\" : \"role\" , }, \"tx_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"\" , \"role_mapping\" : \"\" , }, } } } Policy and Schema Authoring # You can hand create your Cedar policies and schema in Visual Studio . Make sure you run the cedar command line tool to validate both your schema and policies. The easiest way to author your policy store is to use the Policy Designer in Agama Lab . This tool helps you define the policies, schema and trusted IDPs and to publish a policy store to a Github repository. Minimum supported cedar-policy schema # Here is example of a minimum supported cedar-policy schema : namespace Jans { entity id_token = {\"aud\": String,\"iss\": String, \"sub\": String}; entity Role; entity User in [Role] = {}; entity Access_token = {\"aud\": String,\"iss\": String, \"jti\": String, \"client_id\": String}; entity Workload = {}; entity Issue = {}; action \"Update\" appliesTo { principal: [Workload, User, Role], resource: [Issue], context: {} }; } You can extend all of this entites and add your own. Mandatory entities is: id_token , Role , User , Access_token , Workload . Issue entity and Update action are optinal. Is created for example, you can create others for your needs. Context and Resource entities you can pass during authorization request and next entites creating based on the JWT tokens: id_token - entity based on the id JWT token fields. ID for entity based in jti field. Role - define role of user. Mapping defined in Token Metadata Schema . Claim in JWT usually is string or array of string. Each Role is parent for User . So to check role in policy use operator in to check hierarchy. User - entity based on the id and userinfo JWT token fields. If id and userinfo JWT token fields has different sub value, userinfo JWT token will be ignored. ID for entity based in sub field. (will be changed in future) Access_token - entity based on the access JWT token fields. ID for entity based in jti field. Workload - entity based on the access JWT token fields. ID for entity based in client_id field. Note on test fixtures # You will notice that test fixtures in the cedarling code base are quite often in yaml rather than in json. yaml is intended for cedarling internal use only . The rationale is that yaml has excellent support for embedded, indented, multiline string values. That is far easier to read than base64 encoded json strings, and is beneficial for debugging and validation that test cases are correct.", "title": "Policy Store"}, {"location": "cedarling/cedarling-policy-store/#cedarling-policy-store", "text": "The Cedarling Policy Store uses a JSON file named cedarling_store.json to store all necessary data for evaluating policies and verifying JWT tokens. The structure includes the following key components: Cedar Schema : The Cedar schema encoded in Base64. Cedar Policies : The Cedar policies encoded in Base64. Trusted Issuers : Details about the trusted issuers (see below for syntax). Note: The cedarling_store.json file is only needed if the bootstrap properties: CEDARLING_LOCK ; CEDARLING_POLICY_STORE_URI ; and CEDARLING_POLICY_STORE_ID are not set to a local location. If you're fetching the policies remotely, you don't need a cedarling_store.json file.", "title": "Cedarling Policy Store"}, {"location": "cedarling/cedarling-policy-store/#json-schema", "text": "The JSON Schema accepted by cedarling is defined as follows: { \"cedar_version\" : \"v4.0.0\" , \"policy_stores\" : { \"some_unique_string_id\" : { \"name\" : \"TestPolicy\" , \"description\" : \"Once upon a time there was a Policy, that lived in a Store.\" , \"policies\" : { ... }, \"schema\" : { ... }, \"trusted_issuers\" : { ... } } } } cedar_version : ( String ) The version of Cedar policy . The protocols of this version will be followed when processing Cedar schema and policies. policies : ( Object ) Object containing one or more policy IDs as keys, with their corresponding objects as values. See: policies schema . schema : ( String | Object ) The Cedar Schema. See schema below. trusted_issuers : ( Object of {unique_id => IdentitySource}(#trusted-issuer-schema) ) List of metadata for Identity Sources.", "title": "JSON Schema"}, {"location": "cedarling/cedarling-policy-store/#schema", "text": "Either String or Object , where Object is preferred. Where Object - An object with encoding , content_type and body keys. For example: \"schema\" : { \"encoding\" : \"none\" , // can be one of \"none\" or \"base64\" \"content_type\" : \"cedar\" , // can be one of \"cedar\" or \"cedar-json\" \"body\" : \"namespace Jans {\\ntype Url = {\" hos t \": String, \" pa t h \": String, \" pro t ocol \": String};...\" } Where String - The schema in cedar-json format, encoded as Base64. For example: \"schema\" : \"cGVybWl0KAogICAgc...\"", "title": "schema"}, {"location": "cedarling/cedarling-policy-store/#cedar-policies-schema", "text": "The policies field describes the Cedar policies that will be used in Cedarling. Multiple policies can be defined, with each policy requiring a unique_policy_id . \"policies\" : { \"unique_policy_id\" : { \"cedar_version\" : \"v4.0.0\" , \"name\" : \"Policy for Unique Id\" , \"description\" : \"simple policy example\" , \"creation_date\" : \"2024-09-20T17:22:39.996050\" , \"policy_content\" : { ... }, }, ... } unique_policy_id : ( String ) A uniqe policy ID used to for tracking and auditing purposes. name : ( String ) A name for the policy description : ( String ) A brief description of cedar policy creation_date : ( String ) Policy creating date in YYYY-MM-DDTHH:MM:SS.ssssss policy_content : ( String | Object ) The Cedar Policy. See policy_content below.", "title": "Cedar Policies Schema"}, {"location": "cedarling/cedarling-policy-store/#policy_content", "text": "Either String or Object , where Object is preferred. Where Object - An object with encoding , content_type and body keys. For example: \"policy_content\" : { \"encoding\" : \"none\" , // can be one of \"none\" or \"base64\" \"content_type\" : \"cedar\" , // ONLY \"cedar\" for now due to limitations in cedar-policy crate \"body\" : \"permit(\\n principal is Jans::User,\\n action in [Jans::Action::\\\"Update\\\"],\\n resource is Jans::Issue\\n)when{\\n principal.country == resource.country\\n};\" } Where String - The policy in cedar format, encoded as Base64. For example: \"policy_content\" : \"cGVybWl0KAogICAgc...\"", "title": "policy_content"}, {"location": "cedarling/cedarling-policy-store/#example-of-policies", "text": "Here is a non-normative example of the policies field: \"policies\" : { \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" : { \"cedar_version\" : \"v2.7.4\" , \"name\" : \"Policy-the-first\" , \"description\" : \"simple policy example for principal workload\" , \"creation_date\" : \"2024-09-20T17:22:39.996050\" , \"policy_content\" : \"cGVybWl0KAogICAgc...\" }, \"0fo1kl928Afa0sc9123scma0123891asklajsh1233ab\" : { \"cedar_version\" : \"v2.7.4\" , \"name\" : \"Policy-the-second\" , \"description\" : \"another policy example\" , \"creation_date\" : \"2024-09-20T18:22:39.192051\" , \"policy_content\" : \"kJW1bWl0KA0g3CAxa...\" }, \"1fo1kl928Afa0sc9123scma0123891asklajsh1233ac\" : { \"cedar_version\" : \"v2.7.4\" , \"name\" : \"Policy-the-third\" , \"description\" : \"another policy example\" , \"creation_date\" : \"2024-09-20T18:22:39.192051\" , \"policy_content\" : { \"encoding\" : \"none\" , \"content_type\" : \"cedar\" , \"body\" : \"permit(...) where {...}\" } }, \"2fo1kl928Afa0sc9123scma0123891asklajsh1233ad\" : { \"cedar_version\" : \"v2.7.4\" , \"name\" : \"Policy-the-fourth\" , \"description\" : \"another policy example\" , \"creation_date\" : \"2024-09-20T18:22:39.192051\" , \"policy_content\" : { \"encoding\" : \"base64\" , \"content_type\" : \"cedar\" , \"body\" : \"kJW1bWl0KA0g3CAxa...\" } }, ... }", "title": "Example of policies"}, {"location": "cedarling/cedarling-policy-store/#trusted-issuers-schema", "text": "This record contains the information needed to validate tokens from this issuer: \"identity_source\" : { \"some_unique_id\" : { \"name\" : \"name_of_the_trusted_issuer\" , \"description\" : \"description for the trusted issuer\" , \"openid_configuration_endpoint\" : \"https:///.well-known/openid-configuration\" , \"access_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"jti\" , ... }, \"id_tokens\" : { ... }, \"userinfo_tokens\" : { ... }, \"tx_tokens\" : { ... }, } ... } name : ( String ) The name of the trusted issuer. description : ( String ) A brief description of the trusted issuer, providing context for administrators. openid_configuration_endpoint : ( String ) The HTTPS URL for the OpenID Connect configuration endpoint (usually found at /.well-known/openid-configuration ). identity_source : ( Object , optional ) Metadata related to the tokens issued by this issuer. access_tokens , id_tokens , userinfo_tokens , and tx_tokens : See: Token Metadata Schema .", "title": "Trusted Issuers Schema"}, {"location": "cedarling/cedarling-policy-store/#token-metadata-schema", "text": "The Token Entity Metadata Schema defines how tokens are mapped, parsed, and transformed within Cedarling. It allows you to specify how to extract user IDs, roles, and other claims from a token using customizable parsers. { \"trusted\" : bool , \"principal_identifier\" : \"str\" , \"user_id\" : \"\" , \"role_mapping\" : \"\" , \"claim_mapping\" : { \"mapping_target\" : { \"parser\" : \"\" , \"type\" : \"\" , \"...\" : \"Additional configurations specific to the parser\" }, }, }", "title": "Token Metadata Schema"}, {"location": "cedarling/cedarling-policy-store/#role-mapping", "text": "role_mapping : (String OR Array of String, Optional ) Indicates which field in the token should be used for role-based access control. If not needed, set to an empty string ( \"\" ). You can include a role_mapping in each token, all of them will be executed by Cedarling. If none role_mapping defined the Cedarling will try to find role in userinfo token in field role .", "title": "Role mapping"}, {"location": "cedarling/cedarling-policy-store/#claim-mapping", "text": "claim_mapping: Defines how to extract and transform specific claims from the token. Each claim can have its own parser ( regex or json ) and type ( Acme::email_address , Acme::Url , etc.). In regex attribute mapping like \"UID\": {\"attr\": \"uid\", \"type\":\"String\"}, , type field can contain possible variants: String - to string without transformation, Number - parse string to float64 (JSON number) if error returns default value Boolean - if string NOT empty map to true else false Note, use of regex named capture groups which is more readable by referring to parts of a regex match by descriptive names rather than numbers. For example, (?P...) defines a named capture group where name is the identifier, and ... is the regex pattern for what you want to capture. When you use (?x) modifier in regexp, ensure that you escaped character # => \\# . example of mapping email_address and Url : ... \"claim_mapping\" : { \"email\" : { \"parser\" : \"regex\" , \"type\" : \"Test::email_address\" , \"regex_expression\" : \"^(?P[^@]+)@(?P.+)$\" , \"UID\" : { \"attr\" : \"uid\" , \"type\" : \"String\" }, \"DOMAIN\" : { \"attr\" : \"domain\" , \"type\" : \"String\" } }, \"profile\" : { \"parser\" : \"regex\" , \"type\" : \"Test::Url\" , \"regex_expression\" : \"(?x) ^(?P[a-zA-Z][a-zA-Z0-9+.-]*):\\\\/\\\\/(?P[^\\\\/:\\\\#?]+)(?::(?\\\\d+))?(?P\\\\/[^?\\\\#]*)?(?:\\\\?(?P[^\\\\#]*))?(?:(?P.*))?\" , \"SCHEME\" : { \"attr\" : \"scheme\" , \"type\" : \"String\" }, \"HOST\" : { \"attr\" : \"host\" , \"type\" : \"String\" }, \"PORT\" : { \"attr\" : \"port\" , \"type\" : \"String\" }, \"PATH\" : { \"attr\" : \"path\" , \"type\" : \"String\" }, \"QUERY\" : { \"attr\" : \"query\" , \"type\" : \"String\" }, \"FRAGMENT\" : { \"attr\" : \"fragment\" , \"type\" : \"String\" } } } ...", "title": "Claim mapping"}, {"location": "cedarling/cedarling-policy-store/#example-policy-store", "text": "Here is a non-normative example of a cedarling_store.json file: { \"cedar_version\" : \"v4.0.0\" , \"policies\" : { \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" : { \"description\" : \"simple policy example\" , \"creation_date\" : \"2024-09-20T17:22:39.996050\" , \"policy_content\" : \"cedar_policy_encoded_in_base64\" } }, \"schema\" : \"schema_encoded_in_base64\" , \"identity_source\" : { \"08c6c18a654f492adcf3fe069d729b4d9e6bf82605cb\" : { \"name\" : \"Google\" , \"description\" : \"Consumer IDP\" , \"openid_configuration_endpoint\" : \"https://accounts.google.com/.well-known/openid-configuration\" , \"access_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"\" , \"role_mapping\" : \"\" , }, \"id_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"sub\" , \"role_mapping\" : \"\" , }, \"userinfo_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"\" , \"role_mapping\" : \"role\" , }, \"tx_tokens\" : { \"trusted\" : true , \"principal_identifier\" : \"\" , \"role_mapping\" : \"\" , }, } } }", "title": "Example Policy store"}, {"location": "cedarling/cedarling-policy-store/#policy-and-schema-authoring", "text": "You can hand create your Cedar policies and schema in Visual Studio . Make sure you run the cedar command line tool to validate both your schema and policies. The easiest way to author your policy store is to use the Policy Designer in Agama Lab . This tool helps you define the policies, schema and trusted IDPs and to publish a policy store to a Github repository.", "title": "Policy and Schema Authoring"}, {"location": "cedarling/cedarling-policy-store/#minimum-supported-cedar-policy-schema", "text": "Here is example of a minimum supported cedar-policy schema : namespace Jans { entity id_token = {\"aud\": String,\"iss\": String, \"sub\": String}; entity Role; entity User in [Role] = {}; entity Access_token = {\"aud\": String,\"iss\": String, \"jti\": String, \"client_id\": String}; entity Workload = {}; entity Issue = {}; action \"Update\" appliesTo { principal: [Workload, User, Role], resource: [Issue], context: {} }; } You can extend all of this entites and add your own. Mandatory entities is: id_token , Role , User , Access_token , Workload . Issue entity and Update action are optinal. Is created for example, you can create others for your needs. Context and Resource entities you can pass during authorization request and next entites creating based on the JWT tokens: id_token - entity based on the id JWT token fields. ID for entity based in jti field. Role - define role of user. Mapping defined in Token Metadata Schema . Claim in JWT usually is string or array of string. Each Role is parent for User . So to check role in policy use operator in to check hierarchy. User - entity based on the id and userinfo JWT token fields. If id and userinfo JWT token fields has different sub value, userinfo JWT token will be ignored. ID for entity based in sub field. (will be changed in future) Access_token - entity based on the access JWT token fields. ID for entity based in jti field. Workload - entity based on the access JWT token fields. ID for entity based in client_id field.", "title": "Minimum supported cedar-policy schema"}, {"location": "cedarling/cedarling-policy-store/#note-on-test-fixtures", "text": "You will notice that test fixtures in the cedarling code base are quite often in yaml rather than in json. yaml is intended for cedarling internal use only . The rationale is that yaml has excellent support for embedded, indented, multiline string values. That is far easier to read than base64 encoded json strings, and is beneficial for debugging and validation that test cases are correct.", "title": "Note on test fixtures"}, {"location": "cedarling/cedarling-properties/", "tags": ["administration", "lock", "authorization / authz", "Cedar", "Cedarling", "properties"], "text": "Cedarling Properties # These Bootstrap Properties control default application level behavior. CEDARLING_APPLICATION_NAME : Human friendly identifier for this application CEDARLING_POLICY_STORE_URI : Location of policy store JSON, used if policy store is not local, or retreived from Lock Master. CEDARLING_POLICY_STORE_ID : The identifier of the policy store in case there is more then one policy_store_id in the policy store. CEDARLING_USER_AUTHZ : When enabled , Cedar engine authorization is queried for a User principal. CEDARLING_WORKLOAD_AUTHZ : When enabled , Cedar engine authorization is queried for a Workload principal. CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION : AND , OR CEDARLING_MAPPING_USER : Name of Cedar User schema entity if we don't want to use default. When specified cedarling try build defined entity (from schema) as user instead of default User entity defined in cedar schema. Works in namespace defined in the policy store. CEDARLING_MAPPING_WORKLOAD : Name of Cedar Workload schema entity CEDARLING_MAPPING_ID_TOKEN : Name of Cedar id_token schema entity CEDARLING_MAPPING_ACCESS_TOKEN : Name of Cedar access_token schema entity CEDARLING_MAPPING_USERINFO_TOKEN : Name of Cedar userinfo schema entity The following bootstrap properties are needed to configure log behavior: CEDARLING_LOG_STORAGE : off , memory , std_out CEDARLING_LOG_LEVEL : System Log Level See here . Default to WARN CEDARLING_LOG_STDOUT_TYPE : Either System , Metric , or Decision . Default to System. CEDARLING_LOG_LEVEL : Log level filter for logging. Log level has only System log type entries. TRACE is lowest. FATAL is highest. Possible variants: FATAL ERROR WARN INFO DEBUG TRACE CEDARLING_DECISION_LOG_USER_CLAIMS : List of claims to map from user entity, such as [\"sub\", \"email\", \"username\", ...] CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS : List of claims to map from user entity, such as [\"client_id\", \"rp_id\", ...] CEDARLING_DECISION_LOG_DEFAULT_JWT_ID : Token claims that will be used for decision logging. Default is \"jti\", but perhaps some other claim is needed. CEDARLING_LOG_TTL : in case of memory store, TTL (time to live) of log entities in seconds. The following bootstrap properties are needed to configure JWT and cryptographic behavior: CEDARLING_LOCAL_JWKS : JWKS file with public keys CEDARLING_LOCAL_POLICY_STORE : JSON object with policy store CEDARLING_POLICY_STORE_LOCAL_FN : Local file with JSON object with policy store CEDARLING_JWT_SIG_VALIDATION : Enabled | Disabled -- Whether to check the signature of all JWT tokens. This requires an iss is present. CEDARLING_JWT_STATUS_VALIDATION : Enabled | Disabled -- Whether to check the status of the JWT. On startup, the Cedarling should fetch and retreive the latest Status List JWT from the .well-known/openid-configuration via the status_list_endpoint claim and cache it. See the IETF Draft for more info. CEDARLING_JWT_SIGNATURE_ALGORITHMS_SUPPORTED : Only tokens signed with these algorithms are acceptable to the Cedarling. CEDARLING_AT_ISS_VALIDATION : When enabled, the iss claim must be present in access token and the scheme must be https . CEDARLING_AT_JTI_VALIDATION : When enabled, the jti claim must be present in access token. CEDARLING_AT_NBF_VALIDATION : When enabled, the nbf claim must be present in access token and the Cedarling should verify that the current date is after the nbf . CEDARLING_AT_EXP_VALIDATION : When enabled, the exp claim must be present and not past the date specified. CEDARLING_IDT_ISS_VALIDATION : When enabled, the iss claim must be present in id_token and the scheme must be https . CEDARLING_IDT_SUB_VALIDATION : When enabled, the sub claim must be present in id_token. CEDARLING_IDT_EXP_VALIDATION : When enabled, the exp claim must be present and not past the date specified. CEDARLING_IDT_IAT_VALIDATION : When enabled, the iat claim must be present in id_token. CEDARLING_IDT_AUD_VALIDATION : When enabled, the aud claim must be present in id_token. CEDARLING_USERINFO_ISS_VALIDATION : When enabled, the iss claim must be present and the scheme must be https . CEDARLING_USERINFO_SUB_VALIDATION : When enabled, the sub claim must be present in Userinfo JWT. CEDARLING_USERINFO_AUD_VALIDATION : When enabled, the aud claim must be present in Userinfo JWT. CEDARLING_USERINFO_EXP_VALIDATION : When enabled, the exp claim must be present and not past the date specified. CEDARLING_ID_TOKEN_TRUST_MODE : Strict | None . Varying levels of validations based on the preference of the developer. Strict mode requires (1) id_token aud matches the access_token client_id ; (2) if a Userinfo token is present, the sub matches the id_token, and that the aud matches the access token client_id. The following bootstrap properties are only needed for enterprise deployments. CEDARLING_LOCK : Enabled | Disabled. If Enabled, the Cedarling will connect to the Lock Master for policies, and subscribe for SSE events. CEDARLING_LOCK_MASTER_CONFIGURATION_URI : Required if LOCK == Enabled . URI where Cedarling can get JSON file with all required metadata about Lock Master, i.e. .well-known/lock-master-configuration . CEDARLING_LOCK_DYNAMIC_CONFIGURATION : Enabled | Disabled, controls whether Cedarling should listen for SSE config updates. CEDARLING_LOCK_SSA_JWT : SSA for DCR in a Lock Master deployment. The Cedarling will validate this SSA JWT prior to DCR. CEDARLING_LOCK_LOG_INTERVAL : How often to send log messages to Lock Master (0 to turn off trasmission). CEDARLING_LOCK_HEALTH_INTERVAL : How often to send health messages to Lock Master (0 to turn off transmission). CEDARLING_LOCK_TELEMETRY_INTERVAL : How often to send telemetry messages to Lock Master (0 to turn off transmission). CEDARLING_LOCK_LISTEN_SSE : Enabled | Disabled: controls whether Cedarling should listen for updates from the Lock Server. User-Workload Boolean Operation # The CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION property specifies what boolean operation to use for the USER and WORKLOAD when making authz (authorization) decisions. Available Operations # AND : authz will be successful if USER AND WORKLOAD is valid. OR : authz will be successful if USER OR WORKLOAD is valid. ID Token Trust Mode # The level of validation for the ID Token JWT can be set to either None or Strict . None Mode # Setting the validation level to None will not check for the conditions outlined in Strict Mode . Strict Mode # Strict mode requires: The id_token 's aud matches the access_token 's client_id ; if a Userinfo token is present, the sub matches the id_token , and that the aud matches the access token's client_id . Local JWKS # A local JWKS can be used by setting the CEDARLING_LOCAL_JWKS bootstrap property to a path to a local JSON file. When providing a local Json Web Key Store (JWKS), the file must follow the following schema: { \"trusted_issuer_id\" : [ ... ] \"another_trusted_issuer_id\" : [ ... ] } Where keys are Trusted Issuer IDs assigned to each key store and the values contains the JSON Web Keys as defined in RFC 7517 . The trusted_issuers_id is used to tag a JWKS with a unique identifier and enables using multiple key stores. Loading the bootstrap config # There are multiple ways to load your bootstrap config: From a JSON file From a YAML file You can load from both file types using the following code snippet: use cedarling :: BootstrapConfig ; let config = BootstrapConfig :: load_from_file ( \"./path/to/your/config.json\" ). unwrap (); Loading From JSON # Below is an example of a bootstrap config in JSON format. Not all fields should be specified, almost all have default value. { \"CEDARLING_APPLICATION_NAME\" : \"My App\" , \"CEDARLING_POLICY_STORE_URI\" : \"\" , \"CEDARLING_POLICY_STORE_ID\" : \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" , \"CEDARLING_LOG_TYPE\" : \"memory\" , \"CEDARLING_LOG_LEVEL\" : \"INFO\" , \"CEDARLING_DECISION_LOG_USER_CLAIMS\" : [ \"sub\" , \"email\" , \"username\" ], \"CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS\" : [ \"client_id\" , \"rp_id\" ], \"CEDARLING_DECISION_LOG_DEFAULT_JWT_ID\" : \"jti\" , \"CEDARLING_LOG_TTL\" : 60 , \"CEDARLING_USER_AUTHZ\" : \"enabled\" , \"CEDARLING_WORKLOAD_AUTHZ\" : \"enabled\" , \"CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION\" : \"AND\" , \"CEDARLING_MAPPING_USER\" : \"CustomUser\" , \"CEDARLING_MAPPING_WORKLOAD\" : \"CustomWorkload\" , \"CEDARLING_MAPPING_ID_TOKEN\" : \"CustomIdToken\" , \"CEDARLING_MAPPING_ACCESS_TOKEN\" : \"CustomAccessToken\" , \"CEDARLING_MAPPING_USERINFO_TOKEN\" : \"CustomUserinfoToken\" , \"CEDARLING_LOCAL_JWKS\" : \"../test_files/local_jwks.json\" , \"CEDARLING_LOCAL_POLICY_STORE\" : null , \"CEDARLING_POLICY_STORE_LOCAL_FN\" : \"../test_files/policy-store_blobby.json\" , \"CEDARLING_JWT_SIG_VALIDATION\" : \"enabled\" , \"CEDARLING_JWT_STATUS_VALIDATION\" : \"disabled\" , \"CEDARLING_JWT_SIGNATURE_ALGORITHMS_SUPPORTED\" : [ \"HS256\" , \"RS256\" ], \"CEDARLING_AT_ISS_VALIDATION\" : \"disabled\" , \"CEDARLING_AT_JTI_VALIDATION\" : \"disabled\" , \"CEDARLING_AT_NBF_VALIDATION\" : \"disabled\" , \"CEDARLING_AT_EXP_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_ISS_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_SUB_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_EXP_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_IAT_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_AUD_VALIDATION\" : \"enabled\" , \"CEDARLING_USERINFO_ISS_VALIDATION\" : \"enabled\" , \"CEDARLING_USERINFO_SUB_VALIDATION\" : \"enabled\" , \"CEDARLING_USERINFO_AUD_VALIDATION\" : \"enabled\" , \"CEDARLING_USERINFO_EXP_VALIDATION\" : \"enabled\" , \"CEDARLING_ID_TOKEN_TRUST_MODE\" : \"Strict\" , \"CEDARLING_LOCK\" : \"disabled\" , \"CEDARLING_LOCK_MASTER_CONFIGURATION_URI\" : null , \"CEDARLING_DYNAMIC_CONFIGURATION\" : \"disabled\" , \"CEDARLING_LOCK_SSA_JWT\" : null , \"CEDARLING_AUDIT_HEALTH_INTERVAL\" : 0 , \"CEDARLING_AUDIT_TELEMETRY_INTERVAL\" : 0 , \"CEDARLING_LISTEN_SSE\" : \"disabled\" } Note that properties set to \"disabled\" , an empty string \"\" , zero 0 , and null can be ommited since they are the defaults. Local JWKS # A local JWKS can be used by setting the CEDARLING_LOCAL_JWKS bootstrap property to a path to a local JSON file. When providing a local Json Web Key Store (JWKS), the file must follow the following schema: { \"trusted_issuer_id\" : [ ... ] \"another_trusted_issuer_id\" : [ ... ] } Where keys are Trusted Issuer IDs assigned to each key store and the values contains the JSON Web Keys as defined in RFC 7517 . The trusted_issuers_id is used to tag a JWKS with a unique identifier and enables using multiple key stores. Note that properties set to \"disabled\" , an empty string \"\" , zero 0 , and null can be ommited since they are the defaults. Loading From YAML # Below is an example of a bootstrap config in YAML format. Not all fields should be specified, almost all have default value. CEDARLING_APPLICATION_NAME : My App CEDARLING_POLICY_STORE_URI : '' CEDARLING_POLICY_STORE_ID : '840da5d85403f35ea76519ed1a18a33989f855bf1cf8' CEDARLING_LOG_TYPE : 'memory' CEDARLING_LOG_LEVEL : 'INFO' CEDARLING_DECISION_LOG_USER_CLAIMS : [ \"sub\" , \"email\" ] CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS : [ \"client_id\" , \"rp_id\" ] CEDARLING_LOG_TTL : 60 CEDARLING_USER_AUTHZ : 'enabled' CEDARLING_WORKLOAD_AUTHZ : 'enabled' CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION : 'AND' CEDARLING_MAPPING_USER : 'CustomUser' CEDARLING_MAPPING_WORKLOAD : 'CustomWorkload' CEDARLING_MAPPING_ID_TOKEN : 'CustomIdToken' CEDARLING_MAPPING_ACCESS_TOKEN : 'CustomAccessToken' CEDARLING_MAPPING_USERINFO_TOKEN : 'CustomUserinfoToken' CEDARLING_LOCAL_JWKS : '../test_files/local_jwks.json' CEDARLING_LOCAL_POLICY_STORE : null CEDARLING_POLICY_STORE_LOCAL_FN : '../test_files/policy-store_blobby.json' CEDARLING_JWT_SIG_VALIDATION : 'enabled' CEDARLING_JWT_STATUS_VALIDATION : 'disabled' CEDARLING_JWT_SIGNATURE_ALGORITHMS_SUPPORTED : - 'HS256' - 'RS256' CEDARLING_AT_ISS_VALIDATION : 'disabled' CEDARLING_AT_JTI_VALIDATION : 'disabled' CEDARLING_AT_NBF_VALIDATION : 'disabled' CEDARLING_AT_EXP_VALIDATION : 'enabled' CEDARLING_IDT_ISS_VALIDATION : 'enabled' CEDARLING_IDT_SUB_VALIDATION : 'enabled' CEDARLING_IDT_EXP_VALIDATION : 'enabled' CEDARLING_IDT_IAT_VALIDATION : 'enabled' CEDARLING_IDT_AUD_VALIDATION : 'enabled' CEDARLING_USERINFO_ISS_VALIDATION : 'enabled' CEDARLING_USERINFO_SUB_VALIDATION : 'enabled' CEDARLING_USERINFO_AUD_VALIDATION : 'enabled' CEDARLING_USERINFO_EXP_VALIDATION : 'enabled' CEDARLING_ID_TOKEN_TRUST_MODE : 'Strict' CEDARLING_LOCK : 'disabled' CEDARLING_LOCK_MASTER_CONFIGURATION_URI : null CEDARLING_DYNAMIC_CONFIGURATION : 'disabled' CEDARLING_LOCK_SSA_JWT : 0 CEDARLING_AUDIT_HEALTH_INTERVAL : 0 CEDARLING_AUDIT_TELEMETRY_INTERVAL : 0 CEDARLING_LISTEN_SSE : 'disabled' Note that properties set to 'disabled' , an empty string '' , zero 0 , and null can be ommited since they are the defaults.", "title": "Properties"}, {"location": "cedarling/cedarling-properties/#cedarling-properties", "text": "These Bootstrap Properties control default application level behavior. CEDARLING_APPLICATION_NAME : Human friendly identifier for this application CEDARLING_POLICY_STORE_URI : Location of policy store JSON, used if policy store is not local, or retreived from Lock Master. CEDARLING_POLICY_STORE_ID : The identifier of the policy store in case there is more then one policy_store_id in the policy store. CEDARLING_USER_AUTHZ : When enabled , Cedar engine authorization is queried for a User principal. CEDARLING_WORKLOAD_AUTHZ : When enabled , Cedar engine authorization is queried for a Workload principal. CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION : AND , OR CEDARLING_MAPPING_USER : Name of Cedar User schema entity if we don't want to use default. When specified cedarling try build defined entity (from schema) as user instead of default User entity defined in cedar schema. Works in namespace defined in the policy store. CEDARLING_MAPPING_WORKLOAD : Name of Cedar Workload schema entity CEDARLING_MAPPING_ID_TOKEN : Name of Cedar id_token schema entity CEDARLING_MAPPING_ACCESS_TOKEN : Name of Cedar access_token schema entity CEDARLING_MAPPING_USERINFO_TOKEN : Name of Cedar userinfo schema entity The following bootstrap properties are needed to configure log behavior: CEDARLING_LOG_STORAGE : off , memory , std_out CEDARLING_LOG_LEVEL : System Log Level See here . Default to WARN CEDARLING_LOG_STDOUT_TYPE : Either System , Metric , or Decision . Default to System. CEDARLING_LOG_LEVEL : Log level filter for logging. Log level has only System log type entries. TRACE is lowest. FATAL is highest. Possible variants: FATAL ERROR WARN INFO DEBUG TRACE CEDARLING_DECISION_LOG_USER_CLAIMS : List of claims to map from user entity, such as [\"sub\", \"email\", \"username\", ...] CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS : List of claims to map from user entity, such as [\"client_id\", \"rp_id\", ...] CEDARLING_DECISION_LOG_DEFAULT_JWT_ID : Token claims that will be used for decision logging. Default is \"jti\", but perhaps some other claim is needed. CEDARLING_LOG_TTL : in case of memory store, TTL (time to live) of log entities in seconds. The following bootstrap properties are needed to configure JWT and cryptographic behavior: CEDARLING_LOCAL_JWKS : JWKS file with public keys CEDARLING_LOCAL_POLICY_STORE : JSON object with policy store CEDARLING_POLICY_STORE_LOCAL_FN : Local file with JSON object with policy store CEDARLING_JWT_SIG_VALIDATION : Enabled | Disabled -- Whether to check the signature of all JWT tokens. This requires an iss is present. CEDARLING_JWT_STATUS_VALIDATION : Enabled | Disabled -- Whether to check the status of the JWT. On startup, the Cedarling should fetch and retreive the latest Status List JWT from the .well-known/openid-configuration via the status_list_endpoint claim and cache it. See the IETF Draft for more info. CEDARLING_JWT_SIGNATURE_ALGORITHMS_SUPPORTED : Only tokens signed with these algorithms are acceptable to the Cedarling. CEDARLING_AT_ISS_VALIDATION : When enabled, the iss claim must be present in access token and the scheme must be https . CEDARLING_AT_JTI_VALIDATION : When enabled, the jti claim must be present in access token. CEDARLING_AT_NBF_VALIDATION : When enabled, the nbf claim must be present in access token and the Cedarling should verify that the current date is after the nbf . CEDARLING_AT_EXP_VALIDATION : When enabled, the exp claim must be present and not past the date specified. CEDARLING_IDT_ISS_VALIDATION : When enabled, the iss claim must be present in id_token and the scheme must be https . CEDARLING_IDT_SUB_VALIDATION : When enabled, the sub claim must be present in id_token. CEDARLING_IDT_EXP_VALIDATION : When enabled, the exp claim must be present and not past the date specified. CEDARLING_IDT_IAT_VALIDATION : When enabled, the iat claim must be present in id_token. CEDARLING_IDT_AUD_VALIDATION : When enabled, the aud claim must be present in id_token. CEDARLING_USERINFO_ISS_VALIDATION : When enabled, the iss claim must be present and the scheme must be https . CEDARLING_USERINFO_SUB_VALIDATION : When enabled, the sub claim must be present in Userinfo JWT. CEDARLING_USERINFO_AUD_VALIDATION : When enabled, the aud claim must be present in Userinfo JWT. CEDARLING_USERINFO_EXP_VALIDATION : When enabled, the exp claim must be present and not past the date specified. CEDARLING_ID_TOKEN_TRUST_MODE : Strict | None . Varying levels of validations based on the preference of the developer. Strict mode requires (1) id_token aud matches the access_token client_id ; (2) if a Userinfo token is present, the sub matches the id_token, and that the aud matches the access token client_id. The following bootstrap properties are only needed for enterprise deployments. CEDARLING_LOCK : Enabled | Disabled. If Enabled, the Cedarling will connect to the Lock Master for policies, and subscribe for SSE events. CEDARLING_LOCK_MASTER_CONFIGURATION_URI : Required if LOCK == Enabled . URI where Cedarling can get JSON file with all required metadata about Lock Master, i.e. .well-known/lock-master-configuration . CEDARLING_LOCK_DYNAMIC_CONFIGURATION : Enabled | Disabled, controls whether Cedarling should listen for SSE config updates. CEDARLING_LOCK_SSA_JWT : SSA for DCR in a Lock Master deployment. The Cedarling will validate this SSA JWT prior to DCR. CEDARLING_LOCK_LOG_INTERVAL : How often to send log messages to Lock Master (0 to turn off trasmission). CEDARLING_LOCK_HEALTH_INTERVAL : How often to send health messages to Lock Master (0 to turn off transmission). CEDARLING_LOCK_TELEMETRY_INTERVAL : How often to send telemetry messages to Lock Master (0 to turn off transmission). CEDARLING_LOCK_LISTEN_SSE : Enabled | Disabled: controls whether Cedarling should listen for updates from the Lock Server.", "title": "Cedarling Properties"}, {"location": "cedarling/cedarling-properties/#user-workload-boolean-operation", "text": "The CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION property specifies what boolean operation to use for the USER and WORKLOAD when making authz (authorization) decisions.", "title": "User-Workload Boolean Operation"}, {"location": "cedarling/cedarling-properties/#available-operations", "text": "AND : authz will be successful if USER AND WORKLOAD is valid. OR : authz will be successful if USER OR WORKLOAD is valid.", "title": "Available Operations"}, {"location": "cedarling/cedarling-properties/#id-token-trust-mode", "text": "The level of validation for the ID Token JWT can be set to either None or Strict .", "title": "ID Token Trust Mode"}, {"location": "cedarling/cedarling-properties/#none-mode", "text": "Setting the validation level to None will not check for the conditions outlined in Strict Mode .", "title": "None Mode"}, {"location": "cedarling/cedarling-properties/#strict-mode", "text": "Strict mode requires: The id_token 's aud matches the access_token 's client_id ; if a Userinfo token is present, the sub matches the id_token , and that the aud matches the access token's client_id .", "title": "Strict Mode"}, {"location": "cedarling/cedarling-properties/#local-jwks", "text": "A local JWKS can be used by setting the CEDARLING_LOCAL_JWKS bootstrap property to a path to a local JSON file. When providing a local Json Web Key Store (JWKS), the file must follow the following schema: { \"trusted_issuer_id\" : [ ... ] \"another_trusted_issuer_id\" : [ ... ] } Where keys are Trusted Issuer IDs assigned to each key store and the values contains the JSON Web Keys as defined in RFC 7517 . The trusted_issuers_id is used to tag a JWKS with a unique identifier and enables using multiple key stores.", "title": "Local JWKS"}, {"location": "cedarling/cedarling-properties/#loading-the-bootstrap-config", "text": "There are multiple ways to load your bootstrap config: From a JSON file From a YAML file You can load from both file types using the following code snippet: use cedarling :: BootstrapConfig ; let config = BootstrapConfig :: load_from_file ( \"./path/to/your/config.json\" ). unwrap ();", "title": "Loading the bootstrap config"}, {"location": "cedarling/cedarling-properties/#loading-from-json", "text": "Below is an example of a bootstrap config in JSON format. Not all fields should be specified, almost all have default value. { \"CEDARLING_APPLICATION_NAME\" : \"My App\" , \"CEDARLING_POLICY_STORE_URI\" : \"\" , \"CEDARLING_POLICY_STORE_ID\" : \"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\" , \"CEDARLING_LOG_TYPE\" : \"memory\" , \"CEDARLING_LOG_LEVEL\" : \"INFO\" , \"CEDARLING_DECISION_LOG_USER_CLAIMS\" : [ \"sub\" , \"email\" , \"username\" ], \"CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS\" : [ \"client_id\" , \"rp_id\" ], \"CEDARLING_DECISION_LOG_DEFAULT_JWT_ID\" : \"jti\" , \"CEDARLING_LOG_TTL\" : 60 , \"CEDARLING_USER_AUTHZ\" : \"enabled\" , \"CEDARLING_WORKLOAD_AUTHZ\" : \"enabled\" , \"CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION\" : \"AND\" , \"CEDARLING_MAPPING_USER\" : \"CustomUser\" , \"CEDARLING_MAPPING_WORKLOAD\" : \"CustomWorkload\" , \"CEDARLING_MAPPING_ID_TOKEN\" : \"CustomIdToken\" , \"CEDARLING_MAPPING_ACCESS_TOKEN\" : \"CustomAccessToken\" , \"CEDARLING_MAPPING_USERINFO_TOKEN\" : \"CustomUserinfoToken\" , \"CEDARLING_LOCAL_JWKS\" : \"../test_files/local_jwks.json\" , \"CEDARLING_LOCAL_POLICY_STORE\" : null , \"CEDARLING_POLICY_STORE_LOCAL_FN\" : \"../test_files/policy-store_blobby.json\" , \"CEDARLING_JWT_SIG_VALIDATION\" : \"enabled\" , \"CEDARLING_JWT_STATUS_VALIDATION\" : \"disabled\" , \"CEDARLING_JWT_SIGNATURE_ALGORITHMS_SUPPORTED\" : [ \"HS256\" , \"RS256\" ], \"CEDARLING_AT_ISS_VALIDATION\" : \"disabled\" , \"CEDARLING_AT_JTI_VALIDATION\" : \"disabled\" , \"CEDARLING_AT_NBF_VALIDATION\" : \"disabled\" , \"CEDARLING_AT_EXP_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_ISS_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_SUB_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_EXP_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_IAT_VALIDATION\" : \"enabled\" , \"CEDARLING_IDT_AUD_VALIDATION\" : \"enabled\" , \"CEDARLING_USERINFO_ISS_VALIDATION\" : \"enabled\" , \"CEDARLING_USERINFO_SUB_VALIDATION\" : \"enabled\" , \"CEDARLING_USERINFO_AUD_VALIDATION\" : \"enabled\" , \"CEDARLING_USERINFO_EXP_VALIDATION\" : \"enabled\" , \"CEDARLING_ID_TOKEN_TRUST_MODE\" : \"Strict\" , \"CEDARLING_LOCK\" : \"disabled\" , \"CEDARLING_LOCK_MASTER_CONFIGURATION_URI\" : null , \"CEDARLING_DYNAMIC_CONFIGURATION\" : \"disabled\" , \"CEDARLING_LOCK_SSA_JWT\" : null , \"CEDARLING_AUDIT_HEALTH_INTERVAL\" : 0 , \"CEDARLING_AUDIT_TELEMETRY_INTERVAL\" : 0 , \"CEDARLING_LISTEN_SSE\" : \"disabled\" } Note that properties set to \"disabled\" , an empty string \"\" , zero 0 , and null can be ommited since they are the defaults.", "title": "Loading From JSON"}, {"location": "cedarling/cedarling-properties/#local-jwks_1", "text": "A local JWKS can be used by setting the CEDARLING_LOCAL_JWKS bootstrap property to a path to a local JSON file. When providing a local Json Web Key Store (JWKS), the file must follow the following schema: { \"trusted_issuer_id\" : [ ... ] \"another_trusted_issuer_id\" : [ ... ] } Where keys are Trusted Issuer IDs assigned to each key store and the values contains the JSON Web Keys as defined in RFC 7517 . The trusted_issuers_id is used to tag a JWKS with a unique identifier and enables using multiple key stores. Note that properties set to \"disabled\" , an empty string \"\" , zero 0 , and null can be ommited since they are the defaults.", "title": "Local JWKS"}, {"location": "cedarling/cedarling-properties/#loading-from-yaml", "text": "Below is an example of a bootstrap config in YAML format. Not all fields should be specified, almost all have default value. CEDARLING_APPLICATION_NAME : My App CEDARLING_POLICY_STORE_URI : '' CEDARLING_POLICY_STORE_ID : '840da5d85403f35ea76519ed1a18a33989f855bf1cf8' CEDARLING_LOG_TYPE : 'memory' CEDARLING_LOG_LEVEL : 'INFO' CEDARLING_DECISION_LOG_USER_CLAIMS : [ \"sub\" , \"email\" ] CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS : [ \"client_id\" , \"rp_id\" ] CEDARLING_LOG_TTL : 60 CEDARLING_USER_AUTHZ : 'enabled' CEDARLING_WORKLOAD_AUTHZ : 'enabled' CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION : 'AND' CEDARLING_MAPPING_USER : 'CustomUser' CEDARLING_MAPPING_WORKLOAD : 'CustomWorkload' CEDARLING_MAPPING_ID_TOKEN : 'CustomIdToken' CEDARLING_MAPPING_ACCESS_TOKEN : 'CustomAccessToken' CEDARLING_MAPPING_USERINFO_TOKEN : 'CustomUserinfoToken' CEDARLING_LOCAL_JWKS : '../test_files/local_jwks.json' CEDARLING_LOCAL_POLICY_STORE : null CEDARLING_POLICY_STORE_LOCAL_FN : '../test_files/policy-store_blobby.json' CEDARLING_JWT_SIG_VALIDATION : 'enabled' CEDARLING_JWT_STATUS_VALIDATION : 'disabled' CEDARLING_JWT_SIGNATURE_ALGORITHMS_SUPPORTED : - 'HS256' - 'RS256' CEDARLING_AT_ISS_VALIDATION : 'disabled' CEDARLING_AT_JTI_VALIDATION : 'disabled' CEDARLING_AT_NBF_VALIDATION : 'disabled' CEDARLING_AT_EXP_VALIDATION : 'enabled' CEDARLING_IDT_ISS_VALIDATION : 'enabled' CEDARLING_IDT_SUB_VALIDATION : 'enabled' CEDARLING_IDT_EXP_VALIDATION : 'enabled' CEDARLING_IDT_IAT_VALIDATION : 'enabled' CEDARLING_IDT_AUD_VALIDATION : 'enabled' CEDARLING_USERINFO_ISS_VALIDATION : 'enabled' CEDARLING_USERINFO_SUB_VALIDATION : 'enabled' CEDARLING_USERINFO_AUD_VALIDATION : 'enabled' CEDARLING_USERINFO_EXP_VALIDATION : 'enabled' CEDARLING_ID_TOKEN_TRUST_MODE : 'Strict' CEDARLING_LOCK : 'disabled' CEDARLING_LOCK_MASTER_CONFIGURATION_URI : null CEDARLING_DYNAMIC_CONFIGURATION : 'disabled' CEDARLING_LOCK_SSA_JWT : 0 CEDARLING_AUDIT_HEALTH_INTERVAL : 0 CEDARLING_AUDIT_TELEMETRY_INTERVAL : 0 CEDARLING_LISTEN_SSE : 'disabled' Note that properties set to 'disabled' , an empty string '' , zero 0 , and null can be ommited since they are the defaults.", "title": "Loading From YAML"}, {"location": "cedarling/cedarling-wasm/", "tags": ["cedarling", "wasm"], "text": "WASM for Cedarling # Cedarling provides a binding for JavaScript programs via the wasm-pack tool. This allows browser developers to use the cedarling crate in their code directly. Requirements # Rust 1.63 or greater Installed wasm-pack via cargo clang with wasm target support Building # Install wasm-pack by: cargo install wasm-pack Build cedarling wasm in release: wasm-pack build --release --target web wasm-pack automatically make optimization of wasm binary file, using wasm-opt . - Get result in the pkg folder. Including in projects # For using result files in browser project you need make result pkg folder accessible for loading in the browser so that you can later import the corresponding file from the browser. Here is example of code snippet: < script type = \"module\" > import initWasm , { init } from \"/pkg/cedarling_wasm.js\" ; async function main () { await initWasm (); // Initialize the WebAssembly module // init cedarling with `BOOTSTRAP` config let instance = await init ({ \"CEDARLING_APPLICATION_NAME\" : \"My App\" , \"CEDARLING_POLICY_STORE_URI\" : \"https://example.com/policy-store.json\" , \"CEDARLING_LOG_TYPE\" : \"memory\" , \"CEDARLING_LOG_LEVEL\" : \"INFO\" , \"CEDARLING_LOG_TTL\" : 120 , \"CEDARLING_DECISION_LOG_USER_CLAIMS \" : [ \"aud\" , \"sub\" , \"email\" , \"username\" ], \"CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS \" : [ \"aud\" , \"client_id\" , \"rp_id\" ], \"CEDARLING_USER_AUTHZ\" : \"enabled\" , \"CEDARLING_WORKLOAD_AUTHZ\" : \"enabled\" , \"CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION\" : \"AND\" , }); // make authorize request let result = await instance . authorize ({ \"tokens\" : { \"access_token\" : \"...\" , \"id_token\" : \"...\" , \"userinfo_token\" : \"...\" , }, \"action\" : 'Jans::Action::\"Read\"' , \"resource\" : { \"type\" : \"Jans::Application\" , \"id\" : \"some_id\" , \"app_id\" : \"application_id\" , \"name\" : \"Some Application\" , \"url\" : { \"host\" : \"jans.test\" , \"path\" : \"/protected-endpoint\" , \"protocol\" : \"http\" } }, \"context\" : { \"current_time\" : Math . floor ( Date . now () / 1000 ), \"device_health\" : [ \"Healthy\" ], \"fraud_indicators\" : [ \"Allowed\" ], \"geolocation\" : [ \"America\" ], \"network\" : \"127.0.0.1\" , \"network_type\" : \"Local\" , \"operating_system\" : \"Linux\" , \"user_agent\" : \"Linux\" }, }); console . log ( \"result:\" , result ); } main (). catch ( console . error ); script > Usage # Before usage make sure that you have completed Building steps. You can find usage examples in the following locations: jans-cedarling/bindings/cedarling_wasm/index.html : A simple example demonstrating basic usage. jans-cedarling/bindings/cedarling_wasm/cedarling_app.html : A fully featured Cedarling browser app where you can test and validate your configuration. Defined API # /** * Create a new instance of the Cedarling application. * This function can take as config parameter the eather `Map` other `Object` */ export function init ( config : any ) : Promise < Cedarling > ; /** * The instance of the Cedarling application. */ export class Cedarling { /** * Create a new instance of the Cedarling application. * Assume that config is `Object` */ static new ( config : object ) : Promise < Cedarling > ; /** * Create a new instance of the Cedarling application. * Assume that config is `Map` */ static new_from_map ( config : Map < any , any > ) : Promise < Cedarling > ; /** * Authorize request * makes authorization decision based on the [`Request`] */ authorize ( request : any ) : Promise < AuthorizeResult > ; /** * Get logs and remove them from the storage. * Returns `Array` of `Map` */ pop_logs () : Array < any > ; /** * Get specific log entry. * Returns `Map` with values or `null`. */ get_log_by_id ( id : string ) : any ; /** * Returns a list of all log ids. * Returns `Array` of `String` */ get_log_ids () : Array < any > ; } /** * A WASM wrapper for the Rust `cedarling::AuthorizeResult` struct. * Represents the result of an authorization request. */ export class AuthorizeResult { /** * Convert `AuthorizeResult` to json string value */ json_string () : string ; /** * Result of authorization where principal is `Jans::Workload` */ workload? : AuthorizeResultResponse ; /** * Result of authorization where principal is `Jans::User` */ person? : AuthorizeResultResponse ; /** * Result of authorization * true means `ALLOW` * false means `Deny` * * this field is [`bool`] type to be compatible with [authzen Access Evaluation Decision](https://openid.github.io/authzen/#section-6.2.1). */ decision : boolean ; } /** * A WASM wrapper for the Rust `cedar_policy::Response` struct. * Represents the result of an authorization request. */ export class AuthorizeResultResponse { /** * Authorization decision */ readonly decision : boolean ; /** * Diagnostics providing more information on how this decision was reached */ readonly diagnostics : Diagnostics ; } /** * Diagnostics * =========== * * Provides detailed information about how a policy decision was made, including policies that contributed to the decision and any errors encountered during evaluation. */ export class Diagnostics { /** * `PolicyId`s of the policies that contributed to the decision. * If no policies applied to the request, this set will be empty. * * The ids should be treated as unordered, */ readonly reason : ( string )[]; /** * Errors that occurred during authorization. The errors should be * treated as unordered, since policies may be evaluated in any order. */ readonly errors : ( PolicyEvaluationError )[]; } /** * PolicyEvaluationError * ===================== * * Represents an error that occurred when evaluating a Cedar policy. */ export class PolicyEvaluationError { /** * Id of the policy with an error */ readonly id : string ; /** * Underlying evaluation error string representation */ readonly error : string ; }", "title": "WASM"}, {"location": "cedarling/cedarling-wasm/#wasm-for-cedarling", "text": "Cedarling provides a binding for JavaScript programs via the wasm-pack tool. This allows browser developers to use the cedarling crate in their code directly.", "title": "WASM for Cedarling"}, {"location": "cedarling/cedarling-wasm/#requirements", "text": "Rust 1.63 or greater Installed wasm-pack via cargo clang with wasm target support", "title": "Requirements"}, {"location": "cedarling/cedarling-wasm/#building", "text": "Install wasm-pack by: cargo install wasm-pack Build cedarling wasm in release: wasm-pack build --release --target web wasm-pack automatically make optimization of wasm binary file, using wasm-opt . - Get result in the pkg folder.", "title": "Building"}, {"location": "cedarling/cedarling-wasm/#including-in-projects", "text": "For using result files in browser project you need make result pkg folder accessible for loading in the browser so that you can later import the corresponding file from the browser. Here is example of code snippet: < script type = \"module\" > import initWasm , { init } from \"/pkg/cedarling_wasm.js\" ; async function main () { await initWasm (); // Initialize the WebAssembly module // init cedarling with `BOOTSTRAP` config let instance = await init ({ \"CEDARLING_APPLICATION_NAME\" : \"My App\" , \"CEDARLING_POLICY_STORE_URI\" : \"https://example.com/policy-store.json\" , \"CEDARLING_LOG_TYPE\" : \"memory\" , \"CEDARLING_LOG_LEVEL\" : \"INFO\" , \"CEDARLING_LOG_TTL\" : 120 , \"CEDARLING_DECISION_LOG_USER_CLAIMS \" : [ \"aud\" , \"sub\" , \"email\" , \"username\" ], \"CEDARLING_DECISION_LOG_WORKLOAD_CLAIMS \" : [ \"aud\" , \"client_id\" , \"rp_id\" ], \"CEDARLING_USER_AUTHZ\" : \"enabled\" , \"CEDARLING_WORKLOAD_AUTHZ\" : \"enabled\" , \"CEDARLING_USER_WORKLOAD_BOOLEAN_OPERATION\" : \"AND\" , }); // make authorize request let result = await instance . authorize ({ \"tokens\" : { \"access_token\" : \"...\" , \"id_token\" : \"...\" , \"userinfo_token\" : \"...\" , }, \"action\" : 'Jans::Action::\"Read\"' , \"resource\" : { \"type\" : \"Jans::Application\" , \"id\" : \"some_id\" , \"app_id\" : \"application_id\" , \"name\" : \"Some Application\" , \"url\" : { \"host\" : \"jans.test\" , \"path\" : \"/protected-endpoint\" , \"protocol\" : \"http\" } }, \"context\" : { \"current_time\" : Math . floor ( Date . now () / 1000 ), \"device_health\" : [ \"Healthy\" ], \"fraud_indicators\" : [ \"Allowed\" ], \"geolocation\" : [ \"America\" ], \"network\" : \"127.0.0.1\" , \"network_type\" : \"Local\" , \"operating_system\" : \"Linux\" , \"user_agent\" : \"Linux\" }, }); console . log ( \"result:\" , result ); } main (). catch ( console . error ); script >", "title": "Including in projects"}, {"location": "cedarling/cedarling-wasm/#usage", "text": "Before usage make sure that you have completed Building steps. You can find usage examples in the following locations: jans-cedarling/bindings/cedarling_wasm/index.html : A simple example demonstrating basic usage. jans-cedarling/bindings/cedarling_wasm/cedarling_app.html : A fully featured Cedarling browser app where you can test and validate your configuration.", "title": "Usage"}, {"location": "cedarling/cedarling-wasm/#defined-api", "text": "/** * Create a new instance of the Cedarling application. * This function can take as config parameter the eather `Map` other `Object` */ export function init ( config : any ) : Promise < Cedarling > ; /** * The instance of the Cedarling application. */ export class Cedarling { /** * Create a new instance of the Cedarling application. * Assume that config is `Object` */ static new ( config : object ) : Promise < Cedarling > ; /** * Create a new instance of the Cedarling application. * Assume that config is `Map` */ static new_from_map ( config : Map < any , any > ) : Promise < Cedarling > ; /** * Authorize request * makes authorization decision based on the [`Request`] */ authorize ( request : any ) : Promise < AuthorizeResult > ; /** * Get logs and remove them from the storage. * Returns `Array` of `Map` */ pop_logs () : Array < any > ; /** * Get specific log entry. * Returns `Map` with values or `null`. */ get_log_by_id ( id : string ) : any ; /** * Returns a list of all log ids. * Returns `Array` of `String` */ get_log_ids () : Array < any > ; } /** * A WASM wrapper for the Rust `cedarling::AuthorizeResult` struct. * Represents the result of an authorization request. */ export class AuthorizeResult { /** * Convert `AuthorizeResult` to json string value */ json_string () : string ; /** * Result of authorization where principal is `Jans::Workload` */ workload? : AuthorizeResultResponse ; /** * Result of authorization where principal is `Jans::User` */ person? : AuthorizeResultResponse ; /** * Result of authorization * true means `ALLOW` * false means `Deny` * * this field is [`bool`] type to be compatible with [authzen Access Evaluation Decision](https://openid.github.io/authzen/#section-6.2.1). */ decision : boolean ; } /** * A WASM wrapper for the Rust `cedar_policy::Response` struct. * Represents the result of an authorization request. */ export class AuthorizeResultResponse { /** * Authorization decision */ readonly decision : boolean ; /** * Diagnostics providing more information on how this decision was reached */ readonly diagnostics : Diagnostics ; } /** * Diagnostics * =========== * * Provides detailed information about how a policy decision was made, including policies that contributed to the decision and any errors encountered during evaluation. */ export class Diagnostics { /** * `PolicyId`s of the policies that contributed to the decision. * If no policies applied to the request, this set will be empty. * * The ids should be treated as unordered, */ readonly reason : ( string )[]; /** * Errors that occurred during authorization. The errors should be * treated as unordered, since policies may be evaluated in any order. */ readonly errors : ( PolicyEvaluationError )[]; } /** * PolicyEvaluationError * ===================== * * Represents an error that occurred when evaluating a Cedar policy. */ export class PolicyEvaluationError { /** * Id of the policy with an error */ readonly id : string ; /** * Underlying evaluation error string representation */ readonly error : string ; }", "title": "Defined API"}, {"location": "cedarling/python/sidecar/", "tags": ["cedarling", "python", "sidecar"], "text": "Flask Sidecar # The sidecar is a containerized Flask project that uses the cedarling_python binding and implements the AuthZen specification. This image can run alongside another service and uses cedarling to validate evaluation requests against a policy store. Docker setup # Ensure that you have installed docker and docker compose . Clone the Janssen repository Navigate to jans/jans-cedarling/flask-sidecar Edit the provided secrets/bootstrap.json file to your specifications. The configuration keys are described here . Run docker compose up For cloud deployments, please use the provided Dockerfile and pass your bootstrap configuration via the environment variable CEDARLING_BOOTSTRAP_CONFIG_FILE . The sidecar runs on port 5000. OpenAPI documentation is available at http://0.0.0.0:5000/swagger-ui Usage # The sidecar has one endpoint: /cedarling/evaluation . Example request to the evaluation endpoint: { \"subject\": { \"type\": \"string\", \"id\": \"string\" }, \"resource\": { \"type\": \"Jans::Application\", \"id\": \"some_id\", \"properties\": { \"app_id\": \"application_id\", \"name\": \"Some Application\", \"url\": { \"host\": \"jans.test\", \"path\": \"/protected-endpoint\", \"protocol\": \"http\" } } }, \"action\": { \"name\": \"Jans::Action::\\\"Read\\\"\" }, \"context\": { \"access_token\": \"...\", \"id_token\": \"...\", \"userinfo_token\": \"...\", \"device_health\": [ \"Healthy\" ], \"fraud_indicators\": [ \"Allowed\" ], \"geolocation\": [ \"America\" ], \"network\": \"127.0.0.1\", \"network_type\": \"Local\", \"operating_system\": \"Linux\", \"user_agent\": \"Linux\", \"current_time\": 1 } } Cedarling requires OpenID Userinfo, Access, and ID tokens to construct the principal entity, as described here . As per AuthZen specification, these values are sent in the context field of the payload. Conversely, the subject field is currently not used by cedarling. These 3 tokens are subsequently removed from the context object before it is passed to cedarling. Upon creating the principal, action, resource, and context entities, cedarling will evaluate these entities against the policies defined in the policy store. Then it will return a true/false decision. If the decision is false, the sidecar will analyze cedarling diagnostics and provide additional information for the admin. Example of true case: { \"decision\": true } Example of false case: { \"context\": { \"reason_admin\": { \"person diagnostics\": [], \"person error\": [], \"person evaluation\": \"DENY\", \"workload diagnostics\": [], \"workload evaluation\": \"DENY\", \"workload_error\": [] } }, \"decision\": false } In this example both the person and workload evaluations were DENY , so the decision was false. Additional information is returned in the context field as per AuthZen specification.", "title": "Sidecar"}, {"location": "cedarling/python/sidecar/#flask-sidecar", "text": "The sidecar is a containerized Flask project that uses the cedarling_python binding and implements the AuthZen specification. This image can run alongside another service and uses cedarling to validate evaluation requests against a policy store.", "title": "Flask Sidecar"}, {"location": "cedarling/python/sidecar/#docker-setup", "text": "Ensure that you have installed docker and docker compose . Clone the Janssen repository Navigate to jans/jans-cedarling/flask-sidecar Edit the provided secrets/bootstrap.json file to your specifications. The configuration keys are described here . Run docker compose up For cloud deployments, please use the provided Dockerfile and pass your bootstrap configuration via the environment variable CEDARLING_BOOTSTRAP_CONFIG_FILE . The sidecar runs on port 5000. OpenAPI documentation is available at http://0.0.0.0:5000/swagger-ui", "title": "Docker setup"}, {"location": "cedarling/python/sidecar/#usage", "text": "The sidecar has one endpoint: /cedarling/evaluation . Example request to the evaluation endpoint: { \"subject\": { \"type\": \"string\", \"id\": \"string\" }, \"resource\": { \"type\": \"Jans::Application\", \"id\": \"some_id\", \"properties\": { \"app_id\": \"application_id\", \"name\": \"Some Application\", \"url\": { \"host\": \"jans.test\", \"path\": \"/protected-endpoint\", \"protocol\": \"http\" } } }, \"action\": { \"name\": \"Jans::Action::\\\"Read\\\"\" }, \"context\": { \"access_token\": \"...\", \"id_token\": \"...\", \"userinfo_token\": \"...\", \"device_health\": [ \"Healthy\" ], \"fraud_indicators\": [ \"Allowed\" ], \"geolocation\": [ \"America\" ], \"network\": \"127.0.0.1\", \"network_type\": \"Local\", \"operating_system\": \"Linux\", \"user_agent\": \"Linux\", \"current_time\": 1 } } Cedarling requires OpenID Userinfo, Access, and ID tokens to construct the principal entity, as described here . As per AuthZen specification, these values are sent in the context field of the payload. Conversely, the subject field is currently not used by cedarling. These 3 tokens are subsequently removed from the context object before it is passed to cedarling. Upon creating the principal, action, resource, and context entities, cedarling will evaluate these entities against the policies defined in the policy store. Then it will return a true/false decision. If the decision is false, the sidecar will analyze cedarling diagnostics and provide additional information for the admin. Example of true case: { \"decision\": true } Example of false case: { \"context\": { \"reason_admin\": { \"person diagnostics\": [], \"person error\": [], \"person evaluation\": \"DENY\", \"workload diagnostics\": [], \"workload evaluation\": \"DENY\", \"workload_error\": [] } }, \"decision\": false } In this example both the person and workload evaluations were DENY , so the decision was false. Additional information is returned in the context field as per AuthZen specification.", "title": "Usage"}, {"location": "cedarling/python/usage/", "tags": ["cedarling", "python", "usage"], "text": "Python usage # In this example, we will show an example Python script that calls the cedarling_python module and calls the authorize() function. Before beginning, ensure that you have completed the building steps and are currently in a virtual Python environment that has the cedarling_python module installed. You can confirm this with pip list . Run the script jans/jans-cedarling/bindings/cedarling_python/example.py from within the virtual environment. Output # (venv) $ python example.py Policy store location not provided, use 'CEDARLING_LOCAL_POLICY_STORE' environment variable Used default policy store path: example_files/policy-store.json {\"id\":\"0193414e-9672-786a-986c-57f48d41c4e4\",\"time\":1731967489,\"log_type\":\"System\",\"pdp_id\":\"c0ec33ff-9482-4bdc-83f6-2925a41a3280\",\"msg\":\"configuration parsed successfully\"} {\"id\":\"0193414e-9672-786a-986c-57f5379086c3\",\"time\":1731967489,\"log_type\":\"System\",\"pdp_id\":\"c0ec33ff-9482-4bdc-83f6-2925a41a3280\",\"msg\":\"Cedarling Authz initialized successfully\",\"application_id\":\"TestApp\"} {\"id\":\"0193414e-9676-7d8a-b55b-3f0097355851\",\"time\":1731967489,\"log_type\":\"Decision\",\"pdp_id\":\"c0ec33ff-9482-4bdc-83f6-2925a41a3280\",\"msg\":\"Result of authorize.\",\"application_id\":\"TestApp\",\"action\":\"Jans::Action::\\\"Read\\\"\",\"resource\":\"Jans::Application::\\\"some_id\\\"\",\"context\":{\"user_agent\":\"Linux\",\"operating_system\":\"Linux\",\"network_type\":\"Local\",\"network\":\"127.0.0.1\",\"geolocation\":[\"America\"],\"fraud_indicators\":[\"Allowed\"],\"device_health\":[\"Healthy\"],\"current_time\":1731967489},\"person_principal\":\"Jans::User::\\\"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\\\"\",\"person_diagnostics\":{\"reason\":[\"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\"],\"errors\":[]},\"person_decision\":\"ALLOW\",\"workload_principal\":\"Jans::Workload::\\\"d7f71bea-c38d-4caf-a1ba-e43c74a11a62\\\"\",\"workload_diagnostics\":{\"reason\":[\"444da5d85403f35ea76519ed1a18a33989f855bf1cf8\"],\"errors\":[]},\"workload_decision\":\"ALLOW\",\"authorized\":true} Result of workload authorization: ALLOW Policy ID used: 444da5d85403f35ea76519ed1a18a33989f855bf1cf8 Errors during authorization: 0 Result of person authorization: ALLOW Policy ID used: 840da5d85403f35ea76519ed1a18a33989f855bf1cf8 Errors during authorization: 0 Explanation # Cedarling creates principal entities from the access, ID and userinfo tokens. The action, resource and context entities are declared in code. These four entities together form the PARC format that cedarling evaluates against policies provided in the policy store. The principal entities can be either User, Workload or Role. After forming the entities, cedarling evaluates them against the policies provided in the policy store. If entity is explicitly permitted by a policy, the result of the evaluation is ALLOW , otherwise it is DENY . In this case there are two policies in the store, one for User entities and one for Workload entities: @444da5d85403f35ea76519ed1a18a33989f855bf1cf8 permit( principal is Jans::Workload, action in [Jans::Action::\"Read\"], resource is Jans::Application )when{ resource.name == \"Some Application\" }; @840da5d85403f35ea76519ed1a18a33989f855bf1cf8 permit( principal is Jans::User, action in [Jans::Action::\"Read\"], resource is Jans::Application )when{ resource.name == \"Some Application\" }; These two policies say that a Principal entity (User or Workload) is allowed to execute a Read action on an Application resource when the resource is named \"Some Application\". As there are no policies for Role entities, the result of the evaluation for the Role entity is DENY . In the script, the action, resource and context entities are used to create the request and execute the authorize() call: action = 'Jans::Action::\"Read\"' resource = ResourceData . from_dict ({ \"type\" : \"Jans::Application\" , \"id\" : \"some_id\" , \"app_id\" : \"application_id\" , \"name\" : \"Some Application\" , \"url\" : { \"host\" : \"jans.test\" , \"path\" : \"/protected-endpoint\" , \"protocol\" : \"http\" } }) context = { \"current_time\" : int ( time . time ()), \"device_health\" : [ \"Healthy\" ], \"fraud_indicators\" : [ \"Allowed\" ], \"geolocation\" : [ \"America\" ], \"network\" : \"127.0.0.1\" , \"network_type\" : \"Local\" , \"operating_system\" : \"Linux\" , \"user_agent\" : \"Linux\" } request = Request ( access_token , id_token , userinfo_token , action = action , resource = resource , context = context ) authorize_result = instance . authorize ( request ) assert authorize_result . is_allowed () Cedarling will return is_allowed() as True only if both the User and Workload entity evaluations are ALLOW . Exposed functions # The pyo3 binding for cedarling exposes a number of cedarling functions for you to use. The documentation on this can be found here .", "title": "How to use"}, {"location": "cedarling/python/usage/#python-usage", "text": "In this example, we will show an example Python script that calls the cedarling_python module and calls the authorize() function. Before beginning, ensure that you have completed the building steps and are currently in a virtual Python environment that has the cedarling_python module installed. You can confirm this with pip list . Run the script jans/jans-cedarling/bindings/cedarling_python/example.py from within the virtual environment.", "title": "Python usage"}, {"location": "cedarling/python/usage/#output", "text": "(venv) $ python example.py Policy store location not provided, use 'CEDARLING_LOCAL_POLICY_STORE' environment variable Used default policy store path: example_files/policy-store.json {\"id\":\"0193414e-9672-786a-986c-57f48d41c4e4\",\"time\":1731967489,\"log_type\":\"System\",\"pdp_id\":\"c0ec33ff-9482-4bdc-83f6-2925a41a3280\",\"msg\":\"configuration parsed successfully\"} {\"id\":\"0193414e-9672-786a-986c-57f5379086c3\",\"time\":1731967489,\"log_type\":\"System\",\"pdp_id\":\"c0ec33ff-9482-4bdc-83f6-2925a41a3280\",\"msg\":\"Cedarling Authz initialized successfully\",\"application_id\":\"TestApp\"} {\"id\":\"0193414e-9676-7d8a-b55b-3f0097355851\",\"time\":1731967489,\"log_type\":\"Decision\",\"pdp_id\":\"c0ec33ff-9482-4bdc-83f6-2925a41a3280\",\"msg\":\"Result of authorize.\",\"application_id\":\"TestApp\",\"action\":\"Jans::Action::\\\"Read\\\"\",\"resource\":\"Jans::Application::\\\"some_id\\\"\",\"context\":{\"user_agent\":\"Linux\",\"operating_system\":\"Linux\",\"network_type\":\"Local\",\"network\":\"127.0.0.1\",\"geolocation\":[\"America\"],\"fraud_indicators\":[\"Allowed\"],\"device_health\":[\"Healthy\"],\"current_time\":1731967489},\"person_principal\":\"Jans::User::\\\"qzxn1Scrb9lWtGxVedMCky-Ql_ILspZaQA6fyuYktw0\\\"\",\"person_diagnostics\":{\"reason\":[\"840da5d85403f35ea76519ed1a18a33989f855bf1cf8\"],\"errors\":[]},\"person_decision\":\"ALLOW\",\"workload_principal\":\"Jans::Workload::\\\"d7f71bea-c38d-4caf-a1ba-e43c74a11a62\\\"\",\"workload_diagnostics\":{\"reason\":[\"444da5d85403f35ea76519ed1a18a33989f855bf1cf8\"],\"errors\":[]},\"workload_decision\":\"ALLOW\",\"authorized\":true} Result of workload authorization: ALLOW Policy ID used: 444da5d85403f35ea76519ed1a18a33989f855bf1cf8 Errors during authorization: 0 Result of person authorization: ALLOW Policy ID used: 840da5d85403f35ea76519ed1a18a33989f855bf1cf8 Errors during authorization: 0", "title": "Output"}, {"location": "cedarling/python/usage/#explanation", "text": "Cedarling creates principal entities from the access, ID and userinfo tokens. The action, resource and context entities are declared in code. These four entities together form the PARC format that cedarling evaluates against policies provided in the policy store. The principal entities can be either User, Workload or Role. After forming the entities, cedarling evaluates them against the policies provided in the policy store. If entity is explicitly permitted by a policy, the result of the evaluation is ALLOW , otherwise it is DENY . In this case there are two policies in the store, one for User entities and one for Workload entities: @444da5d85403f35ea76519ed1a18a33989f855bf1cf8 permit( principal is Jans::Workload, action in [Jans::Action::\"Read\"], resource is Jans::Application )when{ resource.name == \"Some Application\" }; @840da5d85403f35ea76519ed1a18a33989f855bf1cf8 permit( principal is Jans::User, action in [Jans::Action::\"Read\"], resource is Jans::Application )when{ resource.name == \"Some Application\" }; These two policies say that a Principal entity (User or Workload) is allowed to execute a Read action on an Application resource when the resource is named \"Some Application\". As there are no policies for Role entities, the result of the evaluation for the Role entity is DENY . In the script, the action, resource and context entities are used to create the request and execute the authorize() call: action = 'Jans::Action::\"Read\"' resource = ResourceData . from_dict ({ \"type\" : \"Jans::Application\" , \"id\" : \"some_id\" , \"app_id\" : \"application_id\" , \"name\" : \"Some Application\" , \"url\" : { \"host\" : \"jans.test\" , \"path\" : \"/protected-endpoint\" , \"protocol\" : \"http\" } }) context = { \"current_time\" : int ( time . time ()), \"device_health\" : [ \"Healthy\" ], \"fraud_indicators\" : [ \"Allowed\" ], \"geolocation\" : [ \"America\" ], \"network\" : \"127.0.0.1\" , \"network_type\" : \"Local\" , \"operating_system\" : \"Linux\" , \"user_agent\" : \"Linux\" } request = Request ( access_token , id_token , userinfo_token , action = action , resource = resource , context = context ) authorize_result = instance . authorize ( request ) assert authorize_result . is_allowed () Cedarling will return is_allowed() as True only if both the User and Workload entity evaluations are ALLOW .", "title": "Explanation"}, {"location": "cedarling/python/usage/#exposed-functions", "text": "The pyo3 binding for cedarling exposes a number of cedarling functions for you to use. The documentation on this can be found here .", "title": "Exposed functions"}, {"location": "contribute/developer-faq/", "tags": ["developer", "faq"], "text": "Developer FAQs # How to enable debug logs for jans-cli and TUI configuration tools # By default, logging is not enabled for CLI or TUI tools on Janssen Server. Follow the steps below to enable and configure logging for CLI and TUI tools: Log in as root user open config file for editing ~/.config/jans-cli.ini Update value for debug to true and add new entry for log_dir key with value pointing to directory where logs need to be generated. e.g debug = true log_dir = /opt/jans Close currently open TUI session if any and open a new one Logs should get available at location configured in log_dir in files cli_debug.log and dev-tui.log How to get certificate from Let's encrypt # Let's Encrypt is a CA that provides free CA certificates. You can use these certificates to enable HTTPS communication with Janssen Server. Refer to this guide from Let's Encrypt to know more. We have compiled a set of commands for different OS platforms to help you as a quick reference to generate Let's Encrypt CA certificates. Suse # sudo zypper -n install certbot sudo certbot certonly --webroot -w /srv/www/htdocs -d FQDN Ubuntu # sudo apt update && sudo apt install certbot python3-certbot-apache sudo certbot --apache -d FQDN To check certbot status sudo systemctl status certbot.timer To renew certificate run sudo certbot renew --dry-run RHEL # sudo yum install certbot python3-certbot-apache sudo certbot certonly --apache How to install Janssen Server OpenBanking for testing? # Note Use this installation for testing only Good understanding of Janssen Server installation process in general is a prerequisite. Here we are just highlighting steps without a lot of details. Visit installation documentation for complete understanding. This installation uses Gluu Testing certificate. Download Installer # wget https://raw.githubusercontent.com/JanssenProject/jans/nightly/jans-linux-setup/jans_setup/install.py -O install.py Execute Installer # python3 install.py --profile=openbanking --args=\"-ob-key-fn=/opt/jans/jans-setup/openbanking/static/ob-gluu-test.key -static-kid=ob-gluu-test -jwks-uri=https://ox.gluu.org/icrby8xcvbcv/ob/ob-gluu-test.jwks --disable-ob-auth-script -ob-alias=ob-gluu-test\" Please enter defaults for the following questions (press just enter key), it will download certificate from jwksUri Use external key? [Y|n] : y Openbanking Key File [/opt/jans/jans-setup/openbanking/static/ob-gluu-test.key] : Openbanking Certificate File [/root/obsigning.pem] : Openbanking Key Alias [ob-gluu-test] : Configure Certificate # jans cli -CC /opt/jans/jans-setup/output/CA/client.crt -CK /opt/jans/jans-setup/output/CA/client.key Test # This test uses Gluu Testing certificate. device authentication # After installation we have to complete device authentication to use openbanking. Testing using IM mode # launch jans-cli using below command jans cli -CC /opt/jans/jans-setup/output/CA/client.crt -CK /opt/jans/jans-setup/output/CA/client.key further testing is same as jans server Testing using command line mode # we can run below command at command line. for ex: jans cli -CC /opt/jans/jans-setup/output/CA/client.crt -CK /opt/jans/jans-setup/output/CA/client.key \u2013operation-id get-oauth-openid-clients same way we can run other commands. rest is same for jans and openbanking", "title": "Developer FAQ"}, {"location": "contribute/developer-faq/#developer-faqs", "text": "", "title": "Developer FAQs"}, {"location": "contribute/developer-faq/#how-to-enable-debug-logs-for-jans-cli-and-tui-configuration-tools", "text": "By default, logging is not enabled for CLI or TUI tools on Janssen Server. Follow the steps below to enable and configure logging for CLI and TUI tools: Log in as root user open config file for editing ~/.config/jans-cli.ini Update value for debug to true and add new entry for log_dir key with value pointing to directory where logs need to be generated. e.g debug = true log_dir = /opt/jans Close currently open TUI session if any and open a new one Logs should get available at location configured in log_dir in files cli_debug.log and dev-tui.log", "title": "How to enable debug logs for jans-cli and TUI configuration tools"}, {"location": "contribute/developer-faq/#how-to-get-certificate-from-lets-encrypt", "text": "Let's Encrypt is a CA that provides free CA certificates. You can use these certificates to enable HTTPS communication with Janssen Server. Refer to this guide from Let's Encrypt to know more. We have compiled a set of commands for different OS platforms to help you as a quick reference to generate Let's Encrypt CA certificates.", "title": "How to get certificate from Let's encrypt"}, {"location": "contribute/developer-faq/#suse", "text": "sudo zypper -n install certbot sudo certbot certonly --webroot -w /srv/www/htdocs -d FQDN", "title": "Suse"}, {"location": "contribute/developer-faq/#ubuntu", "text": "sudo apt update && sudo apt install certbot python3-certbot-apache sudo certbot --apache -d FQDN To check certbot status sudo systemctl status certbot.timer To renew certificate run sudo certbot renew --dry-run", "title": "Ubuntu"}, {"location": "contribute/developer-faq/#rhel", "text": "sudo yum install certbot python3-certbot-apache sudo certbot certonly --apache", "title": "RHEL"}, {"location": "contribute/developer-faq/#how-to-install-janssen-server-openbanking-for-testing", "text": "Note Use this installation for testing only Good understanding of Janssen Server installation process in general is a prerequisite. Here we are just highlighting steps without a lot of details. Visit installation documentation for complete understanding. This installation uses Gluu Testing certificate.", "title": "How to install Janssen Server OpenBanking for testing?"}, {"location": "contribute/developer-faq/#download-installer", "text": "wget https://raw.githubusercontent.com/JanssenProject/jans/nightly/jans-linux-setup/jans_setup/install.py -O install.py", "title": "Download Installer"}, {"location": "contribute/developer-faq/#execute-installer", "text": "python3 install.py --profile=openbanking --args=\"-ob-key-fn=/opt/jans/jans-setup/openbanking/static/ob-gluu-test.key -static-kid=ob-gluu-test -jwks-uri=https://ox.gluu.org/icrby8xcvbcv/ob/ob-gluu-test.jwks --disable-ob-auth-script -ob-alias=ob-gluu-test\" Please enter defaults for the following questions (press just enter key), it will download certificate from jwksUri Use external key? [Y|n] : y Openbanking Key File [/opt/jans/jans-setup/openbanking/static/ob-gluu-test.key] : Openbanking Certificate File [/root/obsigning.pem] : Openbanking Key Alias [ob-gluu-test] :", "title": "Execute Installer"}, {"location": "contribute/developer-faq/#configure-certificate", "text": "jans cli -CC /opt/jans/jans-setup/output/CA/client.crt -CK /opt/jans/jans-setup/output/CA/client.key", "title": "Configure Certificate"}, {"location": "contribute/developer-faq/#test", "text": "This test uses Gluu Testing certificate.", "title": "Test"}, {"location": "contribute/developer-faq/#device-authentication", "text": "After installation we have to complete device authentication to use openbanking.", "title": "device authentication"}, {"location": "contribute/developer-faq/#testing-using-im-mode", "text": "launch jans-cli using below command jans cli -CC /opt/jans/jans-setup/output/CA/client.crt -CK /opt/jans/jans-setup/output/CA/client.key further testing is same as jans server", "title": "Testing using IM mode"}, {"location": "contribute/developer-faq/#testing-using-command-line-mode", "text": "we can run below command at command line. for ex: jans cli -CC /opt/jans/jans-setup/output/CA/client.crt -CK /opt/jans/jans-setup/output/CA/client.key \u2013operation-id get-oauth-openid-clients same way we can run other commands. rest is same for jans and openbanking", "title": "Testing using command line mode"}, {"location": "contribute/development/", "text": "Developing for Janssen Project # Remote Debugging # Janssen Server modules run as Java processes. Hence, like any other Java process the JVM running the module can be configured to open a debug port where a remote debugger can be attached. The steps below will show how to configure auth-server module for remote debugging. Pass the command-line options to the JVM On the Janssen Server host, open the service config file /etc/default/jans-auth and add the following JVM parameters to as JAVA_OPTIONS -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6001 This will open the port 6001 for the remote debugger. Any other port can also be used based on availability. Restart jans-auth services systemctl restart jans-auth.service Check if the port is open and accessible from within the Janssen Server host Use the jdb tool from JDK to test if the JVM port has been opened .//bin/jdb -attach 6001 if the port is open, it'll give you output like the below: Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable Initializing jdb ... > press ctrl+c to come out of it. Ensure that the port is accessible from outside the host VM as well and firewalls are configured accordingly Connect to the remote port on the Janssen Server host from the developer workstation. Use any IDE (Intellij, Eclipse, etc.) to create and run a remote debugging profile. Provide IP and debug port of the Janssen Server host. For IntelliJIdea, create a debug configuration as below: Run Integration Tests with a Janssen Server VM # In this guide, we will look at steps to run the Janssen integration test suite against an installed Janssen Server. Component Setup # Instructions in this guide can be used if Janssen Server is installed on a VM. Developers can use a virtualization software (like VMWare) or use LxD containers to create VM on developer workstation or use a remote cloud VM. OS platform for Developer Workstation Steps in this guide are applicable to any OS platform a Developer workstation may have. Example commands given in this guide are for Ubuntu Linux based workstation. Install Janssen Server # Install the Janssen server using one of the methods described in the VM installation guide. Note the points below when following installation instructions. Make a note of the host name that you assign to the Janssen server during the installation. For this guide, the Janssen hostname would be janssen.op.io Choose to install with test data load. This can be achieved by using the -t switch when invoking the setup script from installation instructions. Use the VM installation guide for the complete set of instructions. Once the installation is complete, check if the .well-known end-points of the Janssen server from the browser. A successful response will ascertain that the The Janssen server running inside the local VM is healthy and also accessible from the developer's machine. Note Based on developer setup it may be necessary to add appropriate IP-HOST mapping to the developer workstation. For instance, on a Linux-based developer workstation, this means adding a mapping to /etc/hosts file. Make sure that VM's IP is mapped to a FQDN like janssen.op.io . Refering to VM with localhost or just IP will not work. URI for OpenID configuration .well-known endpoint: https://janssen.op.io/jans-auth/.well-known/openid-configuration The response received should be JSON formatted Janssen configuration details, similar to those below. { \"request_parameter_supported\" : true, \"pushed_authorization_request_endpoint\" : \"https://janssen.op.io/jans-auth/restv1/par\", \"introspection_endpoint\" : \"https://janssen.op.io/jans-auth/restv1/introspection\", \"claims_parameter_supported\" : false, \"issuer\" : \"https://janssen.op.io\", \"userinfo_encryption_enc_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"id_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"authorization_endpoint\" : \"https://janssen.op.io/jans-auth/restv1/authorize\", \"service_documentation\" : \"http://jans.org/docs\", \"authorization_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"id_generation_endpoint\" : \"https://janssen.op.io/jans-auth/restv1/id\", \"claims_supported\" : [ \"street_address\", \"country\", \"zoneinfo\", \"birthdate\", \"role\", \"gender\", \"user_name\", \"formatted\", \"phone_mobile_number\", \"preferred_username\", \"inum\", \"locale\", \"updated_at\", \"post_office_box\", \"nickname\", \"preferred_language\", \"email\", \"website\", \"email_verified\", \"profile\", \"locality\", \"room_number\", \"phone_number_verified\", \"given_name\", \"middle_name\", \"picture\", \"name\", \"phone_number\", \"postal_code\", \"region\", \"family_name\", \"jansAdminUIRole\" ], \"scope_to_claims_mapping\" : [ { \"user_name\" : [ \"user_name\" ] }, { \"https://jans.io/scim/users.write\" : [ ] }, { \"https://jans.io/scim/groups.read\" : [ ] }, { \"https://jans.io/scim/all-resources.search\" : [ ] }, { \"https://jans.io/scim/fido.write\" : [ ] }, { \"https://jans.io/scim/groups.write\" : [ ] }, { \"https://jans.io/scim/fido2.read\" : [ ] }, { \"https://jans.io/scim/fido.read\" : [ ] }, { \"https://jans.io/scim/fido2.write\" : [ ] Setup The Certificates # To run the tests against the installed Janssen Server, the workstation JRE needs to have the appropriate certificate installed. Update cacerts using the steps below: extract certificate for Janssen server with name janssen.op.io On Developer Workstation openssl s_client -connect test.local.jans.io:443 2 > & 1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/httpd.crt this command takes a few seconds to return. Update cacerts of your JRE which is being used by the code workspace. For example, /usr/lib/jvm/java-11-amazon-corretto . When running the command below, it will prompt for cert store password. Provide the correct password. The default password is changeit . keytool -import -alias janssen.op.io -keystore /usr/lib/jvm/java-11-amazon-corretto/lib/security/cacerts -file /tmp/httpd.crt Configure developer workspace # Now that we have Janssen Server running in a VM and it is accessible from the developer workstation as well, we will create and configure the code base on the developer workspace to run integration tests. Get Janssen server code from Janssen GitHub repository . Note the path to this location, we will refer to it as source-base . Janssen Server is composed of multiple modules. For example source-base/jans-auth-server , source-base/jans-link etc. Each module has its own set of tests. Below are the instructions for configuring each module for tests. What is a Profile directory? To run integration tests, the developer workspace needs to know details about he Janssen Server agaist which the tests are to be run. Janssen Server workspace holds this information in source-base/module/sub-module/profiles directory. The profiles directory can contain one or more sub-directories, each representing a profile(i.e a target Janssen Server). These profile directories are used to hold files that contain important information required to run tests. Developers can create one or more profiles and use them to run tests against different Janssen Servers. This guide uses Janssen Server hostname, janssen.op.io , as profile name. Configuring the jans-auth-server module # Configuring jans-auth-server module involves setting up profiles for client , server and agama sub-modules. Follow the steps below to configure the profile for the client and server sub-modules. Move to the module directory cd source-base/jans-auth-server As a precautionary measure, let's first remove any old profile artifacts from the jans-auth-server workspace. rm -rf ./jans-auth rm -rf ./client/profiles/janssen.op.io rm -rf ./server/profiles/janssen.op.io rm -rf ./agama/engine/profiles/janssen.op.io Since Janssen Server has been installed with test data, the installer also created the profile files required to run the test. These files are kept on the VM under /opt/jans/jans-setup/output/test/jans-auth directory. Copy over jans-auth directory from Janssen Server VM to source-base/jans-auth-server on developer workstation. Create new profile directories. mkdir -p ./client/profiles/janssen.op.io mkdir -p ./server/profiles/janssen.op.io mkdir -p ./agama/engine/profiles/janssen.op.io Copy the contents of jans-auth directory into the respective sub-module's janssen.op.io profile directory cp ./jans-auth/client/* ./client/profiles/janssen.op.io cp ./jans-auth/server/* ./server/profiles/janssen.op.io cp ./jans-auth/config-agama-test.properties ./agama/engine/profiles/janssen.op.io/config-agama-test.properties Copy keystore file profiles/default/client_keystore.p12 from default profile directory to the janssen.op.io profile directory cp -f ./client/profiles/default/client_keystore.p12 ./client/profiles/janssen.op.io cp -f ./server/profiles/default/client_keystore.p12 ./server/profiles/janssen.op.io Running The Tests # Each module in Janssen Server has its tests that have to be executed separately. For example, to run integration tests for jans-auth-server module, run the following maven command at the directory level: mvn -Dcfg=janssen.op.io test Configuring the jans-core module # This module does not require a profile setup. It can be built with below maven command. mvn clean compile install Configuring the jans-link module # This module does not require a profile setup. It can be built with the below maven command. mvn clean compile install Configuring the jans-orm module # This module does not require a profile setup. It can be built with the below maven command. mvn clean compile install Configuring the agama module # This module does not require a profile setup. It can be built with the below maven command. mvn clean compile install Configuring the SCIM module # This module does not require a profile setup. It can be built with the below maven command. Profile setup for client and server modules # Many Janssen Server modules and sub-modules use test configuration stored in a directory named profile . The profile directory contains files that hold important information required to run tests. Developers can create one or more profiles and use them to run tests against different Janssen Servers. Since Janssen Server has been installed with test data, the installer also created the profile files required to run the test. For SCIM/client module, these files are kept on the VM under /opt/jans/jans-setup/output/test/scim-client directory. Copy over this directory to any location on the developer workstation. Follow the steps below to configure the profile for the client module. The same steps should be followed for setting up a profile for the server module. Under jans-scim/client/profiles directory, create a new directory and name it janssen.op.io Copy the contents of scim-client/client directory into the newly created janssen.op.io directory Post this, remove the scim-client directory. Now as the profile is setup, to build the jans-scim module and run tests, use the command below: mvn -Dcfg=janssen.op.io test Setup Janssen Schema with Test data # Useful Tools # While working with Janssen Server, either as developer or administrator, following tools can come in handy. jsonbin.io jwt.io oidcdebugger.com keytool.online", "title": "Development"}, {"location": "contribute/development/#developing-for-janssen-project", "text": "", "title": "Developing for Janssen Project"}, {"location": "contribute/development/#remote-debugging", "text": "Janssen Server modules run as Java processes. Hence, like any other Java process the JVM running the module can be configured to open a debug port where a remote debugger can be attached. The steps below will show how to configure auth-server module for remote debugging. Pass the command-line options to the JVM On the Janssen Server host, open the service config file /etc/default/jans-auth and add the following JVM parameters to as JAVA_OPTIONS -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6001 This will open the port 6001 for the remote debugger. Any other port can also be used based on availability. Restart jans-auth services systemctl restart jans-auth.service Check if the port is open and accessible from within the Janssen Server host Use the jdb tool from JDK to test if the JVM port has been opened .//bin/jdb -attach 6001 if the port is open, it'll give you output like the below: Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable Initializing jdb ... > press ctrl+c to come out of it. Ensure that the port is accessible from outside the host VM as well and firewalls are configured accordingly Connect to the remote port on the Janssen Server host from the developer workstation. Use any IDE (Intellij, Eclipse, etc.) to create and run a remote debugging profile. Provide IP and debug port of the Janssen Server host. For IntelliJIdea, create a debug configuration as below:", "title": "Remote Debugging"}, {"location": "contribute/development/#run-integration-tests-with-a-janssen-server-vm", "text": "In this guide, we will look at steps to run the Janssen integration test suite against an installed Janssen Server.", "title": "Run Integration Tests with a Janssen Server VM"}, {"location": "contribute/development/#component-setup", "text": "Instructions in this guide can be used if Janssen Server is installed on a VM. Developers can use a virtualization software (like VMWare) or use LxD containers to create VM on developer workstation or use a remote cloud VM. OS platform for Developer Workstation Steps in this guide are applicable to any OS platform a Developer workstation may have. Example commands given in this guide are for Ubuntu Linux based workstation.", "title": "Component Setup"}, {"location": "contribute/development/#install-janssen-server", "text": "Install the Janssen server using one of the methods described in the VM installation guide. Note the points below when following installation instructions. Make a note of the host name that you assign to the Janssen server during the installation. For this guide, the Janssen hostname would be janssen.op.io Choose to install with test data load. This can be achieved by using the -t switch when invoking the setup script from installation instructions. Use the VM installation guide for the complete set of instructions. Once the installation is complete, check if the .well-known end-points of the Janssen server from the browser. A successful response will ascertain that the The Janssen server running inside the local VM is healthy and also accessible from the developer's machine. Note Based on developer setup it may be necessary to add appropriate IP-HOST mapping to the developer workstation. For instance, on a Linux-based developer workstation, this means adding a mapping to /etc/hosts file. Make sure that VM's IP is mapped to a FQDN like janssen.op.io . Refering to VM with localhost or just IP will not work. URI for OpenID configuration .well-known endpoint: https://janssen.op.io/jans-auth/.well-known/openid-configuration The response received should be JSON formatted Janssen configuration details, similar to those below. { \"request_parameter_supported\" : true, \"pushed_authorization_request_endpoint\" : \"https://janssen.op.io/jans-auth/restv1/par\", \"introspection_endpoint\" : \"https://janssen.op.io/jans-auth/restv1/introspection\", \"claims_parameter_supported\" : false, \"issuer\" : \"https://janssen.op.io\", \"userinfo_encryption_enc_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"id_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"authorization_endpoint\" : \"https://janssen.op.io/jans-auth/restv1/authorize\", \"service_documentation\" : \"http://jans.org/docs\", \"authorization_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"id_generation_endpoint\" : \"https://janssen.op.io/jans-auth/restv1/id\", \"claims_supported\" : [ \"street_address\", \"country\", \"zoneinfo\", \"birthdate\", \"role\", \"gender\", \"user_name\", \"formatted\", \"phone_mobile_number\", \"preferred_username\", \"inum\", \"locale\", \"updated_at\", \"post_office_box\", \"nickname\", \"preferred_language\", \"email\", \"website\", \"email_verified\", \"profile\", \"locality\", \"room_number\", \"phone_number_verified\", \"given_name\", \"middle_name\", \"picture\", \"name\", \"phone_number\", \"postal_code\", \"region\", \"family_name\", \"jansAdminUIRole\" ], \"scope_to_claims_mapping\" : [ { \"user_name\" : [ \"user_name\" ] }, { \"https://jans.io/scim/users.write\" : [ ] }, { \"https://jans.io/scim/groups.read\" : [ ] }, { \"https://jans.io/scim/all-resources.search\" : [ ] }, { \"https://jans.io/scim/fido.write\" : [ ] }, { \"https://jans.io/scim/groups.write\" : [ ] }, { \"https://jans.io/scim/fido2.read\" : [ ] }, { \"https://jans.io/scim/fido.read\" : [ ] }, { \"https://jans.io/scim/fido2.write\" : [ ]", "title": "Install Janssen Server"}, {"location": "contribute/development/#setup-the-certificates", "text": "To run the tests against the installed Janssen Server, the workstation JRE needs to have the appropriate certificate installed. Update cacerts using the steps below: extract certificate for Janssen server with name janssen.op.io On Developer Workstation openssl s_client -connect test.local.jans.io:443 2 > & 1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/httpd.crt this command takes a few seconds to return. Update cacerts of your JRE which is being used by the code workspace. For example, /usr/lib/jvm/java-11-amazon-corretto . When running the command below, it will prompt for cert store password. Provide the correct password. The default password is changeit . keytool -import -alias janssen.op.io -keystore /usr/lib/jvm/java-11-amazon-corretto/lib/security/cacerts -file /tmp/httpd.crt", "title": "Setup The Certificates"}, {"location": "contribute/development/#configure-developer-workspace", "text": "Now that we have Janssen Server running in a VM and it is accessible from the developer workstation as well, we will create and configure the code base on the developer workspace to run integration tests. Get Janssen server code from Janssen GitHub repository . Note the path to this location, we will refer to it as source-base . Janssen Server is composed of multiple modules. For example source-base/jans-auth-server , source-base/jans-link etc. Each module has its own set of tests. Below are the instructions for configuring each module for tests. What is a Profile directory? To run integration tests, the developer workspace needs to know details about he Janssen Server agaist which the tests are to be run. Janssen Server workspace holds this information in source-base/module/sub-module/profiles directory. The profiles directory can contain one or more sub-directories, each representing a profile(i.e a target Janssen Server). These profile directories are used to hold files that contain important information required to run tests. Developers can create one or more profiles and use them to run tests against different Janssen Servers. This guide uses Janssen Server hostname, janssen.op.io , as profile name.", "title": "Configure developer workspace"}, {"location": "contribute/development/#configuring-the-jans-auth-server-module", "text": "Configuring jans-auth-server module involves setting up profiles for client , server and agama sub-modules. Follow the steps below to configure the profile for the client and server sub-modules. Move to the module directory cd source-base/jans-auth-server As a precautionary measure, let's first remove any old profile artifacts from the jans-auth-server workspace. rm -rf ./jans-auth rm -rf ./client/profiles/janssen.op.io rm -rf ./server/profiles/janssen.op.io rm -rf ./agama/engine/profiles/janssen.op.io Since Janssen Server has been installed with test data, the installer also created the profile files required to run the test. These files are kept on the VM under /opt/jans/jans-setup/output/test/jans-auth directory. Copy over jans-auth directory from Janssen Server VM to source-base/jans-auth-server on developer workstation. Create new profile directories. mkdir -p ./client/profiles/janssen.op.io mkdir -p ./server/profiles/janssen.op.io mkdir -p ./agama/engine/profiles/janssen.op.io Copy the contents of jans-auth directory into the respective sub-module's janssen.op.io profile directory cp ./jans-auth/client/* ./client/profiles/janssen.op.io cp ./jans-auth/server/* ./server/profiles/janssen.op.io cp ./jans-auth/config-agama-test.properties ./agama/engine/profiles/janssen.op.io/config-agama-test.properties Copy keystore file profiles/default/client_keystore.p12 from default profile directory to the janssen.op.io profile directory cp -f ./client/profiles/default/client_keystore.p12 ./client/profiles/janssen.op.io cp -f ./server/profiles/default/client_keystore.p12 ./server/profiles/janssen.op.io", "title": "Configuring the jans-auth-server module"}, {"location": "contribute/development/#running-the-tests", "text": "Each module in Janssen Server has its tests that have to be executed separately. For example, to run integration tests for jans-auth-server module, run the following maven command at the directory level: mvn -Dcfg=janssen.op.io test", "title": "Running The Tests"}, {"location": "contribute/development/#configuring-the-jans-core-module", "text": "This module does not require a profile setup. It can be built with below maven command. mvn clean compile install", "title": "Configuring the jans-core module"}, {"location": "contribute/development/#configuring-the-jans-link-module", "text": "This module does not require a profile setup. It can be built with the below maven command. mvn clean compile install", "title": "Configuring the jans-link module"}, {"location": "contribute/development/#configuring-the-jans-orm-module", "text": "This module does not require a profile setup. It can be built with the below maven command. mvn clean compile install", "title": "Configuring the jans-orm module"}, {"location": "contribute/development/#configuring-the-agama-module", "text": "This module does not require a profile setup. It can be built with the below maven command. mvn clean compile install", "title": "Configuring the agama module"}, {"location": "contribute/development/#configuring-the-scim-module", "text": "This module does not require a profile setup. It can be built with the below maven command.", "title": "Configuring the SCIM module"}, {"location": "contribute/development/#profile-setup-for-client-and-server-modules", "text": "Many Janssen Server modules and sub-modules use test configuration stored in a directory named profile . The profile directory contains files that hold important information required to run tests. Developers can create one or more profiles and use them to run tests against different Janssen Servers. Since Janssen Server has been installed with test data, the installer also created the profile files required to run the test. For SCIM/client module, these files are kept on the VM under /opt/jans/jans-setup/output/test/scim-client directory. Copy over this directory to any location on the developer workstation. Follow the steps below to configure the profile for the client module. The same steps should be followed for setting up a profile for the server module. Under jans-scim/client/profiles directory, create a new directory and name it janssen.op.io Copy the contents of scim-client/client directory into the newly created janssen.op.io directory Post this, remove the scim-client directory. Now as the profile is setup, to build the jans-scim module and run tests, use the command below: mvn -Dcfg=janssen.op.io test", "title": "Profile setup for client and server modules"}, {"location": "contribute/development/#setup-janssen-schema-with-test-data", "text": "", "title": "Setup Janssen Schema with Test data"}, {"location": "contribute/development/#useful-tools", "text": "While working with Janssen Server, either as developer or administrator, following tools can come in handy. jsonbin.io jwt.io oidcdebugger.com keytool.online", "title": "Useful Tools"}, {"location": "contribute/testing/", "tags": ["administration", "contribute", "Testing", "Quality Assurance"], "text": "Test And Quality Assurance For Janssen Project # The Janssen Project is a large, complex project with tons of inter-dependency. If we aren't test-driven, anarchy will ensue. Every line of code at Janssen Project goes through various tests at different stages of development. Most of these tests are automated and executed as part of our CI-CD pipeline, while others are executed manually. Unit testing # Do not submit any code without a corresponding unit test. Also, any bug fixes should increment unit test coverage. All unit tests are executed with any subsequent Jenkins build. Component testing # Component testing uses real world use cases to exercise a portion of the software, using typical data inputs. Developers should document component stories and submit them to the component test library for the respective repository. A tester should be able to run component tests manually. Component tests should run automatically with each Jenkins build. The OpenID Foundation certification tests supplement the component testing library, and should be run for each major release of the software for which they are available. Performance testing # Performance tests are critical to optimization of the persistence and caching implementation. All major releases of the software should be tested for performance with all supported database and cache configurations using the Cloud Native distribution. The VM distribution will not be performance tested, as the main goal for this distribution is development and small deployments. The JMeter test tool should be used to generate the load. These tests are published so community members can run their own bench-marking analysis. HA Tests # HA tests should be run against the Cloud Native distribution, which by design is active-active with no single point of failure. The HA testing should simulate taking down various pieces of infrastructure, to see if authentications can still proceed. Also, what happens to transactions that were in progress during the crash? Penetration tests # Penetration testing is highly deployment specific. Depending on different implementations of the Janssen Project software, you may achieve different levels of risk mitigation. Thus it is important that organizations that operate their own IAM platform based on Janssen perform their own penetration testing. Dependency Vulnerabilities # Dependency vulnerabilities are monitored by Gihub. In addition we plan to use the Linux Foundation Community Bridge vulnerability detection platform. Testing Documentation Changes Locally # While contributing documentation to official Janssen Project documentation it is important to make sure that documents meet style guidelines and have been proofread to remove any typographical or grammatical errors. Janssen Project uses Material for MkDocs to create the documenation site. Before new content is pushed to the repository on GitHub, it should be tested locally by the author. Author can do this by deploying Material for MkDocs locally. High-level steps involve: Install Material for MkDocs Install required plugins Preview as you write Open Banking # We are working on developing this content under issue 2548 . If you\u2019d like to contribute the content, get started with the Contribution Guide How to test OpenBanking? # This test uses a Gluu Testing Certificate. device authentication # After installation, we have to complete device authentication to use OpenBanking. Testing using commnd line mode # We can run the below command on the command line. For example: jans cli -CC /opt/jans/jans-setup/output/CA/client.crt -CK /opt/jans/jans-setup/output/CA/client.key \u2013operation-id get-oauth-openid-clients in the same way we can run other commands. Rest of the testing is same for jans and openbanking. Release Quality Assurance # Once all the code changes for a particular release have been committed, we perform a set of tests and go through a list of checkpoints to make sure release candidate (RC) build is healthy and functioning well. Pre-release QA checklist # As part of pre-release QA check, we run a set of manual sanity checks on test environments with various deployment configurations. Test Environments # # OS Platform Persistance Type Deployment Type (VM/CN) Test 2 SUSE 15 Mysql VM installation and sanity testing 3 SUSE 15 Pgsql VM installation and sanity testing 5 RHEL 8 Mysql VM installation and sanity testing 6 RHEL 8 Pgsql VM installation and sanity testing 8 Ubuntu20 Mysql VM installation and sanity testing 9 Ubuntu20 Pgsql VM installation and sanity testing 11 Ubuntu22 Mysql VM installation and sanity testing 12 Ubuntu22 Pgsql VM installation and sanity testing Sanity checks # Review functioning of .well-known endpoints for OpenId, Fido, UMA, SCIM modules Test device authentication flow using TUI Test password authentication flow using Janssen Server Tent Test Agama project deployment and functioning Post-release QA checklist # # QA Checks 1 Package installation verification on all OS Platforms as in pre-release tests", "title": "Testing"}, {"location": "contribute/testing/#test-and-quality-assurance-for-janssen-project", "text": "The Janssen Project is a large, complex project with tons of inter-dependency. If we aren't test-driven, anarchy will ensue. Every line of code at Janssen Project goes through various tests at different stages of development. Most of these tests are automated and executed as part of our CI-CD pipeline, while others are executed manually.", "title": "Test And Quality Assurance For Janssen Project"}, {"location": "contribute/testing/#unit-testing", "text": "Do not submit any code without a corresponding unit test. Also, any bug fixes should increment unit test coverage. All unit tests are executed with any subsequent Jenkins build.", "title": "Unit testing"}, {"location": "contribute/testing/#component-testing", "text": "Component testing uses real world use cases to exercise a portion of the software, using typical data inputs. Developers should document component stories and submit them to the component test library for the respective repository. A tester should be able to run component tests manually. Component tests should run automatically with each Jenkins build. The OpenID Foundation certification tests supplement the component testing library, and should be run for each major release of the software for which they are available.", "title": "Component testing"}, {"location": "contribute/testing/#performance-testing", "text": "Performance tests are critical to optimization of the persistence and caching implementation. All major releases of the software should be tested for performance with all supported database and cache configurations using the Cloud Native distribution. The VM distribution will not be performance tested, as the main goal for this distribution is development and small deployments. The JMeter test tool should be used to generate the load. These tests are published so community members can run their own bench-marking analysis.", "title": "Performance testing"}, {"location": "contribute/testing/#ha-tests", "text": "HA tests should be run against the Cloud Native distribution, which by design is active-active with no single point of failure. The HA testing should simulate taking down various pieces of infrastructure, to see if authentications can still proceed. Also, what happens to transactions that were in progress during the crash?", "title": "HA Tests"}, {"location": "contribute/testing/#penetration-tests", "text": "Penetration testing is highly deployment specific. Depending on different implementations of the Janssen Project software, you may achieve different levels of risk mitigation. Thus it is important that organizations that operate their own IAM platform based on Janssen perform their own penetration testing.", "title": "Penetration tests"}, {"location": "contribute/testing/#dependency-vulnerabilities", "text": "Dependency vulnerabilities are monitored by Gihub. In addition we plan to use the Linux Foundation Community Bridge vulnerability detection platform.", "title": "Dependency Vulnerabilities"}, {"location": "contribute/testing/#testing-documentation-changes-locally", "text": "While contributing documentation to official Janssen Project documentation it is important to make sure that documents meet style guidelines and have been proofread to remove any typographical or grammatical errors. Janssen Project uses Material for MkDocs to create the documenation site. Before new content is pushed to the repository on GitHub, it should be tested locally by the author. Author can do this by deploying Material for MkDocs locally. High-level steps involve: Install Material for MkDocs Install required plugins Preview as you write", "title": "Testing Documentation Changes Locally"}, {"location": "contribute/testing/#open-banking", "text": "We are working on developing this content under issue 2548 . If you\u2019d like to contribute the content, get started with the Contribution Guide", "title": "Open Banking"}, {"location": "contribute/testing/#how-to-test-openbanking", "text": "This test uses a Gluu Testing Certificate.", "title": "How to test OpenBanking?"}, {"location": "contribute/testing/#device-authentication", "text": "After installation, we have to complete device authentication to use OpenBanking.", "title": "device authentication"}, {"location": "contribute/testing/#testing-using-commnd-line-mode", "text": "We can run the below command on the command line. For example: jans cli -CC /opt/jans/jans-setup/output/CA/client.crt -CK /opt/jans/jans-setup/output/CA/client.key \u2013operation-id get-oauth-openid-clients in the same way we can run other commands. Rest of the testing is same for jans and openbanking.", "title": "Testing using commnd line mode"}, {"location": "contribute/testing/#release-quality-assurance", "text": "Once all the code changes for a particular release have been committed, we perform a set of tests and go through a list of checkpoints to make sure release candidate (RC) build is healthy and functioning well.", "title": "Release Quality Assurance"}, {"location": "contribute/testing/#pre-release-qa-checklist", "text": "As part of pre-release QA check, we run a set of manual sanity checks on test environments with various deployment configurations.", "title": "Pre-release QA checklist"}, {"location": "contribute/testing/#test-environments", "text": "# OS Platform Persistance Type Deployment Type (VM/CN) Test 2 SUSE 15 Mysql VM installation and sanity testing 3 SUSE 15 Pgsql VM installation and sanity testing 5 RHEL 8 Mysql VM installation and sanity testing 6 RHEL 8 Pgsql VM installation and sanity testing 8 Ubuntu20 Mysql VM installation and sanity testing 9 Ubuntu20 Pgsql VM installation and sanity testing 11 Ubuntu22 Mysql VM installation and sanity testing 12 Ubuntu22 Pgsql VM installation and sanity testing", "title": "Test Environments"}, {"location": "contribute/testing/#sanity-checks", "text": "Review functioning of .well-known endpoints for OpenId, Fido, UMA, SCIM modules Test device authentication flow using TUI Test password authentication flow using Janssen Server Tent Test Agama project deployment and functioning", "title": "Sanity checks"}, {"location": "contribute/testing/#post-release-qa-checklist", "text": "# QA Checks 1 Package installation verification on all OS Platforms as in pre-release tests", "title": "Post-release QA checklist"}, {"location": "contribute/ci-cd/release-process/", "tags": ["Release", "faq"], "text": "Release Process # The release process starts on scheduled times detailed in the milestones of the Janssen project. The release manager is responsible for coordinating the release process and ensuring that all steps are completed. The process is as follows: Release Planning : The release manager creates a release plan that normally includes the release date, the version number, and the main features that will be included in the release. The release plan is shared with the team for review and feedback. Feature Freeze : The release manager announces the feature freeze date. After this date, no new features will be added to the release. The team focuses on fixing bugs and improving the quality of the release. QA starts testing the release. Code Freeze : The release manager announces the code freeze date. After this date, no new code will be added to the release. The team focuses on fixing bugs and improving the quality of the release. QA team verifies testing the release. Release Candidate : The release manager creates a release candidate and shares it with the team for testing. The team tests the release candidate and reports any issues found. The release manager fixes the issues and creates a new release candidate. This process continues until the release candidate is stable. This is normally done via a PR process and release branch following the structure release- . Release : The release manager creates the final release and shares it with the team. The team tests the final release and reports any issues found. The release manager fixes the issues and creates a new release. This process continues until the final release is stable. Release Notes : The release manager creates the release notes and shares them with the team. The release notes include the version number, the main features included in the release, and any known issues. The release notes are shared with the community. This process is automated and picked up through conventional commits developers submit. Release Announcement : The release manager announces the release to the community. The announcement includes the version number, the main features included in the release, and any known issues. The announcement is shared on the Janssen website, the Janssen blog, and social media. The release manager also sends an email to the Janssen mailing list. Post-Release : The release manager monitors the release and addresses any issues that arise. The team continues to work on the next release. Release Retrospective : The release manager conducts a retrospective to review the release process and identify areas for improvement. The team provides feedback on the release process. The release manager uses this feedback to improve the release process for future releases. Next Release Planning : The release manager starts planning the next release. The process starts again from step 1. A branch release- is created for the next dev and snapshot release with a similar process from step 1 and is merged into main . Future plans # We are planning a full move to SemVer for all Janssen projects that will be scheduled bi-weekly. In this move, the Google release-please GitHub workflow will be activated to automatically release the projects according to the conventional commits submitted.", "title": "Release Process"}, {"location": "contribute/ci-cd/release-process/#release-process", "text": "The release process starts on scheduled times detailed in the milestones of the Janssen project. The release manager is responsible for coordinating the release process and ensuring that all steps are completed. The process is as follows: Release Planning : The release manager creates a release plan that normally includes the release date, the version number, and the main features that will be included in the release. The release plan is shared with the team for review and feedback. Feature Freeze : The release manager announces the feature freeze date. After this date, no new features will be added to the release. The team focuses on fixing bugs and improving the quality of the release. QA starts testing the release. Code Freeze : The release manager announces the code freeze date. After this date, no new code will be added to the release. The team focuses on fixing bugs and improving the quality of the release. QA team verifies testing the release. Release Candidate : The release manager creates a release candidate and shares it with the team for testing. The team tests the release candidate and reports any issues found. The release manager fixes the issues and creates a new release candidate. This process continues until the release candidate is stable. This is normally done via a PR process and release branch following the structure release- . Release : The release manager creates the final release and shares it with the team. The team tests the final release and reports any issues found. The release manager fixes the issues and creates a new release. This process continues until the final release is stable. Release Notes : The release manager creates the release notes and shares them with the team. The release notes include the version number, the main features included in the release, and any known issues. The release notes are shared with the community. This process is automated and picked up through conventional commits developers submit. Release Announcement : The release manager announces the release to the community. The announcement includes the version number, the main features included in the release, and any known issues. The announcement is shared on the Janssen website, the Janssen blog, and social media. The release manager also sends an email to the Janssen mailing list. Post-Release : The release manager monitors the release and addresses any issues that arise. The team continues to work on the next release. Release Retrospective : The release manager conducts a retrospective to review the release process and identify areas for improvement. The team provides feedback on the release process. The release manager uses this feedback to improve the release process for future releases. Next Release Planning : The release manager starts planning the next release. The process starts again from step 1. A branch release- is created for the next dev and snapshot release with a similar process from step 1 and is merged into main .", "title": "Release Process"}, {"location": "contribute/ci-cd/release-process/#future-plans", "text": "We are planning a full move to SemVer for all Janssen projects that will be scheduled bi-weekly. In this move, the Google release-please GitHub workflow will be activated to automatically release the projects according to the conventional commits submitted.", "title": "Future plans"}, {"location": "contribute/implementation-design/agama/", "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Agama"}, {"location": "contribute/implementation-design/agama/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "contribute/implementation-design/agama/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "contribute/implementation-design/agama/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "contribute/implementation-design/jans-auth-server/", "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "jans-auth-server"}, {"location": "contribute/implementation-design/jans-auth-server/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "contribute/implementation-design/jans-auth-server/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "contribute/implementation-design/jans-auth-server/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "contribute/implementation-design/jans-cli/", "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "jans-cli"}, {"location": "contribute/implementation-design/jans-cli/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "contribute/implementation-design/jans-cli/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "contribute/implementation-design/jans-cli/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "contribute/implementation-design/jans-config-api/", "tags": ["developer", "config-api"], "text": "Overview # Janssen Config API # Janssen(Jans) Config API is an application programming interface (API) gateway managing configuring of various Janssen modules. Diagram reference Jans Config API features: # Jans Config API uses REST endpoints to communicate. Jans Config API endpoint are OAuth 2.0 protected. More details here Jans Config API plugin architecture can be used to add new features. More details here . Config API endpoint can be used to create new user, clients, scopes, etc. This data is stores into the same persistence store as the Jans-Auth server. Jans Config API Flow # sequenceDiagram title Jans Config API request flow autonumber participant Admin participant Admin UI participant Config API participant Auth Server participant Jans Persistence Admin->>Admin UI: Create Client note over Admin UI: Click on plus sign to Create Client and Save button to create new client Config API->>Auth Server: Introspect Token Auth Server->>Config API: Returns Introspection Response Config API->>Config API: Successful validation of token claim with Introspection Response Config API->>Jans Persistence: Validate and persist client data Config API->>Admin UI: Returns persistence status Admin : Administrator of the application. Will use Admin UI to configure application. Admin UI : Gluu graphical user interface for the administrators to manage configuration and other properties of Jans Auth Server via Jans Config API. Config API : Jans API gateway for configuring Janssen modules like Jans Auth Server, fido2, SCIM, etc. Auth Server : Janssen federated identity with comprehensive implementation of OpenID Connect. Used for introspection of access token in this flow. Jans Persistence : Jans Persistence layer to persist data in backend.", "title": "jans-config-api"}, {"location": "contribute/implementation-design/jans-config-api/#overview", "text": "", "title": "Overview"}, {"location": "contribute/implementation-design/jans-config-api/#janssen-config-api", "text": "Janssen(Jans) Config API is an application programming interface (API) gateway managing configuring of various Janssen modules. Diagram reference", "title": "Janssen Config API"}, {"location": "contribute/implementation-design/jans-config-api/#jans-config-api-features", "text": "Jans Config API uses REST endpoints to communicate. Jans Config API endpoint are OAuth 2.0 protected. More details here Jans Config API plugin architecture can be used to add new features. More details here . Config API endpoint can be used to create new user, clients, scopes, etc. This data is stores into the same persistence store as the Jans-Auth server.", "title": "Jans Config API features:"}, {"location": "contribute/implementation-design/jans-config-api/#jans-config-api-flow", "text": "sequenceDiagram title Jans Config API request flow autonumber participant Admin participant Admin UI participant Config API participant Auth Server participant Jans Persistence Admin->>Admin UI: Create Client note over Admin UI: Click on plus sign to Create Client and Save button to create new client Config API->>Auth Server: Introspect Token Auth Server->>Config API: Returns Introspection Response Config API->>Config API: Successful validation of token claim with Introspection Response Config API->>Jans Persistence: Validate and persist client data Config API->>Admin UI: Returns persistence status Admin : Administrator of the application. Will use Admin UI to configure application. Admin UI : Gluu graphical user interface for the administrators to manage configuration and other properties of Jans Auth Server via Jans Config API. Config API : Jans API gateway for configuring Janssen modules like Jans Auth Server, fido2, SCIM, etc. Auth Server : Janssen federated identity with comprehensive implementation of OpenID Connect. Used for introspection of access token in this flow. Jans Persistence : Jans Persistence layer to persist data in backend.", "title": "Jans Config API Flow"}, {"location": "contribute/implementation-design/jans-core/", "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "jans-core"}, {"location": "contribute/implementation-design/jans-core/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "contribute/implementation-design/jans-core/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "contribute/implementation-design/jans-core/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "contribute/implementation-design/jans-fido2/", "tags": ["developer", "fido"], "text": "Overview # Janssen's FIDO2 server # FIDO2 as an open standard for authentication is based on public key cryptography. Janssen's FIDO2 server - a component inside the Janssen project enables users of RPs to enroll and authenticate themselves using U2F keys, FIDO2 keys or inbuilt platform authenticator. 1. The FIDO2 server uses REST endpoints to communicate with an RP via an https connection. 2. The FIDO2 server implements the FIDO Metadata Service (MDS3) defined by FIDO Alliance. 3. The FIDO2 server stores user data into the same persistence store as the Jans-Auth server. (PostgreSQL, MYSQL etc.) Components of the FIDO2 ecosystem in Janssen # Diagram reference User : User of an application, the one who possesses the Authenticator and who's role is to pass the Test of User Presence (TUP) (touch device, look, speak etc.). WebAuthn API : A global web standard for password-less FIDO2 authentication, implemented by most browsers (Google Chrome, Mozilla Firefox, Microsoft Edge, Apple Safari, Opera, Microsoft edge). It provides clients access to the underlying capabilities of the Authenticator. WebAuthn offers a very good user experience, there is no need for any additional browser plugin to be installed. WebAuthn API: enables clients to make requests to authenticators with regards to : creation of a new key-pair provide an assertion about a key report capabilities (capability exists but not offered in Janssen's FIDO2 offering) manage a PIN. (capability exists but not offered in Janssen's FIDO2 offering) Authenticator : A device which holds the private key. It prompts the user to perform a certain gesture. It can be a platform authenticator that is built into the client device or a roaming authenticator that is connected to the client device through USB, BLE, or NFC. Relying Party : The RP ( jans-auth or casa ) implements a Javascript Client which makes a registration and authentication request to the WebAuthn API. The Relying Party ID is the DNS domain where the FIDO2 device will be registered and used. CTAP2 : Simple and lightweight hardware protocol that enables Authenticators to talk with Supported browsers. FIDO2 Server Janssen's FIDO server is a standalone server communicates with the RP using an API which can be obtained by querying the following URL : https:///.well-known/fido2-configuration Response: { \"version\": \"1.1\", \"issuer\": \"https://\", \"attestation\": { \"base_path\": \"https:///jans-fido2/restv1/attestation\", \"options_enpoint\": \"https:///jans-fido2/restv1/attestation/options\", \"result_enpoint\": \"https:///jans-fido2/restv1/attestation/result\" }, \"assertion\": { \"base_path\": \"https:///jans-fido2/restv1/assertion\", \"options_enpoint\": \"https:///jans-fido2/restv1/assertion/options\", \"result_enpoint\": \"https:///jans-fido2/restv1/assertion/result\" } } The two main functionalities are: 1. Attestation 2. Assertion The authenticator credentials obtained after querying the WebAuthn API is forwarded to the FIDO2 server for attestation or assertion. Interception script : In the Janssen ecosystem, the authentication flow that comprises of the calls to WebAuthn API and the FIDO server is achieved using an interception script, details of it can be found here . Attestation formats supported by Janssen's FIDO server # Packed (FIDO2) : The most used attestation format TPM : Attestation for Windows10 devices Android key attestation : Attestation for android devices. Android SafetyNet : Any Android devices running 7+ FIDO U2F : Legacy U2F authenticators Apple Anonymous : Apple devices do attestations differently. None Backward compatibility with U2F authenticators # The FIDO server offers registration and authentication using legacy U2F authenticators. References # https://www.w3.org/TR/webauthn-2/ http://fidoalliance.org/specs/mds/fido-metadata-statement-v3.0-ps-20210518.html Tools # https://jwt.io/ \u2013 For JWT decoding and debugging https://www.base64decode.org/ \u2013 For Decoding Base64 to UTF8 https://fidoalliance.org/certification/fido-certified-products/ - To browse authenticators listed with FIDO Alliance", "title": "jans-fido2"}, {"location": "contribute/implementation-design/jans-fido2/#overview", "text": "", "title": "Overview"}, {"location": "contribute/implementation-design/jans-fido2/#janssens-fido2-server", "text": "FIDO2 as an open standard for authentication is based on public key cryptography. Janssen's FIDO2 server - a component inside the Janssen project enables users of RPs to enroll and authenticate themselves using U2F keys, FIDO2 keys or inbuilt platform authenticator. 1. The FIDO2 server uses REST endpoints to communicate with an RP via an https connection. 2. The FIDO2 server implements the FIDO Metadata Service (MDS3) defined by FIDO Alliance. 3. The FIDO2 server stores user data into the same persistence store as the Jans-Auth server. (PostgreSQL, MYSQL etc.)", "title": "Janssen's FIDO2 server"}, {"location": "contribute/implementation-design/jans-fido2/#components-of-the-fido2-ecosystem-in-janssen", "text": "Diagram reference User : User of an application, the one who possesses the Authenticator and who's role is to pass the Test of User Presence (TUP) (touch device, look, speak etc.). WebAuthn API : A global web standard for password-less FIDO2 authentication, implemented by most browsers (Google Chrome, Mozilla Firefox, Microsoft Edge, Apple Safari, Opera, Microsoft edge). It provides clients access to the underlying capabilities of the Authenticator. WebAuthn offers a very good user experience, there is no need for any additional browser plugin to be installed. WebAuthn API: enables clients to make requests to authenticators with regards to : creation of a new key-pair provide an assertion about a key report capabilities (capability exists but not offered in Janssen's FIDO2 offering) manage a PIN. (capability exists but not offered in Janssen's FIDO2 offering) Authenticator : A device which holds the private key. It prompts the user to perform a certain gesture. It can be a platform authenticator that is built into the client device or a roaming authenticator that is connected to the client device through USB, BLE, or NFC. Relying Party : The RP ( jans-auth or casa ) implements a Javascript Client which makes a registration and authentication request to the WebAuthn API. The Relying Party ID is the DNS domain where the FIDO2 device will be registered and used. CTAP2 : Simple and lightweight hardware protocol that enables Authenticators to talk with Supported browsers. FIDO2 Server Janssen's FIDO server is a standalone server communicates with the RP using an API which can be obtained by querying the following URL : https:///.well-known/fido2-configuration Response: { \"version\": \"1.1\", \"issuer\": \"https://\", \"attestation\": { \"base_path\": \"https:///jans-fido2/restv1/attestation\", \"options_enpoint\": \"https:///jans-fido2/restv1/attestation/options\", \"result_enpoint\": \"https:///jans-fido2/restv1/attestation/result\" }, \"assertion\": { \"base_path\": \"https:///jans-fido2/restv1/assertion\", \"options_enpoint\": \"https:///jans-fido2/restv1/assertion/options\", \"result_enpoint\": \"https:///jans-fido2/restv1/assertion/result\" } } The two main functionalities are: 1. Attestation 2. Assertion The authenticator credentials obtained after querying the WebAuthn API is forwarded to the FIDO2 server for attestation or assertion. Interception script : In the Janssen ecosystem, the authentication flow that comprises of the calls to WebAuthn API and the FIDO server is achieved using an interception script, details of it can be found here .", "title": "Components of the FIDO2 ecosystem in Janssen"}, {"location": "contribute/implementation-design/jans-fido2/#attestation-formats-supported-by-janssens-fido-server", "text": "Packed (FIDO2) : The most used attestation format TPM : Attestation for Windows10 devices Android key attestation : Attestation for android devices. Android SafetyNet : Any Android devices running 7+ FIDO U2F : Legacy U2F authenticators Apple Anonymous : Apple devices do attestations differently. None", "title": "Attestation formats supported by Janssen's FIDO server"}, {"location": "contribute/implementation-design/jans-fido2/#backward-compatibility-with-u2f-authenticators", "text": "The FIDO server offers registration and authentication using legacy U2F authenticators.", "title": "Backward compatibility with U2F authenticators"}, {"location": "contribute/implementation-design/jans-fido2/#references", "text": "https://www.w3.org/TR/webauthn-2/ http://fidoalliance.org/specs/mds/fido-metadata-statement-v3.0-ps-20210518.html", "title": "References"}, {"location": "contribute/implementation-design/jans-fido2/#tools", "text": "https://jwt.io/ \u2013 For JWT decoding and debugging https://www.base64decode.org/ \u2013 For Decoding Base64 to UTF8 https://fidoalliance.org/certification/fido-certified-products/ - To browse authenticators listed with FIDO Alliance", "title": "Tools"}, {"location": "contribute/implementation-design/jans-orm/", "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "jans-orm"}, {"location": "contribute/implementation-design/jans-orm/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "contribute/implementation-design/jans-orm/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "contribute/implementation-design/jans-orm/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "contribute/implementation-design/jans-scim/", "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "jans-scim"}, {"location": "contribute/implementation-design/jans-scim/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "contribute/implementation-design/jans-scim/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "contribute/implementation-design/jans-scim/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "governance/charter/", "tags": ["governance", "charter"], "text": "Technical Charter (the \u201cCharter\u201d) for Janssen Project a Series of LF Projects, LLC # Adopted December 8, 2020 This Charter sets forth the responsibilities and procedures for technical contribution to, and oversight of, the Janssen open source project, which has been established as Janssen Project a Series of LF Projects, LLC (the \u201cProject\u201d). LF Projects, LLC (\u201cLF Projects\u201d) is a Delaware series limited liability company. All contributors (including committers, maintainers, and other technical positions) and other participants in the Project (collectively, \u201cCollaborators\u201d) must comply with the terms of this Charter. Mission and Scope of the Project The mission of the Project is to develop and maintain a cloud native identity and authorization platform that comprehensively implements OAuth, OpenID Connect and the User Managed Access protocol, while maintaining flexibility and horizontal scalability. The scope of the Project includes collaborative development under the Project License (as defined herein) supporting the mission, including documentation, testing, integration and the creation of other artifacts that aid the development, deployment, operation or adoption of the open source project. Technical Steering Committee The Technical Steering Committee (the \u201cTSC\u201d) will be responsible for all technical oversight of the open source Project. The TSC voting members are initially the Project\u2019s Committers. At the inception of the project, the Committers of the Project will be as set forth within the \u201cCONTRIBUTING\u201d file within the Project\u2019s code repository. The TSC may choose an alternative approach for determining the voting members of the TSC, and any such alternative approach will be documented in the CONTRIBUTING file. Any meetings of the Technical Steering Committee are intended to be open to the public, and can be conducted electronically, via teleconference, or in person. TSC projects generally will involve Contributors and Committers. The TSC may adopt or modify roles so long as the roles are documented in the CONTRIBUTING file. Unless otherwise documented: Contributors include anyone in the technical community that contributes code, documentation, or other technical artifacts to the Project; Committers are Contributors who have earned the ability to modify (\u201ccommit\u201d) source code, documentation or other technical artifacts in a project\u2019s repository; and A Contributor may become a Committer by a majority approval of the existing Committers. A Committer may be removed by a majority approval of the other existing Committers. Participation in the Project through becoming a Contributor and Committer is open to anyone so long as they abide by the terms of this Charter. The TSC may (1) establish work flow procedures for the submission, approval, and closure/archiving of projects, (2) set requirements for the promotion of Contributors to Committer status, as applicable, and (3) amend, adjust, refine and/or eliminate the roles of Contributors, and Committers, and create new roles, and publicly document any TSC roles, as it sees fit. The TSC may elect a TSC Chair, who will preside over meetings of the TSC and will serve until their resignation or replacement by the TSC. Responsibilities: The TSC will be responsible for all aspects of oversight relating to the Project, which may include: coordinating the technical direction of the Project; approving project or system proposals (including, but not limited to, incubation, deprecation, and changes to a sub-project\u2019s scope); organizing sub-projects and removing sub-projects; creating sub-committees or working groups to focus on cross-project technical issues and requirements; appointing representatives to work with other open source or open standards communities; establishing community norms, workflows, issuing releases, and security issue reporting policies; approving and implementing policies and processes for contributing (to be published in the CONTRIBUTING file) and coordinating with the series manager of the Project (as provided for in the Series Agreement, the \u201cSeries Manager\u201d) to resolve matters or concerns that may arise as set forth in Section 7 of this Charter; discussions, seeking consensus, and where necessary, voting on technical matters relating to the code base that affect multiple projects; and coordinating any marketing, events, or communications regarding the Project. TSC Voting While the Project aims to operate as a consensus-based community, if any TSC decision requires a vote to move the Project forward, the voting members of the TSC will vote on a one vote per voting member basis. Quorum for TSC meetings requires at least fifty percent of all voting members of the TSC to be present. The TSC may continue to meet if quorum is not met but will be prevented from making any decisions at the meeting. Except as provided in Section 7.iii. and 8.i, decisions by vote at a meeting require a majority vote of those in attendance, provided quorum is met. Decisions made by electronic vote without a meeting require a majority vote of all voting members of the TSC. In the event a vote cannot be resolved by the TSC, any voting member of the TSC may refer the matter to the Series Manager for assistance in reaching a resolution. Compliance with Policies This Charter is subject to the Series Agreement for the Project and the Operating Agreement of LF Projects. Contributors will comply with the policies of LF Projects as may be adopted and amended by LF Projects, including, without limitation the policies listed at https://lfprojects.org/policies/. The TSC may adopt a code of conduct (\u201cCoC\u201d) for the Project, which is subject to approval by the Series Manager. In the event that a Project-specific CoC has not been approved, the LF Projects Code of Conduct listed at https://lfprojects.org/policies will apply for all Collaborators in the Project. When amending or adopting any policy applicable to the Project, LF Projects will publish such policy, as to be amended or adopted, on its web site at least 30 days prior to such policy taking effect; provided, however, that in the case of any amendment of the Trademark Policy or Terms of Use of LF Projects, any such amendment is effective upon publication on LF Project\u2019s web site. All Collaborators must allow open participation from any individual or organization meeting the requirements for contributing under this Charter and any policies adopted for all Collaborators by the TSC, regardless of competitive interests. Put another way, the Project community must not seek to exclude any participant based on any criteria, requirement, or reason other than those that are reasonable and applied on a non-discriminatory basis to all Collaborators in the Project community. The Project will operate in a transparent, open, collaborative, and ethical manner at all times. The output of all Project discussions, proposals, timelines, decisions, and status should be made open and easily visible to all. Any potential violations of this requirement should be reported immediately to the Series Manager. Community Assets LF Projects will hold title to all trade or service marks used by the Project (\u201cProject Trademarks\u201d), whether based on common law or registered rights. Project Trademarks will be transferred and assigned to LF Projects to hold on behalf of the Project. Any use of any Project Trademarks by Collaborators in the Project will be in accordance with the license from LF Projects and inure to the benefit of LF Projects. The Project will, as permitted and in accordance with such license from LF Projects, develop and own all Project GitHub and social media accounts, and domain name registrations created by the Project community. Under no circumstances will LF Projects be expected or required to undertake any action on behalf of the Project that is inconsistent with the tax-exempt status or purpose, as applicable, of LFP, Inc. or LF Projects, LLC. General Rules and Operations. The Project will: engage in the work of the Project in a professional manner consistent with maintaining a cohesive community, while also maintaining the goodwill and esteem of LF Projects, LFP, Inc. and other partner organizations in the open source community; and respect the rights of all trademark owners, including any branding and trademark usage guidelines. Intellectual Property Policy Collaborators acknowledge that the copyright in all new contributions will be retained by the copyright holder as independent works of authorship and that no contributor or copyright holder will be required to assign copyrights to the Project. Except as described in Section 7.iii., all contributions to the Project are subject to the following: All new inbound code contributions to the Project must be made using the Apache License, Version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0 (the \u201cProject License\u201d). All new inbound code contributions must also be accompanied by a Developer Certificate of Origin ( http://developercertificate.org ) sign-off in the source code system that is submitted through a TSC-approved contribution process which will bind the authorized contributor and, if not self-employed, their employer to the applicable license; All outbound code will be made available under the Project License. Documentation will be received and made available by the Project under the Creative Commons Attribution 4.0 International License (available at http://creativecommons.org/licenses/by/4.0/ ). The Project may seek to integrate and contribute back to other open source projects (\u201cUpstream Projects\u201d). In such cases, the Project will conform to all license requirements of the Upstream Projects, including dependencies, leveraged by the Project. Upstream Project code contributions not stored within the Project\u2019s main code repository will comply with the contribution process and license terms for the applicable Upstream Project. The TSC may approve the use of an alternative license or licenses for inbound or outbound contributions on an exception basis. To request an exception, please describe the contribution, the alternative open source license(s), and the justification for using an alternative open source license for the Project. License exceptions must be approved by a two-thirds vote of the entire TSC. Contributed files should contain license information, such as SPDX short form identifiers, indicating the open source license or licenses pertaining to the file. Amendments This charter may be amended by a two-thirds vote of the entire TSC and is subject to approval by LF Projects.", "title": "Charter"}, {"location": "governance/charter/#technical-charter-the-charter-for-janssen-project-a-series-of-lf-projects-llc", "text": "Adopted December 8, 2020 This Charter sets forth the responsibilities and procedures for technical contribution to, and oversight of, the Janssen open source project, which has been established as Janssen Project a Series of LF Projects, LLC (the \u201cProject\u201d). LF Projects, LLC (\u201cLF Projects\u201d) is a Delaware series limited liability company. All contributors (including committers, maintainers, and other technical positions) and other participants in the Project (collectively, \u201cCollaborators\u201d) must comply with the terms of this Charter. Mission and Scope of the Project The mission of the Project is to develop and maintain a cloud native identity and authorization platform that comprehensively implements OAuth, OpenID Connect and the User Managed Access protocol, while maintaining flexibility and horizontal scalability. The scope of the Project includes collaborative development under the Project License (as defined herein) supporting the mission, including documentation, testing, integration and the creation of other artifacts that aid the development, deployment, operation or adoption of the open source project. Technical Steering Committee The Technical Steering Committee (the \u201cTSC\u201d) will be responsible for all technical oversight of the open source Project. The TSC voting members are initially the Project\u2019s Committers. At the inception of the project, the Committers of the Project will be as set forth within the \u201cCONTRIBUTING\u201d file within the Project\u2019s code repository. The TSC may choose an alternative approach for determining the voting members of the TSC, and any such alternative approach will be documented in the CONTRIBUTING file. Any meetings of the Technical Steering Committee are intended to be open to the public, and can be conducted electronically, via teleconference, or in person. TSC projects generally will involve Contributors and Committers. The TSC may adopt or modify roles so long as the roles are documented in the CONTRIBUTING file. Unless otherwise documented: Contributors include anyone in the technical community that contributes code, documentation, or other technical artifacts to the Project; Committers are Contributors who have earned the ability to modify (\u201ccommit\u201d) source code, documentation or other technical artifacts in a project\u2019s repository; and A Contributor may become a Committer by a majority approval of the existing Committers. A Committer may be removed by a majority approval of the other existing Committers. Participation in the Project through becoming a Contributor and Committer is open to anyone so long as they abide by the terms of this Charter. The TSC may (1) establish work flow procedures for the submission, approval, and closure/archiving of projects, (2) set requirements for the promotion of Contributors to Committer status, as applicable, and (3) amend, adjust, refine and/or eliminate the roles of Contributors, and Committers, and create new roles, and publicly document any TSC roles, as it sees fit. The TSC may elect a TSC Chair, who will preside over meetings of the TSC and will serve until their resignation or replacement by the TSC. Responsibilities: The TSC will be responsible for all aspects of oversight relating to the Project, which may include: coordinating the technical direction of the Project; approving project or system proposals (including, but not limited to, incubation, deprecation, and changes to a sub-project\u2019s scope); organizing sub-projects and removing sub-projects; creating sub-committees or working groups to focus on cross-project technical issues and requirements; appointing representatives to work with other open source or open standards communities; establishing community norms, workflows, issuing releases, and security issue reporting policies; approving and implementing policies and processes for contributing (to be published in the CONTRIBUTING file) and coordinating with the series manager of the Project (as provided for in the Series Agreement, the \u201cSeries Manager\u201d) to resolve matters or concerns that may arise as set forth in Section 7 of this Charter; discussions, seeking consensus, and where necessary, voting on technical matters relating to the code base that affect multiple projects; and coordinating any marketing, events, or communications regarding the Project. TSC Voting While the Project aims to operate as a consensus-based community, if any TSC decision requires a vote to move the Project forward, the voting members of the TSC will vote on a one vote per voting member basis. Quorum for TSC meetings requires at least fifty percent of all voting members of the TSC to be present. The TSC may continue to meet if quorum is not met but will be prevented from making any decisions at the meeting. Except as provided in Section 7.iii. and 8.i, decisions by vote at a meeting require a majority vote of those in attendance, provided quorum is met. Decisions made by electronic vote without a meeting require a majority vote of all voting members of the TSC. In the event a vote cannot be resolved by the TSC, any voting member of the TSC may refer the matter to the Series Manager for assistance in reaching a resolution. Compliance with Policies This Charter is subject to the Series Agreement for the Project and the Operating Agreement of LF Projects. Contributors will comply with the policies of LF Projects as may be adopted and amended by LF Projects, including, without limitation the policies listed at https://lfprojects.org/policies/. The TSC may adopt a code of conduct (\u201cCoC\u201d) for the Project, which is subject to approval by the Series Manager. In the event that a Project-specific CoC has not been approved, the LF Projects Code of Conduct listed at https://lfprojects.org/policies will apply for all Collaborators in the Project. When amending or adopting any policy applicable to the Project, LF Projects will publish such policy, as to be amended or adopted, on its web site at least 30 days prior to such policy taking effect; provided, however, that in the case of any amendment of the Trademark Policy or Terms of Use of LF Projects, any such amendment is effective upon publication on LF Project\u2019s web site. All Collaborators must allow open participation from any individual or organization meeting the requirements for contributing under this Charter and any policies adopted for all Collaborators by the TSC, regardless of competitive interests. Put another way, the Project community must not seek to exclude any participant based on any criteria, requirement, or reason other than those that are reasonable and applied on a non-discriminatory basis to all Collaborators in the Project community. The Project will operate in a transparent, open, collaborative, and ethical manner at all times. The output of all Project discussions, proposals, timelines, decisions, and status should be made open and easily visible to all. Any potential violations of this requirement should be reported immediately to the Series Manager. Community Assets LF Projects will hold title to all trade or service marks used by the Project (\u201cProject Trademarks\u201d), whether based on common law or registered rights. Project Trademarks will be transferred and assigned to LF Projects to hold on behalf of the Project. Any use of any Project Trademarks by Collaborators in the Project will be in accordance with the license from LF Projects and inure to the benefit of LF Projects. The Project will, as permitted and in accordance with such license from LF Projects, develop and own all Project GitHub and social media accounts, and domain name registrations created by the Project community. Under no circumstances will LF Projects be expected or required to undertake any action on behalf of the Project that is inconsistent with the tax-exempt status or purpose, as applicable, of LFP, Inc. or LF Projects, LLC. General Rules and Operations. The Project will: engage in the work of the Project in a professional manner consistent with maintaining a cohesive community, while also maintaining the goodwill and esteem of LF Projects, LFP, Inc. and other partner organizations in the open source community; and respect the rights of all trademark owners, including any branding and trademark usage guidelines. Intellectual Property Policy Collaborators acknowledge that the copyright in all new contributions will be retained by the copyright holder as independent works of authorship and that no contributor or copyright holder will be required to assign copyrights to the Project. Except as described in Section 7.iii., all contributions to the Project are subject to the following: All new inbound code contributions to the Project must be made using the Apache License, Version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0 (the \u201cProject License\u201d). All new inbound code contributions must also be accompanied by a Developer Certificate of Origin ( http://developercertificate.org ) sign-off in the source code system that is submitted through a TSC-approved contribution process which will bind the authorized contributor and, if not self-employed, their employer to the applicable license; All outbound code will be made available under the Project License. Documentation will be received and made available by the Project under the Creative Commons Attribution 4.0 International License (available at http://creativecommons.org/licenses/by/4.0/ ). The Project may seek to integrate and contribute back to other open source projects (\u201cUpstream Projects\u201d). In such cases, the Project will conform to all license requirements of the Upstream Projects, including dependencies, leveraged by the Project. Upstream Project code contributions not stored within the Project\u2019s main code repository will comply with the contribution process and license terms for the applicable Upstream Project. The TSC may approve the use of an alternative license or licenses for inbound or outbound contributions on an exception basis. To request an exception, please describe the contribution, the alternative open source license(s), and the justification for using an alternative open source license for the Project. License exceptions must be approved by a two-thirds vote of the entire TSC. Contributed files should contain license information, such as SPDX short form identifiers, indicating the open source license or licenses pertaining to the file. Amendments This charter may be amended by a two-thirds vote of the entire TSC and is subject to approval by LF Projects.", "title": "Technical Charter (the \u201cCharter\u201d) for Janssen Project a Series of LF Projects, LLC"}, {"location": "governance/copyright-notices/", "tags": ["governance", "copyrights"], "text": "Copyrights # Ownership of Copyrights in Janssen Project Contributions # When source code, documentation and other content is contributed to the Janssen Project, the copyrights in those contributions remain owned by the original copyright holders. The copyrights are not assigned to the Janssen Project. Instead, they are licensed for distribution as part of the project. Whether a project uses a DCO or a CLA, the original copyright holders retain their copyrights. Copyright Notices # The Janssen Project does not require or recommend that every contributor include their copyright notice in contributed files. See below for more details on why not. Instead, we recommend using a more general statement in a form similar to the following: Copyright The Janssen Project Authors. Copyright The Janssen Project Contributors. Copyright Contributors to the Janssen Project. These statements are intended to communicate the following: - the work is copyrighted; - the contributors of the code licensed it, but retain ownership of their copyrights; and - it was licensed for distribution as part of the named project. By using a common format, the project avoids having to deal with names of copyright holders, years or ranges of years, and variations on the (c) symbol. This aims to minimize the burden on developers and maintainers as well as redistributors of the code. What if I want my copyright notice included? # Please note that it is not wrong , and it is acceptable, if a contributor wishes to keep their own copyright notices on their contributions. The above is a recommended format for ease of use, but is not mandated by the Janssen Project. If you are contributing on behalf of your employer, you may wish to discuss with your legal department about whether they will require you to include a copyright notice identifying them as the copyright holder in contributions. What about Third Party Code? # If a file only contains code that originates from a third party source who didn't contribute it themselves, then you would not want to add the notices above. (In a similar vein, you wouldn't add a notice identifying you as the copyright holder either, if you didn't own it.) Just preserve the existing copyright and license notices as they are. If, however, you add copyrightable content to a pre-existing file from another project, then at that point you could add a copyright notice similar to the one above. Don't Change Someone Else's Notice without their Permission # You should not change or remove someone else's copyright notice unless they have expressly permitted you to do so. This includes third parties' notices in pre-existing code. Why not list every copyright holder? # There are several reasons why the Janssen Project doesn't require or recommend trying to list every copyright holder for contributions to every file: Copyright notices are not mandatory in order for the contributor to retain ownership of their copyright. Copyright notices are rarely kept up to date as a file evolves, resulting in inaccurate statements. Trying to keep notices up to date, or to correct notices that have become inaccurate, increases the burden on developers without tangible benefit. Developers and maintainers often do not want to have to worry about e.g. whether a minor contribution (such as a typo fix) means that a new copyright notice should be added. Adding many different copyright notices may increase the burden on downstream distributors, if their license compliance processes involve reproducing notices. The specific individual or legal entity that owns the copyright might not be known to the contributor; it could be you, your employer, or some other entity.", "title": "Copyright-notice"}, {"location": "governance/copyright-notices/#copyrights", "text": "", "title": "Copyrights"}, {"location": "governance/copyright-notices/#ownership-of-copyrights-in-janssen-project-contributions", "text": "When source code, documentation and other content is contributed to the Janssen Project, the copyrights in those contributions remain owned by the original copyright holders. The copyrights are not assigned to the Janssen Project. Instead, they are licensed for distribution as part of the project. Whether a project uses a DCO or a CLA, the original copyright holders retain their copyrights.", "title": "Ownership of Copyrights in Janssen Project Contributions"}, {"location": "governance/copyright-notices/#copyright-notices", "text": "The Janssen Project does not require or recommend that every contributor include their copyright notice in contributed files. See below for more details on why not. Instead, we recommend using a more general statement in a form similar to the following: Copyright The Janssen Project Authors. Copyright The Janssen Project Contributors. Copyright Contributors to the Janssen Project. These statements are intended to communicate the following: - the work is copyrighted; - the contributors of the code licensed it, but retain ownership of their copyrights; and - it was licensed for distribution as part of the named project. By using a common format, the project avoids having to deal with names of copyright holders, years or ranges of years, and variations on the (c) symbol. This aims to minimize the burden on developers and maintainers as well as redistributors of the code.", "title": "Copyright Notices"}, {"location": "governance/copyright-notices/#what-if-i-want-my-copyright-notice-included", "text": "Please note that it is not wrong , and it is acceptable, if a contributor wishes to keep their own copyright notices on their contributions. The above is a recommended format for ease of use, but is not mandated by the Janssen Project. If you are contributing on behalf of your employer, you may wish to discuss with your legal department about whether they will require you to include a copyright notice identifying them as the copyright holder in contributions.", "title": "What if I want my copyright notice included?"}, {"location": "governance/copyright-notices/#what-about-third-party-code", "text": "If a file only contains code that originates from a third party source who didn't contribute it themselves, then you would not want to add the notices above. (In a similar vein, you wouldn't add a notice identifying you as the copyright holder either, if you didn't own it.) Just preserve the existing copyright and license notices as they are. If, however, you add copyrightable content to a pre-existing file from another project, then at that point you could add a copyright notice similar to the one above.", "title": "What about Third Party Code?"}, {"location": "governance/copyright-notices/#dont-change-someone-elses-notice-without-their-permission", "text": "You should not change or remove someone else's copyright notice unless they have expressly permitted you to do so. This includes third parties' notices in pre-existing code.", "title": "Don't Change Someone Else's Notice without their Permission"}, {"location": "governance/copyright-notices/#why-not-list-every-copyright-holder", "text": "There are several reasons why the Janssen Project doesn't require or recommend trying to list every copyright holder for contributions to every file: Copyright notices are not mandatory in order for the contributor to retain ownership of their copyright. Copyright notices are rarely kept up to date as a file evolves, resulting in inaccurate statements. Trying to keep notices up to date, or to correct notices that have become inaccurate, increases the burden on developers without tangible benefit. Developers and maintainers often do not want to have to worry about e.g. whether a minor contribution (such as a typo fix) means that a new copyright notice should be added. Adding many different copyright notices may increase the burden on downstream distributors, if their license compliance processes involve reproducing notices. The specific individual or legal entity that owns the copyright might not be known to the contributor; it could be you, your employer, or some other entity.", "title": "Why not list every copyright holder?"}, {"location": "governance/triage/", "tags": ["governance", "triage"], "text": "Janssen Triage Process and labels # Triage process is used to quickly screen and categorise new issues and PRs. Aim is to determine characteristics of new PRs/issues and take quick actions if possible. Triage process is a contineous process. As new issues/PRs come in, the community initiates discussions, add labels, ask for more details. This process does not wait for triage call or a meeting to be called. Community holds triage calls at a regular cadence. Triage calls are mainly utilised to discuss issue/PR where concensus is not yet reached and to pick up anything which is not yet triaged. It is encouraged to complete triage outside of triage call to improve velocity. Stages in triage process: # Name Description Needs triage When a new issue or PR is created, it is automatically labeled as needs-triage . The label indicates that this issue is missing some of the metadata. Metadata such as the missing owner. Or the owner needs to add metadata labels for effort , priority , kind and component. Once these labels are added, the owner should remove this label and add ready-for-triage label. Ready for triage This label indicates that the issue has enough information and can be triaged. Triaged All issues/PRs with the label ready-for-triage will be reviewed by core members of the community who have permission to add triaged label. Reviewer reviews issue/PR to check if the issue/PR is fully triaged and can be added to backlog without discussion on triage call. At this point, the label triaged is added and the label ready-for-triage is removed. We expect most of the isseus and PRs will be able to follow above path and quickly move out of triage process without waiting for triage call. Issues/PRs which still doesn't have triaged label, or has needs-discussion label, will be discussed during triage call. Labels # Github labels help us annotate issues/PRs with additional data. Janssen community uses labels, as detailed below, to communicate information and help making decisions about issues/PRs. Communication labels # These labels communicate status of current triage process for an issue/PR or indicate where community contribution is required. Most of communication labels would be replaced by other labels as triage process progresses and issue enters active development. For example, help wanted label would be removed once issue gets under active development and a community members takes ownership of the issue. Below is the list of labels which fall under this category: Label Indicates That needs-triage issue/PR needs triaging ready-for-triage that sufficient details has been added to the issue/PR in form of labels and is ready for triage review triaged Issue/PR is fully triaged needs-information Indicates that creator needs to add more information to issue/PR in order to be meaningfully triaged. When adding this label, also comment on the issue about what information is needed needs-discussion Indicates that issue needs discussion during triage meeting. When adding this label, also comment on the issue about what is it that demands discussion on this issue good first issue Indicates to the community that this issue suitable for first time contributor help wanted Indicates to the community that this issue has complexity which is suitable for contribution from any external contributor Metadata labels # These labels enrich issue/PR with metadata that will help during triage process and active development. These labels may not be removed from issue/PR, though value of labels may change as development progresses. For example, effort label may change from effort-3 to effort-8 as we understand issue in more detail. Below is the list of labels in this category: Label Indicates That Details comp- Major Janssen components needing change in order to fix this issue/PR. For example, if this issue/PR would require change in files under fido2 module (under jans/fido2) , then apply comp-jans-fido2 label e.g comp-jans-auth-server , comp-jans-fido2 , area- Cross-cutting concerns involved in fixing this issue/PR. For example, if changes introduced by this issue/PR will need changes in documentation and need to be mentioned in release notes as well, then apply area-documentation , area-release-notes . area-CI should be applied when changes are required in artifacts relevent to automation, CI build infrastructure or release management process. An example of such artifact would be Github workflow scripts located under .github/workflows Labels available: area-documentation , area-release-notes , area-CI kind-bug Issue/PR is a bug in existing functionality kind-enhancement Issue/PR is an enhancement to an existing functionality kind-feature Issue/PR is new feature request kind-question Issue/PR is a question that can be addressed via pointers to documentation or user education kind-duplicate Issue/PR is a duplicate of existing issue/PR. Original issue should be mentioned in the comments using Duplicate of reply kind-dependencies Fix for Issue/PR pertains to external dependencies effort-1 Relative effort required for completion effort-2 Relative effort required for completion effort-3 Relative effort required for completion effort-5 Relative effort required for completion effort-8 Relative effort required for completion effort-13 Relative effort required for completion effort-21 Relative effort required for completion priority-0 An issue that causes a full outage, breakage, or major function unavailability for everyone, without any known workaround. The issue must be fixed immediately, taking precedence over all other work. Should receive updates at least once per day. priority-1 An issue that significantly impacts a large percentage of users; if there is a workaround it is partial or overly painful. The issue should be resolved before the next release. priority-2 The issue is important to a large percentage of users, with a workaround. Issues that are significantly ugly or painful (especially first-use or install-time issues). Issues with workarounds that would otherwise be P0 or P1. priority-3 An issue that is relevant to core functions, but does not impede progress. Important, but not urgent. priority-4 A relatively minor issue that is not relevant to core functions, or relates only to the attractiveness or pleasantness of use of the system. Good to have but not necessary changes/fixes. priority-5 The team acknowledges the request but (due to any number of reasons) does not plan to work on or accept contributions for this request. The issue remains open for discussion. Bot labeling methodology # The following labels are automatically assigned to Issues and PRs in GitHub following the schema provided in this file . Label Method comp- The bot will detect from the title the component between the parentheses. feat(jans-auth-server): detect will result in the label comp-jans-auth-server added to the issue or PR. In a PR these labels are also detected by modified files path area- The bot will detect from the title the area appropriate. ci: adding something new to our ci will result in the label area-CI added to the issue or PR. In a PR these labels are also detected by modified files path. kind-bug The bot will detect this from the conventional commit written title kind-enhancement The bot will detect this from the conventional commit written title kind-feature The bot will detect this from the conventional commit written title kind-question Issue/PR is a question that can be addressed via pointers to documentation or user education kind-dependencies The bot will detect this from the conventional commit written title", "title": "Triage"}, {"location": "governance/triage/#janssen-triage-process-and-labels", "text": "Triage process is used to quickly screen and categorise new issues and PRs. Aim is to determine characteristics of new PRs/issues and take quick actions if possible. Triage process is a contineous process. As new issues/PRs come in, the community initiates discussions, add labels, ask for more details. This process does not wait for triage call or a meeting to be called. Community holds triage calls at a regular cadence. Triage calls are mainly utilised to discuss issue/PR where concensus is not yet reached and to pick up anything which is not yet triaged. It is encouraged to complete triage outside of triage call to improve velocity.", "title": "Janssen Triage Process and labels"}, {"location": "governance/triage/#stages-in-triage-process", "text": "Name Description Needs triage When a new issue or PR is created, it is automatically labeled as needs-triage . The label indicates that this issue is missing some of the metadata. Metadata such as the missing owner. Or the owner needs to add metadata labels for effort , priority , kind and component. Once these labels are added, the owner should remove this label and add ready-for-triage label. Ready for triage This label indicates that the issue has enough information and can be triaged. Triaged All issues/PRs with the label ready-for-triage will be reviewed by core members of the community who have permission to add triaged label. Reviewer reviews issue/PR to check if the issue/PR is fully triaged and can be added to backlog without discussion on triage call. At this point, the label triaged is added and the label ready-for-triage is removed. We expect most of the isseus and PRs will be able to follow above path and quickly move out of triage process without waiting for triage call. Issues/PRs which still doesn't have triaged label, or has needs-discussion label, will be discussed during triage call.", "title": "Stages in triage process:"}, {"location": "governance/triage/#labels", "text": "Github labels help us annotate issues/PRs with additional data. Janssen community uses labels, as detailed below, to communicate information and help making decisions about issues/PRs.", "title": "Labels"}, {"location": "governance/triage/#communication-labels", "text": "These labels communicate status of current triage process for an issue/PR or indicate where community contribution is required. Most of communication labels would be replaced by other labels as triage process progresses and issue enters active development. For example, help wanted label would be removed once issue gets under active development and a community members takes ownership of the issue. Below is the list of labels which fall under this category: Label Indicates That needs-triage issue/PR needs triaging ready-for-triage that sufficient details has been added to the issue/PR in form of labels and is ready for triage review triaged Issue/PR is fully triaged needs-information Indicates that creator needs to add more information to issue/PR in order to be meaningfully triaged. When adding this label, also comment on the issue about what information is needed needs-discussion Indicates that issue needs discussion during triage meeting. When adding this label, also comment on the issue about what is it that demands discussion on this issue good first issue Indicates to the community that this issue suitable for first time contributor help wanted Indicates to the community that this issue has complexity which is suitable for contribution from any external contributor", "title": "Communication labels"}, {"location": "governance/triage/#metadata-labels", "text": "These labels enrich issue/PR with metadata that will help during triage process and active development. These labels may not be removed from issue/PR, though value of labels may change as development progresses. For example, effort label may change from effort-3 to effort-8 as we understand issue in more detail. Below is the list of labels in this category: Label Indicates That Details comp- Major Janssen components needing change in order to fix this issue/PR. For example, if this issue/PR would require change in files under fido2 module (under jans/fido2) , then apply comp-jans-fido2 label e.g comp-jans-auth-server , comp-jans-fido2 , area- Cross-cutting concerns involved in fixing this issue/PR. For example, if changes introduced by this issue/PR will need changes in documentation and need to be mentioned in release notes as well, then apply area-documentation , area-release-notes . area-CI should be applied when changes are required in artifacts relevent to automation, CI build infrastructure or release management process. An example of such artifact would be Github workflow scripts located under .github/workflows Labels available: area-documentation , area-release-notes , area-CI kind-bug Issue/PR is a bug in existing functionality kind-enhancement Issue/PR is an enhancement to an existing functionality kind-feature Issue/PR is new feature request kind-question Issue/PR is a question that can be addressed via pointers to documentation or user education kind-duplicate Issue/PR is a duplicate of existing issue/PR. Original issue should be mentioned in the comments using Duplicate of reply kind-dependencies Fix for Issue/PR pertains to external dependencies effort-1 Relative effort required for completion effort-2 Relative effort required for completion effort-3 Relative effort required for completion effort-5 Relative effort required for completion effort-8 Relative effort required for completion effort-13 Relative effort required for completion effort-21 Relative effort required for completion priority-0 An issue that causes a full outage, breakage, or major function unavailability for everyone, without any known workaround. The issue must be fixed immediately, taking precedence over all other work. Should receive updates at least once per day. priority-1 An issue that significantly impacts a large percentage of users; if there is a workaround it is partial or overly painful. The issue should be resolved before the next release. priority-2 The issue is important to a large percentage of users, with a workaround. Issues that are significantly ugly or painful (especially first-use or install-time issues). Issues with workarounds that would otherwise be P0 or P1. priority-3 An issue that is relevant to core functions, but does not impede progress. Important, but not urgent. priority-4 A relatively minor issue that is not relevant to core functions, or relates only to the attractiveness or pleasantness of use of the system. Good to have but not necessary changes/fixes. priority-5 The team acknowledges the request but (due to any number of reasons) does not plan to work on or accept contributions for this request. The issue remains open for discussion.", "title": "Metadata labels"}, {"location": "governance/triage/#bot-labeling-methodology", "text": "The following labels are automatically assigned to Issues and PRs in GitHub following the schema provided in this file . Label Method comp- The bot will detect from the title the component between the parentheses. feat(jans-auth-server): detect will result in the label comp-jans-auth-server added to the issue or PR. In a PR these labels are also detected by modified files path area- The bot will detect from the title the area appropriate. ci: adding something new to our ci will result in the label area-CI added to the issue or PR. In a PR these labels are also detected by modified files path. kind-bug The bot will detect this from the conventional commit written title kind-enhancement The bot will detect this from the conventional commit written title kind-feature The bot will detect this from the conventional commit written title kind-question Issue/PR is a question that can be addressed via pointers to documentation or user education kind-dependencies The bot will detect this from the conventional commit written title", "title": "Bot labeling methodology"}, {"location": "janssen-server/auth-server/config/", "tags": ["administration", "auth-server", "configuration"], "text": "Configuration Overview # In some ways, this whole Auth Server admin guide is about configuration. But you have to start somewhere! This page provides a quick overview before you dive in! Config Server # The Configuration Server is a JSON/REST API that writes to the database, generates the keys, and does much of the other work you need to make your Janssen Project infrastructure solve your digital identity challenges. See the Config API Guide for more information. Tools # API - you can call the configuration endpoints with the API tool of your choice, like curl . With this mechanism, you can use client credential grant to obtain an OAuth token--just make sure it has the required scope to call the method / endpoint. See the Curl Guide for more info. CLI - The CLI, or Command Line Interface, calls the API for you. It uses the device flow to authenticate the person who is behind the config changes. See the Configuration CLI Guide for more info. TUI - The TUI, or Text User Interface, is a menu-based interactive tool that provides a more intuitive experience. When you make changes via the TUI, it also creates a log of the equivalent CLI command, in case you want a shortcut next time around. See the TUI Guide for more info. Client versus Server Configuration # Some behaviors are controlled at the server level. For example, should your Auth Server allow dynamic client registration? Other features you can configure either at the server or client level. For example, do you want user claims in an id_token ? Maybe you always want them (server), or maybe only sometimes (client). See the JSON Configuration/Properties for an overview of the server level configuration options. For client configuration options, see the Client Schema page. Interception Scripts # Janssen is a very flexible platform, that lets you customize many of the flows to meet your exact requirements. The black magic behind this flexibility is interception scripts--these are standard programming interfaces that enable you to add or change the behavior of Jans endpoints. Just to give one example, perhaps you need to add data from an external API into an OAuth access token? In this case, you could use the Update Token interception script. There are around 20 of these scripts. For a full list, see the Scripts Documentation . Customization # You don't want out of the box look and feel provided by Janssen. We know we are UX-challenged, backend developer geeks. Check out the Customization Guide for info about how to add adapt the user facing content to achieve your UX dreams. Operations # Janssen Project software has to run somewhere, right now... either on VM's or in containers. There are specifics instructions about each contained in these docs. Database and Cache # One of the biggest challenges in running the Janssen Platform is persistence. Make sure you understand how Janssen Project stores your data, or in some cases, caches it.", "title": "Auth Server Config"}, {"location": "janssen-server/auth-server/config/#configuration-overview", "text": "In some ways, this whole Auth Server admin guide is about configuration. But you have to start somewhere! This page provides a quick overview before you dive in!", "title": "Configuration Overview"}, {"location": "janssen-server/auth-server/config/#config-server", "text": "The Configuration Server is a JSON/REST API that writes to the database, generates the keys, and does much of the other work you need to make your Janssen Project infrastructure solve your digital identity challenges. See the Config API Guide for more information.", "title": "Config Server"}, {"location": "janssen-server/auth-server/config/#tools", "text": "API - you can call the configuration endpoints with the API tool of your choice, like curl . With this mechanism, you can use client credential grant to obtain an OAuth token--just make sure it has the required scope to call the method / endpoint. See the Curl Guide for more info. CLI - The CLI, or Command Line Interface, calls the API for you. It uses the device flow to authenticate the person who is behind the config changes. See the Configuration CLI Guide for more info. TUI - The TUI, or Text User Interface, is a menu-based interactive tool that provides a more intuitive experience. When you make changes via the TUI, it also creates a log of the equivalent CLI command, in case you want a shortcut next time around. See the TUI Guide for more info.", "title": "Tools"}, {"location": "janssen-server/auth-server/config/#client-versus-server-configuration", "text": "Some behaviors are controlled at the server level. For example, should your Auth Server allow dynamic client registration? Other features you can configure either at the server or client level. For example, do you want user claims in an id_token ? Maybe you always want them (server), or maybe only sometimes (client). See the JSON Configuration/Properties for an overview of the server level configuration options. For client configuration options, see the Client Schema page.", "title": "Client versus Server Configuration"}, {"location": "janssen-server/auth-server/config/#interception-scripts", "text": "Janssen is a very flexible platform, that lets you customize many of the flows to meet your exact requirements. The black magic behind this flexibility is interception scripts--these are standard programming interfaces that enable you to add or change the behavior of Jans endpoints. Just to give one example, perhaps you need to add data from an external API into an OAuth access token? In this case, you could use the Update Token interception script. There are around 20 of these scripts. For a full list, see the Scripts Documentation .", "title": "Interception Scripts"}, {"location": "janssen-server/auth-server/config/#customization", "text": "You don't want out of the box look and feel provided by Janssen. We know we are UX-challenged, backend developer geeks. Check out the Customization Guide for info about how to add adapt the user facing content to achieve your UX dreams.", "title": "Customization"}, {"location": "janssen-server/auth-server/config/#operations", "text": "Janssen Project software has to run somewhere, right now... either on VM's or in containers. There are specifics instructions about each contained in these docs.", "title": "Operations"}, {"location": "janssen-server/auth-server/config/#database-and-cache", "text": "One of the biggest challenges in running the Janssen Platform is persistence. Make sure you understand how Janssen Project stores your data, or in some cases, caches it.", "title": "Database and Cache"}, {"location": "janssen-server/auth-server/client-management/client-authn/", "tags": ["administration", "client", "authentication"], "text": "Client Authentication # Janssen Server supports authentication at the token endpoint for confidential clients. Confidential clients have to specify a preferred method of authentication during the client registration process. Client authentication is defined by OAuth and OpenID Connect client authentication section and in Metadata section property token_endpoint_auth_method Supported Authentication Methods # List of supported authentication methods are listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration The token_endpoint_auth_methods_supported claim in the response specifies the list of all the supported methods. Authentication Methods # Authentication methods can be broadly categorised in two categories: Shared key based Private( or asymmetric) key based While shared key based authentication is simpler to implement, it is less secure than a private key based authentication. This is primarily because when using shared key based authentication, the client secret is transmitted between the client and the authorization server. This makes the authentication vulnerable to theft attacks. There are more reasons to prefer private key over shared secret as listed in this section Characteristics table below shows side-by-side comparison of various supported authentication methods. Method Secret Not Sent in Clear Signed Only client has secret Expiry Token Binding client_secret_basic client_secret_post client_secret_jwt private_key_jwt tls_client_auth self_signed_tls_client_auth client_secret_basic # Default authentication method for Janssen Server. It authenticates clients using method described in client authentication section of OAuth framework. client_secret_post # client_secret_post method authenticates clients using method described in client authentication section of OAuth framework by adding client credentials in request body. client_secret_jwt # Like client_secret_basic and client_secret_post methods, this method is also based on a shared secret that client receives from Janssen Server. But instead of sending secret back to authorization server everytime, the client creates a JWT using an HMAC SHA algorithm where the shared secret is used as the key. This method is more secure than the client_secret_basic and client_secret_post due to following reasons: Secret which is shared once will never be transmitted again JWT can have expiration time, beyond which the same JWT can not be used. This reduces the time window for replay of the same token in case it is compromised. This method is further described in OpenId Connect specification, section 9 . Client Configuration For Using client_secret_jwt # Janssen Server clients should specify the preferred algorithm for use with this method during client configuration. Algorithms supported by Janssen Server are listed in the response of Janssen Server's well-known configuration endpoint . From the response, the claim token_endpoint_auth_signing_alg_values_supported lists the supported algorithms. To specify preferred algorithm for a client, using Janssen Text-based UI(TUI) , navigate via Auth Server -> Get or add clients -> encryption/signing -> TODO: which exact properties. private_key_jwt # private_key_jwt is private key based method where secret is not shared between client and authorization server. Instead, the client generates an JSON Web Token(JWT) which is shared with the Janssen Server. Upon receiving JWT singned by client's private key, the Janssen Server can validate this JWT using public keys supplied by client at the time of registration. The client can supply public keys in form of JSON Web Key Set(JWKS) or provide a URI where the client publishes its JWKS. Providing JWKS URI is preferred method as it enable easy key rotations without client having to update JWKS manualy. Check jwks and jwks_uri elements in OIDC client metadata section for more details. This authentication method is further described in OpenId Connect specification, section 9 . Janssen server implements signing and encryption mechanism following the guidelines in section 10 of OpenId Connect specification. Clients should choose the algorithm to sign and encrypt JWT as per their security requirements. Security Features Of Private Key Authentication # This method of authentication is more secure than the methods relying on shared key due to following features. Secure Storage : Hardware Security Module(HSM) or Trusted Platform Module(TPM) can be used to securely store private key and sign using it at client side. These modules make it impossible to access private key from outside. Smaller footprint : Unlike shared secret, where client secret resides on authorization server as well as client, the private key only exists on client. This reduced footprint reduces potential risks. Limited Time Validity : JWT can be set to expire after a certain duration. Similarly, client certificates can be made to expire. This makes it harder to execute replay attacks using a compromised token or certificate. Implementation Steps # Below are the high-level steps involved in using private_key_jwt authentication method: Create JWK private key Derive JWK public key for the private key. Public key JWK should be provided to Janssen Server at the time of registration Create JWT header and payload as described in section 9 of specification Sign JWT with a signing algorithm Client code that implements above steps should leverage any of the secure and trusted library that implements these functions. A non-exhaustive list of such libraries can be found at jwt.io . Psudocode implementation for Java based client using nimbus-jose-jwt library can be found here Client Configuration For Using private_key_jwt # Janssen Server clients can specify signing and encryption keys using client configuration. Clients can either specify JWKS as value or as reference URI. To specify JWKS values or reference URI, using Janssen Text-based UI(TUI) , navigate via Auth Server -> Get or add clients -> encryption/signing -> set value for Client JWKS URI or Client JWKS . tls_client_auth # During TLS handshake, the client authenticates with Janssen Server using X.509 certificate that is issued by a Certificate Authority(CA). This is mutual TLS based authentication method. Benefit of using mutual TLS based authentication is that the authorization server binds the token with the certificate. This provides enhanced security where it is possible to check that the token belongs to the intended client. This authentication mechanism is defined in mTLS specification for OAuth2 self_signed_tls_client_auth # Client authenticates with Janssen Server using self signed X.509 certificate during TLS handshake. Use of self-signed certificate removes the dependency of public key infrastructure(PKIX). This is mutual TLS based authentication method. Benefit of using mutual TLS based authentication is that the authorization server binds the token with the certificate. This provides enhanced security where it is possible to check that the token belongs to the intended client. This authentication mechanism is defined in mTLS specification for OAuth2 none # The Client does not authenticate itself at the Token Endpoint, either because it uses only the Implicit Flow (and so does not use the Token Endpoint) or because it is a Public Client with no Client Secret or other authentication mechanism. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Client Authentication"}, {"location": "janssen-server/auth-server/client-management/client-authn/#client-authentication", "text": "Janssen Server supports authentication at the token endpoint for confidential clients. Confidential clients have to specify a preferred method of authentication during the client registration process. Client authentication is defined by OAuth and OpenID Connect client authentication section and in Metadata section property token_endpoint_auth_method", "title": "Client Authentication"}, {"location": "janssen-server/auth-server/client-management/client-authn/#supported-authentication-methods", "text": "List of supported authentication methods are listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration The token_endpoint_auth_methods_supported claim in the response specifies the list of all the supported methods.", "title": "Supported Authentication Methods"}, {"location": "janssen-server/auth-server/client-management/client-authn/#authentication-methods", "text": "Authentication methods can be broadly categorised in two categories: Shared key based Private( or asymmetric) key based While shared key based authentication is simpler to implement, it is less secure than a private key based authentication. This is primarily because when using shared key based authentication, the client secret is transmitted between the client and the authorization server. This makes the authentication vulnerable to theft attacks. There are more reasons to prefer private key over shared secret as listed in this section Characteristics table below shows side-by-side comparison of various supported authentication methods. Method Secret Not Sent in Clear Signed Only client has secret Expiry Token Binding client_secret_basic client_secret_post client_secret_jwt private_key_jwt tls_client_auth self_signed_tls_client_auth", "title": "Authentication Methods"}, {"location": "janssen-server/auth-server/client-management/client-authn/#client_secret_basic", "text": "Default authentication method for Janssen Server. It authenticates clients using method described in client authentication section of OAuth framework.", "title": "client_secret_basic"}, {"location": "janssen-server/auth-server/client-management/client-authn/#client_secret_post", "text": "client_secret_post method authenticates clients using method described in client authentication section of OAuth framework by adding client credentials in request body.", "title": "client_secret_post"}, {"location": "janssen-server/auth-server/client-management/client-authn/#client_secret_jwt", "text": "Like client_secret_basic and client_secret_post methods, this method is also based on a shared secret that client receives from Janssen Server. But instead of sending secret back to authorization server everytime, the client creates a JWT using an HMAC SHA algorithm where the shared secret is used as the key. This method is more secure than the client_secret_basic and client_secret_post due to following reasons: Secret which is shared once will never be transmitted again JWT can have expiration time, beyond which the same JWT can not be used. This reduces the time window for replay of the same token in case it is compromised. This method is further described in OpenId Connect specification, section 9 .", "title": "client_secret_jwt"}, {"location": "janssen-server/auth-server/client-management/client-authn/#client-configuration-for-using-client_secret_jwt", "text": "Janssen Server clients should specify the preferred algorithm for use with this method during client configuration. Algorithms supported by Janssen Server are listed in the response of Janssen Server's well-known configuration endpoint . From the response, the claim token_endpoint_auth_signing_alg_values_supported lists the supported algorithms. To specify preferred algorithm for a client, using Janssen Text-based UI(TUI) , navigate via Auth Server -> Get or add clients -> encryption/signing -> TODO: which exact properties.", "title": "Client Configuration For Using client_secret_jwt"}, {"location": "janssen-server/auth-server/client-management/client-authn/#private_key_jwt", "text": "private_key_jwt is private key based method where secret is not shared between client and authorization server. Instead, the client generates an JSON Web Token(JWT) which is shared with the Janssen Server. Upon receiving JWT singned by client's private key, the Janssen Server can validate this JWT using public keys supplied by client at the time of registration. The client can supply public keys in form of JSON Web Key Set(JWKS) or provide a URI where the client publishes its JWKS. Providing JWKS URI is preferred method as it enable easy key rotations without client having to update JWKS manualy. Check jwks and jwks_uri elements in OIDC client metadata section for more details. This authentication method is further described in OpenId Connect specification, section 9 . Janssen server implements signing and encryption mechanism following the guidelines in section 10 of OpenId Connect specification. Clients should choose the algorithm to sign and encrypt JWT as per their security requirements.", "title": "private_key_jwt"}, {"location": "janssen-server/auth-server/client-management/client-authn/#security-features-of-private-key-authentication", "text": "This method of authentication is more secure than the methods relying on shared key due to following features. Secure Storage : Hardware Security Module(HSM) or Trusted Platform Module(TPM) can be used to securely store private key and sign using it at client side. These modules make it impossible to access private key from outside. Smaller footprint : Unlike shared secret, where client secret resides on authorization server as well as client, the private key only exists on client. This reduced footprint reduces potential risks. Limited Time Validity : JWT can be set to expire after a certain duration. Similarly, client certificates can be made to expire. This makes it harder to execute replay attacks using a compromised token or certificate.", "title": "Security Features Of Private Key Authentication"}, {"location": "janssen-server/auth-server/client-management/client-authn/#implementation-steps", "text": "Below are the high-level steps involved in using private_key_jwt authentication method: Create JWK private key Derive JWK public key for the private key. Public key JWK should be provided to Janssen Server at the time of registration Create JWT header and payload as described in section 9 of specification Sign JWT with a signing algorithm Client code that implements above steps should leverage any of the secure and trusted library that implements these functions. A non-exhaustive list of such libraries can be found at jwt.io . Psudocode implementation for Java based client using nimbus-jose-jwt library can be found here", "title": "Implementation Steps"}, {"location": "janssen-server/auth-server/client-management/client-authn/#client-configuration-for-using-private_key_jwt", "text": "Janssen Server clients can specify signing and encryption keys using client configuration. Clients can either specify JWKS as value or as reference URI. To specify JWKS values or reference URI, using Janssen Text-based UI(TUI) , navigate via Auth Server -> Get or add clients -> encryption/signing -> set value for Client JWKS URI or Client JWKS .", "title": "Client Configuration For Using private_key_jwt"}, {"location": "janssen-server/auth-server/client-management/client-authn/#tls_client_auth", "text": "During TLS handshake, the client authenticates with Janssen Server using X.509 certificate that is issued by a Certificate Authority(CA). This is mutual TLS based authentication method. Benefit of using mutual TLS based authentication is that the authorization server binds the token with the certificate. This provides enhanced security where it is possible to check that the token belongs to the intended client. This authentication mechanism is defined in mTLS specification for OAuth2", "title": "tls_client_auth"}, {"location": "janssen-server/auth-server/client-management/client-authn/#self_signed_tls_client_auth", "text": "Client authenticates with Janssen Server using self signed X.509 certificate during TLS handshake. Use of self-signed certificate removes the dependency of public key infrastructure(PKIX). This is mutual TLS based authentication method. Benefit of using mutual TLS based authentication is that the authorization server binds the token with the certificate. This provides enhanced security where it is possible to check that the token belongs to the intended client. This authentication mechanism is defined in mTLS specification for OAuth2", "title": "self_signed_tls_client_auth"}, {"location": "janssen-server/auth-server/client-management/client-authn/#none", "text": "The Client does not authenticate itself at the Token Endpoint, either because it uses only the Implicit Flow (and so does not use the Token Endpoint) or because it is a Public Client with no Client Secret or other authentication mechanism.", "title": "none"}, {"location": "janssen-server/auth-server/client-management/client-authn/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/client-management/client-configuration/", "tags": ["administration", "client", "configuration"], "text": "Client Configuration # This document covers some important configuration elements of client configuration. How these elements are configured for a client has an impact on aspects like client security. Redirect URI # Redirect URI is the most basic and at times the only parameter needed for registering a client. It is defined in OAuth framework and OpenId Connect specification . The client can register a list of URIs as a value for redirect URI parameter. Redirect URI can be any valid URI . Redirect URI should be an absolute URI . For instance, URI should not have wildcard characters. As recommended here Redirect Regex : Janssen Server enables clients to allow redirect URIs that conform to a regular expression(regex) pattern. While validating redirect URIs received in an incoming request, the Janssen Server first looks at the list of statically registered URI as part of Redirect URIs and then checks if any of the redirect URI from the request matches with the regex provided by the client. Great care should be exercised when using regex to ensure that it accurately matches with the intended patterns only. This feature can be turned on or off via feature flag When using client type as web , the redirect URI generally takes the form of ://:/ . It must use https schema. The exception to schema rule is made when localhost or loopback ip 127.0.0.1 is used as the hostname. Prefer to use the loopback IP instead of localhost as hostname to facilitate local testing as recommended in OAuth 2.0 native app specification section 8.3 Janssen Server supports all methods of redirection used by native apps . Use of Private-Use URI (or custom URL) is supported by allowing redirect URI to take the form of reverse DNS name, for example, com.example.app . URLs for loopback interface redirection are also supported. When the client registers multiple redirect URIs (Janssen Server accepts a list of URIs separated by space), be aware that Janssen Server will use these, one by one for validation purposes and the validation stops at the first match. If there are multiple registered redirect_uris, and the client is using pairwise subject identifiers, the Client MUST also register a sector_identifier_uri . This is required to keep the pairwise subject identifiers consistent across various domains under the same administrative control. Refer to pairwise algorithm section of OpenId Connect specification for more details. Cryptography # Janssen Server allows clients to configure static set of keys using JWKS or specify a URI as JWKS URI where client is exposing its key set. For client who can host keys and expose a URI, it is recommended to use JWKS URI instead of static JWKS key set. Using JWKS URI enables client to rotate its cryptographic keys without having to change the client configuration on Janssen Server. Available Algorithms for Encryption and Signing # The client can select algorithms for cryptographic and encryption during client configuration. Janssen Server supports a list of algorithms as listed in response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration Claims that list supported algorithms: id_token_encryption_alg_values_supported id_token_signing_alg_values_supported userinfo_encryption_enc_values_supported userinfo_signing_alg_values_supported userinfo_encryption_alg_values_supported access_token_signing_alg_values_supported request_object_signing_alg_values_supported request_object_encryption_alg_values_supported request_object_encryption_alg_values_supported Recommendations # RSA keys with a minimum 2048 bits if using RSA cryptography Elliptic Curve keys with a minimum of 160 bits if using Elliptic Curve cryptography Client secret should have a minimum of 128 bits if using symmetric key cryptography Sign with PS256 (RSASSA-PSS using SHA-256 and MGF1 with SHA-256) or ES256 (ECDSA using P-256 and SHA-256) Grants # Supported Grant Types # Grant defines how a client interacts with the token endpoint to get the tokens. Janssen Server supports grant types defined by OAuth 2.0, OAuth 2.1, and extension grants defined by other RFCs. A complete list of supported grant types can be found in the response of the Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration Claim grant_types_supported lists all the supported grant types in the response. Configuring Grant Type For Client # Janssen Server will allow requests from a client with grant types that the client is configured to use. Client can be configured to use or not use certain grant types using CLI or TUI tools. Recommendations For Using Grant Types and Flows # Developers should use the grant types based on the ability of the client to protect the client credentials as well as the security profile of the deployment. If the client software is a server-side component that can securely store the client credentials, such a client is called a confidential client. As opposed to that, if the application requesting access token is entirely running on a browser, where it is not possible to store client credentials securely, such a client is called a public client. Along with the grant type to be used, developers also need to choose which flow should be used to get the required tokens. The table below shows grant types and flows that should be used for various use-cases. Client Type Recommended Grant Type Flow Backend App (Example: batch processes) that need to access its own resources client_credentials Client Credentials Server backend of a web-application needs access token authorization_code Authorization Code Web-application that needs user information via id_token on browser and access token on backend authorization_code Hybrid Flow Browser based single page applications or Mobile applications authorization_code Authorization Code with PKCE Browser based single page applications or Mobile applications that only intend to get id_token - Implicit Flow with Form Post Input constrained devices (Example: TV) urn:ietf:params:oauth:grant-type:device_code Device Flow Highly trusted applications where redirect based flows are not feasible to implement password Resource Owner Password Flow Note Certain grant types should not be used together. For example, implicit flow with hybrid flow. Or using authorization code flow with hybrid flow. This allows a downgrade attack from more secure flow to less secure flow. Pre-authorization # If the OAuth authorization prompt should not be displayed to end users, set this field to True. This is useful for SSO to internal clients (not a third party) where there is no need to prompt the person to approve the release of information. Response Types # Client sends response_type request parameter when sending request to authorization endpoint. Using this parameter, the client informs the authorization server of the desired grant. Response type parameter is defined in the OAuth 2.0 framework. Janssen Server supports response types defined by OAuth 2.0, OAuth 2.1.The complete list of supported response types can be found in the response of the Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration Claim response_types_supported lists all the supported grant types in the response. When registering client using dynamic client registration, if the response_type parameter is not specified, it'll default to code . Response Type Recommendations # Avoid using response type token . This response type is deprecated by OAuth 2.1. Grant types allowed for a client determines which response types are permitted in authorization requests. Make sure appropriate grant types are configured in Janssen Server client configuration. Janssen Server will reject authorization requests containing response types not permitted for respective client. Client expiration # Client expiration is set based on dynamicRegistrationExpirationTime AS configuration property or otherwise if dcrForbidExpirationTimeInRequest is false then it is set with Dynamic Client Registration Request via lifetime parameter which expected value in seconds. Client also can be cleaned up by inactivity period which is set via cleanUpInactiveClientAfterHoursOfInactivity AS configuration property. By default it has 0 value (which means it is off). Client activity time is tracked/recorded each time client is used for authentication or authorization (date is written in jansLastAccessTime client attribute). Contribute If you\u2019d like to contribute to this document, get started with the Contribution Guide", "title": "Configuration"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#client-configuration", "text": "This document covers some important configuration elements of client configuration. How these elements are configured for a client has an impact on aspects like client security.", "title": "Client Configuration"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#redirect-uri", "text": "Redirect URI is the most basic and at times the only parameter needed for registering a client. It is defined in OAuth framework and OpenId Connect specification . The client can register a list of URIs as a value for redirect URI parameter. Redirect URI can be any valid URI . Redirect URI should be an absolute URI . For instance, URI should not have wildcard characters. As recommended here Redirect Regex : Janssen Server enables clients to allow redirect URIs that conform to a regular expression(regex) pattern. While validating redirect URIs received in an incoming request, the Janssen Server first looks at the list of statically registered URI as part of Redirect URIs and then checks if any of the redirect URI from the request matches with the regex provided by the client. Great care should be exercised when using regex to ensure that it accurately matches with the intended patterns only. This feature can be turned on or off via feature flag When using client type as web , the redirect URI generally takes the form of ://:/ . It must use https schema. The exception to schema rule is made when localhost or loopback ip 127.0.0.1 is used as the hostname. Prefer to use the loopback IP instead of localhost as hostname to facilitate local testing as recommended in OAuth 2.0 native app specification section 8.3 Janssen Server supports all methods of redirection used by native apps . Use of Private-Use URI (or custom URL) is supported by allowing redirect URI to take the form of reverse DNS name, for example, com.example.app . URLs for loopback interface redirection are also supported. When the client registers multiple redirect URIs (Janssen Server accepts a list of URIs separated by space), be aware that Janssen Server will use these, one by one for validation purposes and the validation stops at the first match. If there are multiple registered redirect_uris, and the client is using pairwise subject identifiers, the Client MUST also register a sector_identifier_uri . This is required to keep the pairwise subject identifiers consistent across various domains under the same administrative control. Refer to pairwise algorithm section of OpenId Connect specification for more details.", "title": "Redirect URI"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#cryptography", "text": "Janssen Server allows clients to configure static set of keys using JWKS or specify a URI as JWKS URI where client is exposing its key set. For client who can host keys and expose a URI, it is recommended to use JWKS URI instead of static JWKS key set. Using JWKS URI enables client to rotate its cryptographic keys without having to change the client configuration on Janssen Server.", "title": "Cryptography"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#available-algorithms-for-encryption-and-signing", "text": "The client can select algorithms for cryptographic and encryption during client configuration. Janssen Server supports a list of algorithms as listed in response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration Claims that list supported algorithms: id_token_encryption_alg_values_supported id_token_signing_alg_values_supported userinfo_encryption_enc_values_supported userinfo_signing_alg_values_supported userinfo_encryption_alg_values_supported access_token_signing_alg_values_supported request_object_signing_alg_values_supported request_object_encryption_alg_values_supported request_object_encryption_alg_values_supported", "title": "Available Algorithms for Encryption and Signing"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#recommendations", "text": "RSA keys with a minimum 2048 bits if using RSA cryptography Elliptic Curve keys with a minimum of 160 bits if using Elliptic Curve cryptography Client secret should have a minimum of 128 bits if using symmetric key cryptography Sign with PS256 (RSASSA-PSS using SHA-256 and MGF1 with SHA-256) or ES256 (ECDSA using P-256 and SHA-256)", "title": "Recommendations"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#grants", "text": "", "title": "Grants"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#supported-grant-types", "text": "Grant defines how a client interacts with the token endpoint to get the tokens. Janssen Server supports grant types defined by OAuth 2.0, OAuth 2.1, and extension grants defined by other RFCs. A complete list of supported grant types can be found in the response of the Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration Claim grant_types_supported lists all the supported grant types in the response.", "title": "Supported Grant Types"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#configuring-grant-type-for-client", "text": "Janssen Server will allow requests from a client with grant types that the client is configured to use. Client can be configured to use or not use certain grant types using CLI or TUI tools.", "title": "Configuring Grant Type For Client"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#recommendations-for-using-grant-types-and-flows", "text": "Developers should use the grant types based on the ability of the client to protect the client credentials as well as the security profile of the deployment. If the client software is a server-side component that can securely store the client credentials, such a client is called a confidential client. As opposed to that, if the application requesting access token is entirely running on a browser, where it is not possible to store client credentials securely, such a client is called a public client. Along with the grant type to be used, developers also need to choose which flow should be used to get the required tokens. The table below shows grant types and flows that should be used for various use-cases. Client Type Recommended Grant Type Flow Backend App (Example: batch processes) that need to access its own resources client_credentials Client Credentials Server backend of a web-application needs access token authorization_code Authorization Code Web-application that needs user information via id_token on browser and access token on backend authorization_code Hybrid Flow Browser based single page applications or Mobile applications authorization_code Authorization Code with PKCE Browser based single page applications or Mobile applications that only intend to get id_token - Implicit Flow with Form Post Input constrained devices (Example: TV) urn:ietf:params:oauth:grant-type:device_code Device Flow Highly trusted applications where redirect based flows are not feasible to implement password Resource Owner Password Flow Note Certain grant types should not be used together. For example, implicit flow with hybrid flow. Or using authorization code flow with hybrid flow. This allows a downgrade attack from more secure flow to less secure flow.", "title": "Recommendations For Using Grant Types and Flows"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#pre-authorization", "text": "If the OAuth authorization prompt should not be displayed to end users, set this field to True. This is useful for SSO to internal clients (not a third party) where there is no need to prompt the person to approve the release of information.", "title": "Pre-authorization"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#response-types", "text": "Client sends response_type request parameter when sending request to authorization endpoint. Using this parameter, the client informs the authorization server of the desired grant. Response type parameter is defined in the OAuth 2.0 framework. Janssen Server supports response types defined by OAuth 2.0, OAuth 2.1.The complete list of supported response types can be found in the response of the Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration Claim response_types_supported lists all the supported grant types in the response. When registering client using dynamic client registration, if the response_type parameter is not specified, it'll default to code .", "title": "Response Types"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#response-type-recommendations", "text": "Avoid using response type token . This response type is deprecated by OAuth 2.1. Grant types allowed for a client determines which response types are permitted in authorization requests. Make sure appropriate grant types are configured in Janssen Server client configuration. Janssen Server will reject authorization requests containing response types not permitted for respective client.", "title": "Response Type Recommendations"}, {"location": "janssen-server/auth-server/client-management/client-configuration/#client-expiration", "text": "Client expiration is set based on dynamicRegistrationExpirationTime AS configuration property or otherwise if dcrForbidExpirationTimeInRequest is false then it is set with Dynamic Client Registration Request via lifetime parameter which expected value in seconds. Client also can be cleaned up by inactivity period which is set via cleanUpInactiveClientAfterHoursOfInactivity AS configuration property. By default it has 0 value (which means it is off). Client activity time is tracked/recorded each time client is used for authentication or authorization (date is written in jansLastAccessTime client attribute). Contribute If you\u2019d like to contribute to this document, get started with the Contribution Guide", "title": "Client expiration"}, {"location": "janssen-server/auth-server/client-management/client-schema/", "tags": ["administration", "client", "schema"], "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Client Schema"}, {"location": "janssen-server/auth-server/client-management/client-schema/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "janssen-server/auth-server/client-management/client-schema/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "janssen-server/auth-server/client-management/client-schema/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/client-management/client-scripts/", "tags": ["administration", "client", "scripts"], "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Client Scripts"}, {"location": "janssen-server/auth-server/client-management/client-scripts/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "janssen-server/auth-server/client-management/client-scripts/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "janssen-server/auth-server/client-management/client-scripts/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/client-management/sector-identifiers/", "tags": ["administration", "client", "sector-identifier"], "text": "Sector Identifier # Janssen Server supports sector identifier URI and pairwise subject IDs for OpenId Connect relying party. As defined in OpenId Connect core specification , the sector identifiers value is used to derive pairwise subject IDs. Janssen Server also supports Sector Identifier URI as part of client configuration. Sector Identifier URI when used with pairwise subject type, enables a group of websites under the same administrative control to receive the same subject identifiers. Sector Identifier URI also allows clients to change the host component of the redirect URI and still keep the subject identifiers unchanged. Configuring Sector Identifier # Janssen Server runs below mentioned checks on value configured for Sector Identifier URI : URI should have a https schema URI should be accessible to Janssen Server and the response should be a valid JSON array of redirect URIs All redirect URI received in response must exist in the list of the redirect URI provided by the client at the registration time Note If the client can not host an endpoint that will be reachable by Sector Identifier URI , then in order to use the pairwise subject IDs, the client must supply a Redirect URI list where URIs have the same host component. The host component value will be used as the sector identifier. Configuration With Pairwise Subject Type # How sector identifier value is used to derive value for the pairwise subject identifier is detailed in the OIDC core specification . Janssen Server allows clients/RPs to set subject type. The public subject type is the default and the client/RP can choose to use the pairwise type. When using TUI, this can be configured from the client configuration screen below: When the pairwise subject type is selected, the value for Sector Identifier URI can be left blank if all redirect URIs have the same host component. If the list of redirect URIs contains multiple host names, providing a Sector Identifier URI is a must. When Sector Identifier URI is provided, the host component of the URI is used as a sector identifier. Configuration Properties # Janssen Server allows customization concerning sector identifiers using the properties below: sectorIdentifierCacheLifetimeInMinutes shareSubjectIdBetweenClientsWithSameSectorId Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Sector Identifiers"}, {"location": "janssen-server/auth-server/client-management/sector-identifiers/#sector-identifier", "text": "Janssen Server supports sector identifier URI and pairwise subject IDs for OpenId Connect relying party. As defined in OpenId Connect core specification , the sector identifiers value is used to derive pairwise subject IDs. Janssen Server also supports Sector Identifier URI as part of client configuration. Sector Identifier URI when used with pairwise subject type, enables a group of websites under the same administrative control to receive the same subject identifiers. Sector Identifier URI also allows clients to change the host component of the redirect URI and still keep the subject identifiers unchanged.", "title": "Sector Identifier"}, {"location": "janssen-server/auth-server/client-management/sector-identifiers/#configuring-sector-identifier", "text": "Janssen Server runs below mentioned checks on value configured for Sector Identifier URI : URI should have a https schema URI should be accessible to Janssen Server and the response should be a valid JSON array of redirect URIs All redirect URI received in response must exist in the list of the redirect URI provided by the client at the registration time Note If the client can not host an endpoint that will be reachable by Sector Identifier URI , then in order to use the pairwise subject IDs, the client must supply a Redirect URI list where URIs have the same host component. The host component value will be used as the sector identifier.", "title": "Configuring Sector Identifier"}, {"location": "janssen-server/auth-server/client-management/sector-identifiers/#configuration-with-pairwise-subject-type", "text": "How sector identifier value is used to derive value for the pairwise subject identifier is detailed in the OIDC core specification . Janssen Server allows clients/RPs to set subject type. The public subject type is the default and the client/RP can choose to use the pairwise type. When using TUI, this can be configured from the client configuration screen below: When the pairwise subject type is selected, the value for Sector Identifier URI can be left blank if all redirect URIs have the same host component. If the list of redirect URIs contains multiple host names, providing a Sector Identifier URI is a must. When Sector Identifier URI is provided, the host component of the URI is used as a sector identifier.", "title": "Configuration With Pairwise Subject Type"}, {"location": "janssen-server/auth-server/client-management/sector-identifiers/#configuration-properties", "text": "Janssen Server allows customization concerning sector identifiers using the properties below: sectorIdentifierCacheLifetimeInMinutes shareSubjectIdBetweenClientsWithSameSectorId", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/client-management/sector-identifiers/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/client-management/software-statements/", "tags": ["administration", "client", "software statements"], "text": "Software Statements # Software Statement is defined by OAuth dynamic client registration RFC 7591 as A digitally signed or MACed JSON Web Token (JWT) that asserts metadata values about the client software. Janssen Server supports usage of software statements during dynamic client registration. Use During Dynamic Client Registration # Janssen Server supports dynamic client registration using software statements. It can be used as software statements or as software statement assertions (SSA) to register client dynamically. Janssen Server also provides SSA endpoint to create and manage SSAs on the server. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Software Statements"}, {"location": "janssen-server/auth-server/client-management/software-statements/#software-statements", "text": "Software Statement is defined by OAuth dynamic client registration RFC 7591 as A digitally signed or MACed JSON Web Token (JWT) that asserts metadata values about the client software. Janssen Server supports usage of software statements during dynamic client registration.", "title": "Software Statements"}, {"location": "janssen-server/auth-server/client-management/software-statements/#use-during-dynamic-client-registration", "text": "Janssen Server supports dynamic client registration using software statements. It can be used as software statements or as software statement assertions (SSA) to register client dynamically. Janssen Server also provides SSA endpoint to create and manage SSAs on the server.", "title": "Use During Dynamic Client Registration"}, {"location": "janssen-server/auth-server/client-management/software-statements/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/crypto/key-generation/", "tags": ["administration", "auth-server", "cryptography", "key generation"], "text": "Key Generation # Generating Cryptographic Keys # The Jans Server is compatible with the Java KeyGenerator to create new cryptographic keys if needed. Backup # Backup jansConfWebKeys attribute data of jansAppConf entity from persistence. Location of this attribute is: o=jans > ou=configuration > ou=jans-auth Backup jans-auth-keys.p12 from /etc/certs/ [N.B] Below if Keystore location is anywhere except /etc/certs/ no need to backup. Key Generate # To get KeyGenerator, run the following command inside the terminal. You can put expiration according to your own policy. For testing purpose we are keeping it 2 days. /opt/jre/bin/java -Dlog4j.defaultInitOverride=true -cp /opt/dist/jans/jans-auth-client-jar-with-dependencies.jar io.jans.as.client.util.KeyGenerator -keystore /etc/certs/jans-auth-keys.p12 -keypasswd -sig_keys RS256 RS384 -enc_keys RSA1_5 RSA-OAEP -key_ops_type ALL -dnname \"CN=jansAuth CA Certificates\" -expiration 2 > /etc/certs/jans-auth-keys.json Note -key_ops_type ALL parameter which sets purpose of the keys generated by key generator. Possible values are: \"connect\" - connect keys (that is what we already have) \"ssa\" - ssa keys which has expiration set to 50 years (it ignores \"expiration\" parameters) \"all\" - generate both \"connect\" and \"ssa\" keys. Usually should be done during initial setup. Lets see our newly generated crypto keys keytool -list -v -keystore /etc/certs/jans-auth-keys.p12 -storetype pkcs12 -storepass The jans implementation of KeyGenerator accepts the following arguments: Argument Description -dnname DN of certificate issuer -key_length Length of hash key -enc_keys Encryption keys to generate (For example: RSA_OAEP, RSA1_5) -expiration Expiration in days -expiration_hours Expiration in hours -h Show help -key_ops_type Purpose of the key, possible values: connect, ssa, all -keypasswd Key Store password -keystore Key Store file (such as /etc/certs/jans-auth-keys.p12) -sig_keys Signature keys to generate. (For example: RS256 RS384 RS512 ES256 ES384 ES512 PS256 PS384 PS512) _keyId Key name suffix -test_prop_file Test property file used for test purpose only", "title": "Key Rotation and Generation"}, {"location": "janssen-server/auth-server/crypto/key-generation/#key-generation", "text": "", "title": "Key Generation"}, {"location": "janssen-server/auth-server/crypto/key-generation/#generating-cryptographic-keys", "text": "The Jans Server is compatible with the Java KeyGenerator to create new cryptographic keys if needed.", "title": "Generating Cryptographic Keys"}, {"location": "janssen-server/auth-server/crypto/key-generation/#backup", "text": "Backup jansConfWebKeys attribute data of jansAppConf entity from persistence. Location of this attribute is: o=jans > ou=configuration > ou=jans-auth Backup jans-auth-keys.p12 from /etc/certs/ [N.B] Below if Keystore location is anywhere except /etc/certs/ no need to backup.", "title": "Backup"}, {"location": "janssen-server/auth-server/crypto/key-generation/#key-generate", "text": "To get KeyGenerator, run the following command inside the terminal. You can put expiration according to your own policy. For testing purpose we are keeping it 2 days. /opt/jre/bin/java -Dlog4j.defaultInitOverride=true -cp /opt/dist/jans/jans-auth-client-jar-with-dependencies.jar io.jans.as.client.util.KeyGenerator -keystore /etc/certs/jans-auth-keys.p12 -keypasswd -sig_keys RS256 RS384 -enc_keys RSA1_5 RSA-OAEP -key_ops_type ALL -dnname \"CN=jansAuth CA Certificates\" -expiration 2 > /etc/certs/jans-auth-keys.json Note -key_ops_type ALL parameter which sets purpose of the keys generated by key generator. Possible values are: \"connect\" - connect keys (that is what we already have) \"ssa\" - ssa keys which has expiration set to 50 years (it ignores \"expiration\" parameters) \"all\" - generate both \"connect\" and \"ssa\" keys. Usually should be done during initial setup. Lets see our newly generated crypto keys keytool -list -v -keystore /etc/certs/jans-auth-keys.p12 -storetype pkcs12 -storepass The jans implementation of KeyGenerator accepts the following arguments: Argument Description -dnname DN of certificate issuer -key_length Length of hash key -enc_keys Encryption keys to generate (For example: RSA_OAEP, RSA1_5) -expiration Expiration in days -expiration_hours Expiration in hours -h Show help -key_ops_type Purpose of the key, possible values: connect, ssa, all -keypasswd Key Store password -keystore Key Store file (such as /etc/certs/jans-auth-keys.p12) -sig_keys Signature keys to generate. (For example: RS256 RS384 RS512 ES256 ES384 ES512 PS256 PS384 PS512) _keyId Key name suffix -test_prop_file Test property file used for test purpose only", "title": "Key Generate"}, {"location": "janssen-server/auth-server/crypto/key-storage/", "tags": ["administration", "auth-server", "cryptography", "key-storage"], "text": "Overview # A Java KeyStore is a file that contains set of aliases. Every alias can contain private key and public key and certificate (additional property info about owner of they key) or only public key and certificate. KeyStore stores the following type of data: - Private Keys; - Public Keys and Certificates; - Secret Keys. KeyStore are used by follow crypto primitives: - asymetric encryption; - digital signature; - symmetric-key algorithm. Janssen Key Storages # Janssen Key Storages # Janssen KeyStore files contain: - Private Keys; - Public Keys and Certificates. Supported Formats of Key Storages # There is some set of standardized KeyStore formats. Janssen applications use follow KeyStore formats: - JKS : Java KeyStore format (proprietary keystore implementation provided by the SUN provider). KeyStore file extensions: .jks , .keystore , .ks ; - PKCS#12 : Personal Information Exchange Syntax, developed by RSA Security. PKCS #12 defines an archive file format for storing many cryptography objects as a single file. KeyStore file extensions: .pkcs12 , .p12 , .pfx ; - BCFKS : Bouncy Castle FIPS Key Store (BCFKS) format supports storage of certificates and private keys using AES-CCM and PBKDF2 algorithms, providing greater security than the standard JKS and PKCS12 implementations. Support for BCFKS format is implemented, using BCFIPS Crypto Provider (https://www.bouncycastle.org/fips_java_roadmap.html). KeyStore file extensions: .bcfks , bcf , bcfips . Installed KeyStore files # Janssen installs KeyStore files in the directory: /etc/certs . Follow Keystore files are used by Janssen: jans-auth-keys.pkcs12 smtp-keys.pkcs12 . jans-auth-keys.pkcs12 # Here is the example of the file: /etc/certs/jans-auth-keys.pkcs12 (list of entries/aliases). keytool -list -v -storetype PKCS12 -keystore /etc/certs/jans-auth-keys.pkcs12 -storepass gNzpzYj5h8i1 Keystore type: PKCS12 Keystore provider: SUN Your keystore contains 31 entries Alias name: connect_3c83ba3a-7a62-49e7-8478-b6d3e242e549_sig_es256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: a81e8386d6774110b12a292a7185c454359b9b6d67a3f5aef587e9395db04166 Valid from: Thu Aug 17 05:21:05 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 4F:FD:3A:E6:61:D8:8E:0F:61:A4:AA:DE:D7:E4:F4:28:5E:EE:39:20 SHA256: 52:15:67:CE:0B:56:1C:CD:CE:C9:39:4C:11:25:B8:73:13:7F:7F:91:BB:E4:1A:3F:48:8D:B0:DC:01:D0:55:3D Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_45c2ce16-6d5b-47d4-be40-c4da48ba49d3_enc_ecdh-es+a128kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: c6fdff1d75c83e32519a94133f9954de22a2aea4fb20ef669bce2221c08cf21f Valid from: Thu Aug 17 05:21:17 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 02:35:E7:FC:50:47:4A:3A:EA:54:EE:92:CA:75:14:D0:A4:E0:0C:45 SHA256: 19:18:8F:68:68:A2:FE:E2:03:BC:E6:2E:87:24:D4:E9:B0:64:D8:44:7D:32:A1:DE:1C:1B:8E:9A:96:3F:32:5A Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_5365f93a-368d-4643-8708-1f4b31b62d47_enc_rsa-oaep Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4d561c04da6bbe50ea15720e6c6898d35793e711eabc9eaa02ad7ed9dafa148b Valid from: Thu Aug 17 05:21:14 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: C7:B4:1A:9A:15:59:E6:45:AC:77:C7:1C:E4:7D:F2:01:EC:4B:59:AD SHA256: 75:11:06:F5:74:D7:B4:C4:0A:57:A5:88:AA:91:F9:57:4C:78:BE:D2:68:1F:0E:AF:0B:CA:16:2F:0F:FE:17:EA Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_5b5da374-2ccb-40ca-8544-9338fe7427ff_sig_rs384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 235fc012863b7291c3370978761a2df6a14796cc601b0fec801b84aa7281b116 Valid from: Thu Aug 17 05:21:03 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 17:33:24:FC:C8:F7:0C:10:7B:0A:30:5B:28:6E:30:AC:13:A5:FD:36 SHA256: E5:05:5A:7E:00:93:2E:8B:3E:AE:91:D5:B5:B5:1A:A9:51:37:FE:72:29:02:83:20:F7:6F:BC:BE:D9:FF:23:7E Signature algorithm name: SHA384withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_6218efa5-197e-49f5-919f-769e6d0aaaec_sig_es512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 304513446352446c48e39017e3044545e0e2a4a71c36899eacfac775606e958d Valid from: Thu Aug 17 05:21:08 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: BE:27:21:18:F4:D4:F6:71:D9:4A:DF:A0:3F:F2:20:76:E1:3E:DD:05 SHA256: 39:FB:09:EC:BD:62:CF:B2:8B:6A:7F:D9:AF:34:64:7C:50:53:E9:E1:14:01:FE:35:B3:B6:03:8D:C6:E3:A3:68 Signature algorithm name: SHA512withECDSA Subject Public Key Algorithm: 521-bit EC (secp521r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_6dbf485d-9d78-49d0-b977-72608ca6b727_sig_rs512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 6310f2b2c5fe5e9354d6352140bedf9efe986ed1c44e68d6dda2ccb46038a14c Valid from: Thu Aug 17 05:21:04 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: E1:78:BA:84:C1:9A:9F:6D:FF:32:1B:F4:D9:4E:AE:AE:23:A9:7F:52 SHA256: EF:C9:B8:40:82:E1:16:B2:7B:2C:E9:E4:47:17:5D:C2:AB:D7:AA:16:EE:11:95:19:F7:52:7C:20:E9:3C:82:91 Signature algorithm name: SHA512withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_7325add6-aaa6-4e4c-bfee-968fa7eba793_sig_ps384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ea8c7dfe1d28f4ff9f686f0eccd5b3d06c50d80b4751713cce0052997027c90f Valid from: Thu Aug 17 05:21:10 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 2D:71:05:C2:5C:5A:50:CD:C7:64:42:69:03:8B:BC:66:6F:F7:E3:2A SHA256: C8:DD:E9:2E:49:91:04:25:29:48:6F:CA:01:0B:6F:17:CA:29:01:C5:4D:2B:AF:3F:A3:25:03:16:12:34:5C:48 Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_829abf33-03f1-4f35-a42e-bca49f992df4_enc_ecdh-es+a256kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 24c62ce19733ddce99573c073bfa890e29d48fbc4a1b4365748fdc0c420b793a Valid from: Thu Aug 17 05:21:18 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 66:FC:23:8E:08:80:2A:C8:74:08:A5:37:C2:6D:8F:68:AB:23:7E:D3 SHA256: 27:7B:A3:5D:E2:F3:6D:15:52:F8:D0:03:0A:7D:D5:B5:32:B9:4E:93:F1:C3:14:98:CA:98:E9:53:84:45:24:4C Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_87933d28-0523-4bd2-a078-a94e32887b04_sig_es256k Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 276ab34dca0e41236756ae0863ebd5e16ea0b209645128f54da0c0dc1c12b64c Valid from: Thu Aug 17 05:21:06 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 53:23:C9:45:4D:D2:29:70:BA:EB:27:EB:83:66:AB:4C:B9:56:9E:83 SHA256: 42:38:33:97:94:ED:58:51:D4:F1:C8:E5:2E:AB:56:05:B0:1D:79:05:33:51:DA:0F:41:E9:E8:59:11:B8:0F:57 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256k1) key (disabled) Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_8d71b86c-5b81-444c-afdf-bb3da4de11e4_sig_rs256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: d8344594dfcce15695d56f30178bc2a38bf3d432756bfd15a69242b3348876dd Valid from: Thu Aug 17 05:21:02 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 5D:75:82:47:5F:80:F9:2F:41:48:CF:01:9F:EE:66:0E:71:37:FA:83 SHA256: D1:92:1C:B1:D0:29:B8:23:73:FA:2E:89:11:2D:F1:8F:5E:2E:FE:B0:80:D1:CC:60:1B:B3:46:82:BA:04:9E:4B Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_9574dff8-1f98-421d-91bf-a760a18be2d2_sig_ps512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: a92efd444e5ea4ac9cd573aa66746b3b90adf465d20ad1abb25d903619f30d6c Valid from: Thu Aug 17 05:21:11 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 29:CF:94:A6:DF:1E:85:59:A4:C1:62:1F:95:AB:67:31:1B:2D:07:6C SHA256: E5:72:DE:3F:C5:96:63:21:AB:82:B4:64:00:E6:19:9B:2C:B0:6D:7C:C6:8C:3D:5B:21:58:6A:3D:D1:CC:54:0D Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_9f70c848-95b6-48fe-a9e9-79b374848e28_enc_rsa1_5 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 46d231ec4e06d52ce1d5a4950f2f91ffc5dd107f5ac7a422225d55fb0004ae26 Valid from: Thu Aug 17 05:21:13 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: A5:82:D0:70:8D:19:A5:5D:DE:4D:CC:52:AE:FB:F4:FF:EF:1A:56:AE SHA256: BB:FA:F0:82:DC:71:84:90:74:C1:33:D9:BC:AE:35:EA:DD:6B:35:95:CE:45:DB:94:E9:9B:E9:39:A4:47:CD:B2 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_a28e886e-090b-42c3-b437-92c91106c0c1_enc_ecdh-es Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4f03840af117cdff5a44ae7f12050ead8934d460134a35088ba5cb3782046b9e Valid from: Thu Aug 17 05:21:16 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 24:00:50:A1:B6:FD:F3:EC:19:95:CE:0F:BA:4E:AE:C5:64:57:F7:0C SHA256: BC:02:64:A2:1E:B6:B3:BD:BE:15:8E:E6:8B:CA:1E:00:A0:13:D9:40:72:7E:93:0F:40:DB:58:B5:56:1B:08:54 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_b7920896-d087-4668-9ee5-66fd3cf56694_enc_rsa-oaep-256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 16d9f709786c58f4343b2fce290cafa4130cb706cae25bcc98970742879d6f1d Valid from: Thu Aug 17 05:21:15 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 28:B3:2B:59:0B:BF:DB:F1:05:63:27:C3:9B:CD:35:14:54:A9:A3:16 SHA256: D9:55:37:5E:2E:AE:48:3E:72:DF:39:E2:0B:D8:79:4F:A3:21:33:EF:DA:DF:24:22:8B:42:08:61:E5:7F:F8:9F Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_c50ce977-00c0-4f4a-8594-1a0bc3935f88_sig_ps256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: c1992dccc3c0635dea6f34ac0f03414cc5f2422883dde72e8c07ea3fba66e865 Valid from: Thu Aug 17 05:21:09 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 65:CC:C8:CF:EA:54:C8:2C:27:31:59:34:5E:69:41:CE:09:37:EB:6B SHA256: C0:C8:68:75:BE:C1:CC:9F:4B:19:5E:23:9B:F4:3B:E8:E3:CE:B7:84:35:29:C0:8C:12:63:1E:B4:81:6B:23:99 Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_e99b9f12-cbf5-4d5e-9156-12f112d7b4a3_sig_eddsa Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 523b5a9b1edbb4ac08435f1f86c7d810be34535e0bc02b073baeab6d9f35ca75 Valid from: Thu Aug 17 05:21:12 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: EB:D3:5F:54:76:44:D1:01:5F:39:EA:0B:2A:08:FB:30:39:50:E8:CC SHA256: 5F:99:18:AE:47:58:FD:7E:E3:B7:B4:F8:57:4A:5B:68:94:F8:DD:2A:02:DE:F7:58:8B:6A:06:D6:E2:CE:3E:ED Signature algorithm name: 1.3.101.112 Subject Public Key Algorithm: 1.3.101.112 key of unknown size Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_eb5d1996-197c-4913-9b10-201b4f371ff7_sig_es384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 613554766f456cae0e968ecf8eaedd5fbb0f04c6ff64202c6b51df34cd7b2a20 Valid from: Thu Aug 17 05:21:07 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 50:FF:D2:51:CA:F6:35:31:C8:12:14:13:36:0B:A5:05:F4:08:3F:97 SHA256: 13:13:32:47:2B:5B:E7:20:EC:4B:77:E8:80:78:E0:84:DB:D9:5E:6D:6C:C6:86:5F:B5:6D:18:99:38:02:B0:32 Signature algorithm name: SHA384withECDSA Subject Public Key Algorithm: 384-bit EC (secp384r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_eddc097c-d9bc-4672-a6ec-2740f8ed99c4_enc_ecdh-es+a192kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 9755e3a9d7404f86161bdfd47dc0f57021aa598b6f4bde9b3929a1303d66baef Valid from: Thu Aug 17 05:21:18 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 20:1F:EE:29:8F:57:B4:FA:29:E8:3F:D6:DD:60:0C:E7:6C:A6:82:54 SHA256: 6A:69:0F:0F:D0:51:5F:83:29:91:BB:E5:A7:63:48:14:F7:D1:C4:18:EE:4D:F2:28:50:63:18:2D:00:94:C7:F4 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_02674321-5bdc-451e-a8e0-12fbc494ab00_sig_ps512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: b544920f9433a67816ac7e022649057deeecd012b68344683ca92a680496b3dc Valid from: Tue Aug 08 06:57:41 CDT 2023 until: Tue Aug 08 06:57:51 CDT 2073 Certificate fingerprints: SHA1: BC:D6:33:CB:95:28:C1:61:D3:EC:D8:10:79:04:C2:22:B8:AF:93:C3 SHA256: 38:0E:40:94:0F:57:1A:B5:9E:AD:A2:7E:B1:AE:ED:42:4C:60:9F:BE:C3:95:51:2A:8B:39:E8:92:90:1C:57:FD Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_18c82db5-7b1c-4bd4-bbe9-7a4e65045fb4_sig_es384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 874585304266014b022a0a321c5d4451bb433305b9137a1ddbdff36504e39d45 Valid from: Tue Aug 08 06:57:38 CDT 2023 until: Tue Aug 08 06:57:48 CDT 2073 Certificate fingerprints: SHA1: 56:79:CC:8A:CB:CF:74:40:31:D6:C3:1D:D8:DC:9B:03:EA:2A:80:89 SHA256: 86:12:AF:78:E6:63:68:B7:9E:B7:70:A3:CF:EF:35:35:FF:46:15:18:97:97:A8:1A:17:79:85:F5:99:9E:61:0A Signature algorithm name: SHA384withECDSA Subject Public Key Algorithm: 384-bit EC (secp384r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_45aa4647-b976-44b8-a94d-025ecced0fe9_enc_rsa-oaep Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4c0fc7cf58866f4beee13c4bf8d12bd084b264f6bedfa484b54034a385d563db Valid from: Tue Aug 08 06:57:45 CDT 2023 until: Tue Aug 08 06:57:55 CDT 2073 Certificate fingerprints: SHA1: 91:48:30:F4:F6:E8:5D:AF:09:79:C2:EC:F9:C6:20:B0:85:3C:02:7E SHA256: 9A:D9:B9:3A:74:AF:99:A9:B2:44:40:1F:8D:E2:C5:72:6E:E3:AA:43:52:A0:8A:1E:61:5A:48:29:57:7E:92:60 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_46f71619-57a9-4c3f-bc15-b91872c828cf_sig_es256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 1187ed8ad9aa4a985c68ba2e0665665a50c970a06e25697360b0c680bda347a3 Valid from: Tue Aug 08 06:57:37 CDT 2023 until: Tue Aug 08 06:57:47 CDT 2073 Certificate fingerprints: SHA1: 9F:F8:EC:FF:83:8A:35:73:B1:AB:89:FF:39:6C:61:C2:76:24:78:37 SHA256: B5:3C:C6:0B:13:D2:C0:E5:3D:E4:7D:66:B4:DA:AA:B1:6E:23:82:07:57:D9:ED:3B:47:28:91:CE:76:EE:62:64 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_51b7ce59-5b1e-4f24-92d0-57edff831f37_sig_es512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: e2dd7decf9dd456bddfa2b9800ac47a4e38ac420cf416c0255820851a8041daf Valid from: Tue Aug 08 06:57:39 CDT 2023 until: Tue Aug 08 06:57:49 CDT 2073 Certificate fingerprints: SHA1: A0:F0:F1:30:66:6B:35:DB:31:AB:8D:D3:E5:58:F4:31:F9:0B:60:E8 SHA256: 5F:CF:BB:E8:6E:FE:A9:F3:D0:09:8E:A5:2A:C7:A8:3B:42:CF:2C:A9:59:D9:A2:86:9B:B2:E3:A1:81:D9:BF:2F Signature algorithm name: SHA512withECDSA Subject Public Key Algorithm: 521-bit EC (secp521r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_5b5666f0-8c3c-46db-8e10-190263885d01_sig_rs512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 88d0bbd883c815c46882674a9e0cb82d4c27bc18231177a262aab71b28e1878 Valid from: Tue Aug 08 06:57:37 CDT 2023 until: Tue Aug 08 06:57:47 CDT 2073 Certificate fingerprints: SHA1: E7:6A:0E:37:85:BD:F9:E2:FD:B2:4B:96:A9:3A:97:91:EE:30:91:53 SHA256: 41:AB:78:C1:91:19:BA:03:13:B1:D6:62:27:1D:6E:0B:53:FC:91:AF:DF:E0:6A:17:61:E5:28:D7:AF:26:BA:E1 Signature algorithm name: SHA512withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_64a3d3e3-503c-4574-a544-ea63bab7f637_enc_ecdh-es Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 58380f109ee41ec443e0e1655e4009f7c782b4e48203464651b92508e37e8cb1 Valid from: Tue Aug 08 06:57:46 CDT 2023 until: Tue Aug 08 06:57:56 CDT 2073 Certificate fingerprints: SHA1: DF:F5:B0:63:1B:B4:A1:81:28:FF:FB:0E:97:78:49:B1:0F:A7:9F:CA SHA256: 4E:72:58:BB:D6:8E:D1:D1:C8:33:32:2F:58:FA:66:8A:26:1E:10:4F:C3:7F:DD:33:6E:39:38:1F:11:A6:EF:7F Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_9b146bc3-5987-414c-9ed6-7ba735b0ab10_sig_rs384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: d62267e39615f334538d64353a48539673b6c8331f3dbb5bdae6b6897541a631 Valid from: Tue Aug 08 06:57:36 CDT 2023 until: Tue Aug 08 06:57:46 CDT 2073 Certificate fingerprints: SHA1: 15:16:97:87:F1:EF:56:12:9E:FB:24:A5:8E:EA:CF:B5:14:9F:81:24 SHA256: 61:C4:F6:D9:8A:54:A9:31:D6:4D:09:B0:D9:0B:36:01:4F:97:53:B8:0D:09:83:01:E3:1B:67:F6:66:F9:05:0B Signature algorithm name: SHA384withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_b037a3dc-b4a9-46a6-8b45-66df01da4f0a_sig_ps256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 8decb6c87779103a3915f71963b3c6d6208c7530a6935215b3f7ef6a2832effb Valid from: Tue Aug 08 06:57:39 CDT 2023 until: Tue Aug 08 06:57:49 CDT 2073 Certificate fingerprints: SHA1: 74:9C:1C:D1:D0:15:92:A4:35:38:C7:12:FC:89:D8:19:29:B7:77:EE SHA256: AF:39:10:89:1E:0B:08:2F:AF:C1:D4:F9:13:73:1D:72:C9:6B:27:EF:8A:F0:66:D6:89:BA:27:CB:1A:90:16:EA Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_b0b8feac-e048-407c-afc8-44008b4e88cb_sig_rs256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 9a20c156e837e5f7d974e6ec9c3da25f30170e775f789c4836d3a00d919fe5e5 Valid from: Tue Aug 08 06:57:36 CDT 2023 until: Tue Aug 08 06:57:46 CDT 2073 Certificate fingerprints: SHA1: 3F:8D:06:04:A6:9F:ED:C1:39:FC:86:40:C4:8C:19:6D:C2:E3:A9:5E SHA256: 3A:1D:39:FC:3C:BD:17:A9:19:A8:45:BB:FD:FE:2A:3A:24:BD:CF:A6:0A:07:17:21:BF:D8:75:84:5E:10:50:16 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_b68c6303-e35e-44f0-b300-e9347e3e3305_sig_ps384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 9bd61db1532aef6c9efa870ccf8cd39caf227037d82c9c0404ba3c95bff46322 Valid from: Tue Aug 08 06:57:40 CDT 2023 until: Tue Aug 08 06:57:50 CDT 2073 Certificate fingerprints: SHA1: 34:29:CF:02:EF:D0:C9:CF:A3:6C:79:A8:B9:36:D8:6F:CB:6F:4D:02 SHA256: 8B:F9:35:9E:86:1E:0A:1C:BC:2E:7C:BB:C9:50:FD:F3:84:51:F6:E8:92:C6:03:2A:0C:EB:74:0C:7D:93:8C:28 Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_cef00de1-5a40-444a-94b4-35d7a290efad_enc_rsa1_5 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 845d78edfaf1912519bddcffffa6aaae9253dd1a087c781132686472763314e2 Valid from: Tue Aug 08 06:57:44 CDT 2023 until: Tue Aug 08 06:57:54 CDT 2073 Certificate fingerprints: SHA1: A4:EC:F5:F6:80:A1:51:FE:DD:65:AC:7E:2E:78:C9:0B:FB:82:33:DC SHA256: C9:62:C8:12:CB:C6:6B:96:C6:D4:E4:9B:1D:0A:8A:E8:47:0E:C6:EA:70:E2:CE:DE:06:C8:77:4D:84:3E:32:33 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_cef05e47-6622-43e7-b61d-1209f0dcdf99_sig_es256k Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ee31a06bda23b8f5a042295d851018c3502a7a8bcd22e2367226c9b5014699a8 Valid from: Tue Aug 08 06:57:38 CDT 2023 until: Tue Aug 08 06:57:48 CDT 2073 Certificate fingerprints: SHA1: 22:EC:A2:90:AA:1C:73:0C:23:B2:AA:F8:B2:CD:35:C2:A4:10:0E:0E SHA256: F2:B4:3B:93:BA:BF:08:E0:58:30:78:03:8F:C0:60:6A:68:E7:68:7D:00:ED:50:B2:9A:8B:21:C3:9F:71:4A:8A Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256k1) key (disabled) Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* All keys are saved in aliases. Every alias has follow format: KeyOpsType + GUID + Use + Algorithm . Where: - KeyOpsType: values Connect | SSA - Use: sig (signature) | enc (encryption) - Algorithm: if Use == sig follow algorithm values are used: RS256 RS384 RS512 ES256 ES256K ES384 ES512 PS256 PS384 PS512 EdDSA if Use == enc follow algorithm values are used: RSA1_5 RSA-OAEP RSA-OAEP-256 ECDH-ES ECDH-ES+A128KW ECDH-ES+A192KW ECDH-ES+A256KW . This Key Store is used for keys/certificates keeping, which are used by the OpenID provider ( jans-auth-server ). smtp-keys.pkcs12 # Here is the example of the file: /etc/certs/smtp-keys.pkcs12 (list of entries/aliases). keytool -list -v -storetype PKCS12 -keystore /etc/certs/smtp-keys.pkcs12 -storepass 6VkIGu0DhnrD Keystore type: PKCS12 Keystore provider: SUN Your keystore contains 1 entry Alias name: smtp_sig_ec256 Creation date: Aug 8, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=SMTP CA Certificate Issuer: CN=SMTP CA Certificate Serial number: 690675c1 Valid from: Tue Aug 08 06:57:12 CDT 2023 until: Fri Aug 05 06:57:12 CDT 2033 Certificate fingerprints: SHA1: 69:77:F6:3E:44:0C:3A:BE:0D:58:02:71:21:72:39:12:54:DB:D7:88 SHA256: E5:E6:CB:BE:76:62:06:2F:A0:C9:49:0F:DD:0D:B1:D1:5B:D6:A2:2C:11:E1:0B:FE:84:67:B0:9D:EB:9B:3A:ED Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 94 D2 A8 BC 8C D7 6F E0 EC BF 2D 92 3A 8D E1 CE ......o...-.:... 0010: 3D 71 CB B0 =q.. ] ] ******************************************* ******************************************* This Key Store stores one alias ( smtp_sig_ec256 ) and it is used for keeping of key/certificate, which is used by email sending functionality - signing of emails. Alias smtp_sig_ec256 contains self-signed certificate. User/Admin can update this KeyStore, adding key/certificate signed by trusted certificate authority (CA) (X-509 PKI). BCFKS KeyStore # Janssen also supports BCFKS format of KeyStore. As a rule this format is used on RHEL/DISA-STIG OS. Access to this type of KeyStore is provided by BCFIPS crypto provider. Modules of cryptoprovider can be found (after installing on RHEL/DISA-STIG OS) here: /var/gluu/dist/app/bc-fips-1.0.2.3.jar /var/gluu/dist/app/bcpkix-fips-1.0.6.jar . Here is example of the BCFKS KeyStore /etc/certs/jans-auth-keys.bcfks (list of entries/aliases): keytool -list -v -keystore /etc/certs/jans-auth-keys.bcfks -storetype BCFKS -providerpath /var/gluu/dist/app/bc-fips-1.0.2.3.jar:/var/gluu/dist/app/bcpkix-fips-1.0.6.jar -provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -storepass CqE4ApXQxz5y Keystore type: BCFKS Keystore provider: BCFIPS Your keystore contains 30 entries Alias name: connect_01906c9d-fed6-48f1-94b8-85446a692f23_enc_rsa1_5 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 3b795840da219a3a7736d0ac0ebc2d632e925dc4b472a02e4b930eb1d5ca278b Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 40:B5:54:85:6B:3B:B1:A9:93:22:6D:91:AA:37:AD:92:A9:B0:5A:A9 SHA256: 06:23:28:01:89:6A:96:EA:A6:3E:EA:27:1D:7C:7A:8A:C7:C9:6D:3F:D0:BF:00:69:35:27:CA:CB:54:75:C6:F1 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_03a3687a-9c3c-4026-abfc-cafef6a76f92_enc_rsa-oaep Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: df266f1918ae93954aaad44cdceab2ac89be1c20ad16245f1567d751db5d6d1a Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 12:12:0B:15:47:A4:C9:AB:44:4A:00:5E:B3:3A:8E:EE:56:70:6F:A7 SHA256: 11:F8:12:47:17:E6:D1:D4:80:1F:66:72:22:2C:49:93:72:DE:EF:5E:58:40:74:5B:AE:66:C4:96:F5:9C:86:13 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_1b960e55-7b8c-4eeb-9379-b933b8a28fb6_enc_ecdh-es+a128kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ad0cb98a5844cfe6a56c944d269aa3ce6379dc8fea2b0752514753935ae3d821 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 28:8F:83:99:24:8E:97:54:5A:B7:41:BB:28:C5:5E:BE:67:38:AF:F4 SHA256: E5:DE:D0:4A:17:5B:F8:5D:32:E4:8B:E2:E6:24:D6:22:50:D6:2E:E1:D4:ED:AB:9A:AB:74:B8:24:8C:16:97:14 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_4260d824-790d-440e-b2e0-a1a4ab813169_sig_es512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 28f4866a894a33bb70dcb33138631be67a3b3b2c2b02c31a24913fde2d6d905d Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: CD:2C:FC:D2:81:A7:26:EA:C1:63:66:C4:AF:43:20:F3:E0:10:B7:41 SHA256: F5:3F:81:C5:B4:CD:8B:7D:B1:E4:83:54:DE:B9:88:F5:1B:3E:DA:CD:A5:93:86:D5:21:E5:3B:3D:42:5C:56:E3 Signature algorithm name: SHA512WITHECDSA Subject Public Key Algorithm: 521-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_464cc164-24ec-43c2-9f13-bca1c7faab11_sig_es256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: d4786313f02f3444beabbac0ed6c307db4af29e3f044edd047e976efe48c2337 Valid from: Thu Aug 17 04:58:50 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 8A:37:4D:12:F9:24:93:DF:1B:59:90:26:3B:1A:95:5A:F8:46:1E:CB SHA256: B4:28:C6:BC:3D:AA:7C:52:5C:E4:22:FC:E7:E0:94:BF:22:66:91:0F:D6:CF:37:6E:C5:54:ED:0C:30:A8:24:CF Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_53cfa5f1-c227-4843-94d0-e5369cd822b0_sig_rs384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 321e23c27b9ec8a65e7e8fe0e64f68aa7390d713bebfa78b17f8962bb28c1d4f Valid from: Thu Aug 17 04:58:50 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 6F:D2:4A:FC:48:1F:F3:B7:CC:13:4B:41:3A:BC:19:C4:85:A9:E9:7C SHA256: 43:80:83:D8:84:75:87:5A:24:D6:6B:AC:EC:0D:45:2E:8F:4A:FC:B4:47:D4:D7:49:E8:06:12:2F:98:7C:91:8F Signature algorithm name: SHA384WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_63e8e482-18ef-410e-bf27-0543a37ac166_sig_ps512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 5fe30fe9ce2b55b6738ec74e0b711c5aa3052ae200fdb9c39bb1392420087d7c Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 1C:27:A5:78:64:EA:01:13:C8:62:D4:4C:93:7A:95:F5:CC:C0:55:BA SHA256: F6:CB:47:52:9D:10:B6:31:FB:C2:1F:CC:30:DD:91:DD:2D:85:C0:44:BB:AB:CA:05:9D:47:05:00:7E:35:73:8B Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_64e35c92-c4f2-4104-81ef-7a366f2dbc38_sig_ps384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 6742d9b42e180b7f4a1f58121dddb02896ff1638e8254bd74415a90e47718e91 Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 75:AB:EA:2C:D7:C8:87:86:7C:FE:0D:23:33:24:CE:FD:75:3E:E5:E0 SHA256: EA:7D:7F:F1:51:00:5F:D8:80:A5:AF:67:F4:E1:84:A2:E5:D0:0A:8F:A3:98:81:29:36:9B:14:DA:59:02:76:AA Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_71a098e5-0fe0-4946-85f8-adf0d6759413_enc_ecdh-es+a256kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 285d3bcd2569a9a0db6091c184e47bf855edf758251749b739267b7f6f9821d3 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: D6:D7:0C:33:6E:A8:A4:54:2A:1F:2D:59:7D:2C:26:0A:EB:B8:AE:41 SHA256: EC:82:5E:A3:66:99:FB:3E:64:B7:47:27:AA:0D:13:C6:64:E1:42:41:B4:8E:F7:B9:23:20:AA:15:1E:F3:22:F7 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_82a7b334-4756-4201-a432-1b181badf695_sig_ps256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: cce1b501329cff10503a96587042b4f37cc994ac3f98c615bab4c9680a53d769 Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 37:1C:A3:F4:A3:04:E4:DC:AA:F3:21:AD:BD:B0:5F:D8:0A:95:7B:29 SHA256: D7:CA:AE:57:A3:43:1E:94:93:ED:C8:34:72:29:DD:CE:02:BD:E5:69:6D:34:D3:7D:26:AE:78:19:4C:E9:BF:CE Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_a3d528cf-fd43-4015-92be-1e644310bbf0_enc_ecdh-es Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: de13b1e646dd2456c3512de303b2fb272108bcdb40c180717077820c07e32f65 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: EF:5E:62:AA:89:31:70:83:35:40:CB:9E:30:23:32:21:12:77:DC:83 SHA256: 88:1A:A2:85:DB:27:46:04:EE:E5:DC:8A:5E:A7:77:CC:36:C5:A6:1A:E7:A1:85:44:2E:E4:A0:91:8A:FD:A4:6F Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_ab2f67de-14fb-4312-89fa-56b2cd70f616_sig_es256k Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: d36755d2a472837ab9fe1dad688b5a1881bff6073d5a494af0275226f236146c Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 8B:FD:A9:75:7C:33:1E:9D:03:47:58:2E:31:D6:49:30:E6:65:6B:A7 SHA256: 5C:E2:28:7B:B0:66:17:A8:14:82:49:14:16:E8:40:B3:B6:C1:5F:90:77:25:A3:C4:A5:25:E6:77:CB:B9:92:91 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_ae7adf42-8f9b-4fe0-bbf1-e9e1016904f5_enc_rsa-oaep-256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 324a9b70a8410e9a02eb596e536cda516f91b250befb22699a909d0b2505e03 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 66:CF:B6:EB:27:10:CC:45:E4:CF:8A:66:71:05:97:22:BA:47:6B:33 SHA256: EF:16:46:1F:C5:0B:41:0B:B4:06:A7:9D:7F:EB:81:76:5F:35:B3:E4:09:67:95:D2:2A:10:D3:2F:59:DA:5D:73 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_b52de13d-33fe-446f-b4fa-6b4ce816c18e_sig_rs256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4d4b22cacdd15cd7bbf339c18ef14fba4ba7b0f13ad37f9452e00404488a880c Valid from: Thu Aug 17 04:58:50 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 47:03:76:16:4B:D9:5C:83:AC:C7:40:10:F3:46:72:86:15:21:6C:CD SHA256: A3:3A:22:75:E2:E5:5B:69:31:FB:E8:59:E0:90:20:60:BC:47:30:9C:5C:5A:B6:97:92:37:71:CD:91:BF:93:78 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_c82cc876-6e92-408c-b519-76d153aad42d_enc_ecdh-es+a192kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 586b7dd9cecd3ef8c58b1bac766caec5d4c2ac8097c1cc4a22a20905ce5f9229 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: E6:3E:62:82:3C:6F:FE:CF:85:FD:6D:82:A9:7D:68:03:38:F0:AB:63 SHA256: 0D:D0:1B:50:02:0B:41:C1:35:CD:A9:7A:E5:10:AA:88:F2:AD:F7:8E:88:C2:3F:68:A9:33:E6:1B:EB:28:71:30 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_d1001a39-29a1-45e4-ae0d-2eee86a83ada_sig_rs512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ba44ac71c5a340aec0d8e0078b059c36a2819915774e8403e1b589a330570833 Valid from: Thu Aug 17 04:58:50 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 49:59:6A:9D:D6:E6:98:05:18:BD:25:1A:C5:C0:2B:A6:C3:3E:36:52 SHA256: DA:57:65:45:A2:16:76:E0:B7:20:DA:82:BF:77:AF:B9:58:D5:E7:D3:2F:1B:D3:BC:48:51:E2:D1:C2:41:A9:FA Signature algorithm name: SHA512WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_f32a5790-4e43-4629-95bd-37b35d7c2e39_sig_es384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 9f0340f5c5cafc1816d2a31c20846fb24d400b3b5194a629ac5baf6db6d15e60 Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 5A:37:CA:6A:27:AB:9F:FC:6B:C3:D3:C6:B4:47:F3:10:F4:C9:F3:B3 SHA256: 11:A4:9C:ED:C0:05:B9:27:89:2B:17:52:11:AA:34:B4:E7:81:08:13:44:7D:93:3A:DE:CA:23:A4:22:F7:05:9F Signature algorithm name: SHA384WITHECDSA Subject Public Key Algorithm: 384-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_0639ba94-902c-4ab6-923a-58137554f667_enc_ecdh-es Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 6fac3869f3fc7297470eee65fc4315328edaf475798d5bbc469de652f3088ca3 Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:01 CDT 2073 Certificate fingerprints: SHA1: 76:B5:F0:B9:1C:88:54:95:5B:11:2A:6A:AE:2E:C3:02:59:1B:07:2C SHA256: 7B:26:2E:36:4B:27:AA:C0:5B:FE:2C:2E:73:B1:75:64:2D:3E:0B:D2:C4:8D:F6:63:12:E8:2E:4C:46:EB:35:4C Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_0d94f183-878c-445d-9917-28357b15c4ee_sig_rs256 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 6d76a82ed166e13ecc2fb0742ebc72f619af0b738baf69438d2aba4262cfdbc4 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: 14:8E:19:D8:8D:FD:68:14:40:72:35:1F:93:2A:7D:83:81:7E:6C:D8 SHA256: CB:69:E0:7C:55:2C:39:56:F8:17:ED:72:96:47:DB:8C:90:1A:1E:2A:E8:33:CA:79:96:DD:44:9F:F7:63:A2:D4 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_1a5ea0d5-0c70-43d2-ab23-e324620b413b_sig_ps512 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 42bd6fbc27749cd6598c54aa0928e93057dc6c6c083c9f73d4e2046c4bac02d0 Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:01 CDT 2073 Certificate fingerprints: SHA1: D3:D1:31:59:33:D1:A6:86:8F:A5:F8:7F:D6:15:44:53:15:99:6D:DC SHA256: 88:95:8C:89:F3:E7:28:E8:3D:9F:47:39:E2:F8:F5:FC:FA:63:71:B3:81:F0:9C:98:7E:A4:0A:FD:7E:7E:E9:AD Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_20d8cce9-0994-4fca-9cfa-f5fbe22eb940_sig_es256k Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: a192c3ca749b78a153cb3134c50fddcdd5dd401dd399b831199ba383eddf355b Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: 4E:94:55:21:15:53:1E:3E:3B:6E:85:B9:BF:A7:4B:46:2A:FB:09:4F SHA256: BA:AB:58:DF:29:7C:5A:D5:31:2F:B9:8B:CE:E9:3F:0B:5B:E5:01:94:CC:A8:9B:41:8B:45:9B:30:D2:63:D6:24 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_33b1591d-1b79-490f-a980-573486ec620b_sig_es384 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ba8a0e96843f1a5181a96d2fc1bdae8b6954bb70b2b5c1fad4895438f4079dd0 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: B8:97:F4:EA:85:14:41:24:8C:DC:E0:8F:66:18:FD:31:7E:0B:5D:D5 SHA256: F3:9E:1F:25:E2:03:3C:7B:69:15:12:01:E2:94:EF:1E:95:43:43:A2:CB:8E:88:88:8A:3D:53:5E:82:E9:0E:9C Signature algorithm name: SHA384WITHECDSA Subject Public Key Algorithm: 384-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_34943497-d9fb-43ca-8ee1-1437e1dcf78e_sig_ps384 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: b45de18f13366f309b100be313770edc6e80942771b08d656e699f7e081e5a69 Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: C4:2D:DB:4D:06:7F:27:89:9A:C0:84:DB:08:BF:0C:75:3B:5B:74:22 SHA256: 77:07:D2:90:7C:AD:7A:F1:D8:EE:C1:84:54:B6:E5:41:7B:BB:C7:8F:64:96:D4:D3:ED:FD:32:F3:6C:10:11:62 Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_475830af-d019-4e04-9fb9-e68f0491284a_sig_es512 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 69e6093118ce51ec5f21477e2946dd023f3c5b70bbde2922b26139b653eddd62 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: 30:9D:95:9C:AE:60:F9:3F:D8:7A:AD:89:9D:AC:5D:7F:05:52:F9:50 SHA256: CA:90:7B:75:3C:99:CE:F2:42:DE:55:38:83:CB:C2:EA:F8:E7:0D:2B:00:5F:57:CF:75:D5:33:C4:5E:32:7E:A7 Signature algorithm name: SHA512WITHECDSA Subject Public Key Algorithm: 521-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_59bb3fe7-bf2a-4244-85a7-dd18785bcac6_enc_rsa-oaep Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 7f3e4adf1e08994ba83a1a59584c6f402e584baaecf1735ff9e0add33d65a423 Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:01 CDT 2073 Certificate fingerprints: SHA1: FC:D7:45:92:F4:60:73:C6:7C:19:DA:AB:EC:54:FF:B4:62:C6:AC:CB SHA256: 66:05:C9:4C:3D:CA:EC:9F:29:06:57:00:A8:90:09:24:17:41:71:DC:1F:8E:7F:E7:5B:39:D8:A1:8B:A3:5A:F2 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_5e0f07d5-1e91-4bd3-bf56-6caa8a137ea6_enc_rsa1_5 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 3449c41d6f7c1b5b7f33c7411a81f41883f6f1fccb64d4e2bc22c130d771a26a Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:01 CDT 2073 Certificate fingerprints: SHA1: 1F:55:2E:62:3D:7E:FE:92:20:13:0D:FC:33:F8:82:B1:B7:BF:9E:7A SHA256: C9:6E:48:AF:F7:8B:04:30:FB:4B:30:47:A2:83:1E:4C:AF:9E:04:E6:07:8A:B1:AE:3B:CD:92:AE:CB:97:D2:EB Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_7d9cec29-697e-4e3e-9991-eba03394b69c_sig_ps256 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 15e7eed8194a80919e9bd699212efca7e50ec9aa3834c6a8e32a7eeb9d9e1da9 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: A5:BE:24:97:EB:F5:0F:18:05:56:02:BF:66:24:98:24:59:82:5A:E6 SHA256: 16:EF:DD:45:17:3B:D7:66:36:14:7E:96:03:1F:51:02:6C:86:1E:19:E7:43:C7:DF:E9:A9:D0:86:9C:A6:7C:B8 Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_96ea824f-f915-4da8-8f76-3b4bf8bdf552_sig_rs384 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4c79afa5d03e2aaab17c90519d59dec517de004f4c9b62960ebf10276b699105 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: E8:F3:5D:16:D0:2C:47:98:D4:F6:98:A1:5F:46:A0:DB:BD:F8:72:30 SHA256: 15:42:A4:30:FE:DB:D8:C4:61:11:A6:8D:10:51:02:64:70:C7:EA:BF:F3:C8:F3:42:03:D9:F8:00:19:F9:7C:28 Signature algorithm name: SHA384WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_b7ee7e46-0a6b-4040-b6b3-a78e9dedc116_sig_rs512 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 82f95026558b89f3ca8c1129d3b79c74ce2ff70bb849991a8305afea974ebe1c Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: D8:45:78:27:94:39:93:57:DF:67:56:3B:06:5C:0C:2A:20:93:F6:0F SHA256: 6D:55:8E:F3:5F:6A:EA:6D:37:71:A9:57:1D:32:98:92:04:5E:8B:4A:C4:FC:E1:ED:B1:7A:D4:11:BF:38:02:80 Signature algorithm name: SHA512WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_b9d65217-ff51-4eab-914f-aeb40eb30bc2_sig_es256 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 632a5f6e2bf5c5dbabf7376718c35b3101fe8a8065a6bf54db3dde5a1825dbf4 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: 7D:51:C1:44:45:EF:6B:71:3D:EF:BC:20:E0:AE:59:4C:3D:16:10:23 SHA256: CC:1C:60:5E:E4:6A:B4:C4:7F:3F:2D:1B:2F:12:B4:79:27:94:3D:1D:D5:FA:C4:11:0E:53:76:DA:52:34:B0:62 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* .", "title": "Key Storage"}, {"location": "janssen-server/auth-server/crypto/key-storage/#overview", "text": "A Java KeyStore is a file that contains set of aliases. Every alias can contain private key and public key and certificate (additional property info about owner of they key) or only public key and certificate. KeyStore stores the following type of data: - Private Keys; - Public Keys and Certificates; - Secret Keys. KeyStore are used by follow crypto primitives: - asymetric encryption; - digital signature; - symmetric-key algorithm.", "title": "Overview"}, {"location": "janssen-server/auth-server/crypto/key-storage/#janssen-key-storages", "text": "", "title": "Janssen Key Storages"}, {"location": "janssen-server/auth-server/crypto/key-storage/#janssen-key-storages_1", "text": "Janssen KeyStore files contain: - Private Keys; - Public Keys and Certificates.", "title": "Janssen Key Storages"}, {"location": "janssen-server/auth-server/crypto/key-storage/#supported-formats-of-key-storages", "text": "There is some set of standardized KeyStore formats. Janssen applications use follow KeyStore formats: - JKS : Java KeyStore format (proprietary keystore implementation provided by the SUN provider). KeyStore file extensions: .jks , .keystore , .ks ; - PKCS#12 : Personal Information Exchange Syntax, developed by RSA Security. PKCS #12 defines an archive file format for storing many cryptography objects as a single file. KeyStore file extensions: .pkcs12 , .p12 , .pfx ; - BCFKS : Bouncy Castle FIPS Key Store (BCFKS) format supports storage of certificates and private keys using AES-CCM and PBKDF2 algorithms, providing greater security than the standard JKS and PKCS12 implementations. Support for BCFKS format is implemented, using BCFIPS Crypto Provider (https://www.bouncycastle.org/fips_java_roadmap.html). KeyStore file extensions: .bcfks , bcf , bcfips .", "title": "Supported Formats of Key Storages"}, {"location": "janssen-server/auth-server/crypto/key-storage/#installed-keystore-files", "text": "Janssen installs KeyStore files in the directory: /etc/certs . Follow Keystore files are used by Janssen: jans-auth-keys.pkcs12 smtp-keys.pkcs12 .", "title": "Installed KeyStore files"}, {"location": "janssen-server/auth-server/crypto/key-storage/#jans-auth-keyspkcs12", "text": "Here is the example of the file: /etc/certs/jans-auth-keys.pkcs12 (list of entries/aliases). keytool -list -v -storetype PKCS12 -keystore /etc/certs/jans-auth-keys.pkcs12 -storepass gNzpzYj5h8i1 Keystore type: PKCS12 Keystore provider: SUN Your keystore contains 31 entries Alias name: connect_3c83ba3a-7a62-49e7-8478-b6d3e242e549_sig_es256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: a81e8386d6774110b12a292a7185c454359b9b6d67a3f5aef587e9395db04166 Valid from: Thu Aug 17 05:21:05 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 4F:FD:3A:E6:61:D8:8E:0F:61:A4:AA:DE:D7:E4:F4:28:5E:EE:39:20 SHA256: 52:15:67:CE:0B:56:1C:CD:CE:C9:39:4C:11:25:B8:73:13:7F:7F:91:BB:E4:1A:3F:48:8D:B0:DC:01:D0:55:3D Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_45c2ce16-6d5b-47d4-be40-c4da48ba49d3_enc_ecdh-es+a128kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: c6fdff1d75c83e32519a94133f9954de22a2aea4fb20ef669bce2221c08cf21f Valid from: Thu Aug 17 05:21:17 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 02:35:E7:FC:50:47:4A:3A:EA:54:EE:92:CA:75:14:D0:A4:E0:0C:45 SHA256: 19:18:8F:68:68:A2:FE:E2:03:BC:E6:2E:87:24:D4:E9:B0:64:D8:44:7D:32:A1:DE:1C:1B:8E:9A:96:3F:32:5A Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_5365f93a-368d-4643-8708-1f4b31b62d47_enc_rsa-oaep Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4d561c04da6bbe50ea15720e6c6898d35793e711eabc9eaa02ad7ed9dafa148b Valid from: Thu Aug 17 05:21:14 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: C7:B4:1A:9A:15:59:E6:45:AC:77:C7:1C:E4:7D:F2:01:EC:4B:59:AD SHA256: 75:11:06:F5:74:D7:B4:C4:0A:57:A5:88:AA:91:F9:57:4C:78:BE:D2:68:1F:0E:AF:0B:CA:16:2F:0F:FE:17:EA Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_5b5da374-2ccb-40ca-8544-9338fe7427ff_sig_rs384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 235fc012863b7291c3370978761a2df6a14796cc601b0fec801b84aa7281b116 Valid from: Thu Aug 17 05:21:03 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 17:33:24:FC:C8:F7:0C:10:7B:0A:30:5B:28:6E:30:AC:13:A5:FD:36 SHA256: E5:05:5A:7E:00:93:2E:8B:3E:AE:91:D5:B5:B5:1A:A9:51:37:FE:72:29:02:83:20:F7:6F:BC:BE:D9:FF:23:7E Signature algorithm name: SHA384withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_6218efa5-197e-49f5-919f-769e6d0aaaec_sig_es512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 304513446352446c48e39017e3044545e0e2a4a71c36899eacfac775606e958d Valid from: Thu Aug 17 05:21:08 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: BE:27:21:18:F4:D4:F6:71:D9:4A:DF:A0:3F:F2:20:76:E1:3E:DD:05 SHA256: 39:FB:09:EC:BD:62:CF:B2:8B:6A:7F:D9:AF:34:64:7C:50:53:E9:E1:14:01:FE:35:B3:B6:03:8D:C6:E3:A3:68 Signature algorithm name: SHA512withECDSA Subject Public Key Algorithm: 521-bit EC (secp521r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_6dbf485d-9d78-49d0-b977-72608ca6b727_sig_rs512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 6310f2b2c5fe5e9354d6352140bedf9efe986ed1c44e68d6dda2ccb46038a14c Valid from: Thu Aug 17 05:21:04 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: E1:78:BA:84:C1:9A:9F:6D:FF:32:1B:F4:D9:4E:AE:AE:23:A9:7F:52 SHA256: EF:C9:B8:40:82:E1:16:B2:7B:2C:E9:E4:47:17:5D:C2:AB:D7:AA:16:EE:11:95:19:F7:52:7C:20:E9:3C:82:91 Signature algorithm name: SHA512withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_7325add6-aaa6-4e4c-bfee-968fa7eba793_sig_ps384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ea8c7dfe1d28f4ff9f686f0eccd5b3d06c50d80b4751713cce0052997027c90f Valid from: Thu Aug 17 05:21:10 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 2D:71:05:C2:5C:5A:50:CD:C7:64:42:69:03:8B:BC:66:6F:F7:E3:2A SHA256: C8:DD:E9:2E:49:91:04:25:29:48:6F:CA:01:0B:6F:17:CA:29:01:C5:4D:2B:AF:3F:A3:25:03:16:12:34:5C:48 Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_829abf33-03f1-4f35-a42e-bca49f992df4_enc_ecdh-es+a256kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 24c62ce19733ddce99573c073bfa890e29d48fbc4a1b4365748fdc0c420b793a Valid from: Thu Aug 17 05:21:18 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 66:FC:23:8E:08:80:2A:C8:74:08:A5:37:C2:6D:8F:68:AB:23:7E:D3 SHA256: 27:7B:A3:5D:E2:F3:6D:15:52:F8:D0:03:0A:7D:D5:B5:32:B9:4E:93:F1:C3:14:98:CA:98:E9:53:84:45:24:4C Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_87933d28-0523-4bd2-a078-a94e32887b04_sig_es256k Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 276ab34dca0e41236756ae0863ebd5e16ea0b209645128f54da0c0dc1c12b64c Valid from: Thu Aug 17 05:21:06 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 53:23:C9:45:4D:D2:29:70:BA:EB:27:EB:83:66:AB:4C:B9:56:9E:83 SHA256: 42:38:33:97:94:ED:58:51:D4:F1:C8:E5:2E:AB:56:05:B0:1D:79:05:33:51:DA:0F:41:E9:E8:59:11:B8:0F:57 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256k1) key (disabled) Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_8d71b86c-5b81-444c-afdf-bb3da4de11e4_sig_rs256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: d8344594dfcce15695d56f30178bc2a38bf3d432756bfd15a69242b3348876dd Valid from: Thu Aug 17 05:21:02 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 5D:75:82:47:5F:80:F9:2F:41:48:CF:01:9F:EE:66:0E:71:37:FA:83 SHA256: D1:92:1C:B1:D0:29:B8:23:73:FA:2E:89:11:2D:F1:8F:5E:2E:FE:B0:80:D1:CC:60:1B:B3:46:82:BA:04:9E:4B Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_9574dff8-1f98-421d-91bf-a760a18be2d2_sig_ps512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: a92efd444e5ea4ac9cd573aa66746b3b90adf465d20ad1abb25d903619f30d6c Valid from: Thu Aug 17 05:21:11 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 29:CF:94:A6:DF:1E:85:59:A4:C1:62:1F:95:AB:67:31:1B:2D:07:6C SHA256: E5:72:DE:3F:C5:96:63:21:AB:82:B4:64:00:E6:19:9B:2C:B0:6D:7C:C6:8C:3D:5B:21:58:6A:3D:D1:CC:54:0D Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_9f70c848-95b6-48fe-a9e9-79b374848e28_enc_rsa1_5 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 46d231ec4e06d52ce1d5a4950f2f91ffc5dd107f5ac7a422225d55fb0004ae26 Valid from: Thu Aug 17 05:21:13 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: A5:82:D0:70:8D:19:A5:5D:DE:4D:CC:52:AE:FB:F4:FF:EF:1A:56:AE SHA256: BB:FA:F0:82:DC:71:84:90:74:C1:33:D9:BC:AE:35:EA:DD:6B:35:95:CE:45:DB:94:E9:9B:E9:39:A4:47:CD:B2 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_a28e886e-090b-42c3-b437-92c91106c0c1_enc_ecdh-es Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4f03840af117cdff5a44ae7f12050ead8934d460134a35088ba5cb3782046b9e Valid from: Thu Aug 17 05:21:16 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 24:00:50:A1:B6:FD:F3:EC:19:95:CE:0F:BA:4E:AE:C5:64:57:F7:0C SHA256: BC:02:64:A2:1E:B6:B3:BD:BE:15:8E:E6:8B:CA:1E:00:A0:13:D9:40:72:7E:93:0F:40:DB:58:B5:56:1B:08:54 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_b7920896-d087-4668-9ee5-66fd3cf56694_enc_rsa-oaep-256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 16d9f709786c58f4343b2fce290cafa4130cb706cae25bcc98970742879d6f1d Valid from: Thu Aug 17 05:21:15 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 28:B3:2B:59:0B:BF:DB:F1:05:63:27:C3:9B:CD:35:14:54:A9:A3:16 SHA256: D9:55:37:5E:2E:AE:48:3E:72:DF:39:E2:0B:D8:79:4F:A3:21:33:EF:DA:DF:24:22:8B:42:08:61:E5:7F:F8:9F Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_c50ce977-00c0-4f4a-8594-1a0bc3935f88_sig_ps256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: c1992dccc3c0635dea6f34ac0f03414cc5f2422883dde72e8c07ea3fba66e865 Valid from: Thu Aug 17 05:21:09 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 65:CC:C8:CF:EA:54:C8:2C:27:31:59:34:5E:69:41:CE:09:37:EB:6B SHA256: C0:C8:68:75:BE:C1:CC:9F:4B:19:5E:23:9B:F4:3B:E8:E3:CE:B7:84:35:29:C0:8C:12:63:1E:B4:81:6B:23:99 Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_e99b9f12-cbf5-4d5e-9156-12f112d7b4a3_sig_eddsa Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 523b5a9b1edbb4ac08435f1f86c7d810be34535e0bc02b073baeab6d9f35ca75 Valid from: Thu Aug 17 05:21:12 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: EB:D3:5F:54:76:44:D1:01:5F:39:EA:0B:2A:08:FB:30:39:50:E8:CC SHA256: 5F:99:18:AE:47:58:FD:7E:E3:B7:B4:F8:57:4A:5B:68:94:F8:DD:2A:02:DE:F7:58:8B:6A:06:D6:E2:CE:3E:ED Signature algorithm name: 1.3.101.112 Subject Public Key Algorithm: 1.3.101.112 key of unknown size Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_eb5d1996-197c-4913-9b10-201b4f371ff7_sig_es384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 613554766f456cae0e968ecf8eaedd5fbb0f04c6ff64202c6b51df34cd7b2a20 Valid from: Thu Aug 17 05:21:07 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 50:FF:D2:51:CA:F6:35:31:C8:12:14:13:36:0B:A5:05:F4:08:3F:97 SHA256: 13:13:32:47:2B:5B:E7:20:EC:4B:77:E8:80:78:E0:84:DB:D9:5E:6D:6C:C6:86:5F:B5:6D:18:99:38:02:B0:32 Signature algorithm name: SHA384withECDSA Subject Public Key Algorithm: 384-bit EC (secp384r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: connect_eddc097c-d9bc-4672-a6ec-2740f8ed99c4_enc_ecdh-es+a192kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 9755e3a9d7404f86161bdfd47dc0f57021aa598b6f4bde9b3929a1303d66baef Valid from: Thu Aug 17 05:21:18 CDT 2023 until: Sat Aug 19 06:21:10 CDT 2023 Certificate fingerprints: SHA1: 20:1F:EE:29:8F:57:B4:FA:29:E8:3F:D6:DD:60:0C:E7:6C:A6:82:54 SHA256: 6A:69:0F:0F:D0:51:5F:83:29:91:BB:E5:A7:63:48:14:F7:D1:C4:18:EE:4D:F2:28:50:63:18:2D:00:94:C7:F4 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_02674321-5bdc-451e-a8e0-12fbc494ab00_sig_ps512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: b544920f9433a67816ac7e022649057deeecd012b68344683ca92a680496b3dc Valid from: Tue Aug 08 06:57:41 CDT 2023 until: Tue Aug 08 06:57:51 CDT 2073 Certificate fingerprints: SHA1: BC:D6:33:CB:95:28:C1:61:D3:EC:D8:10:79:04:C2:22:B8:AF:93:C3 SHA256: 38:0E:40:94:0F:57:1A:B5:9E:AD:A2:7E:B1:AE:ED:42:4C:60:9F:BE:C3:95:51:2A:8B:39:E8:92:90:1C:57:FD Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_18c82db5-7b1c-4bd4-bbe9-7a4e65045fb4_sig_es384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 874585304266014b022a0a321c5d4451bb433305b9137a1ddbdff36504e39d45 Valid from: Tue Aug 08 06:57:38 CDT 2023 until: Tue Aug 08 06:57:48 CDT 2073 Certificate fingerprints: SHA1: 56:79:CC:8A:CB:CF:74:40:31:D6:C3:1D:D8:DC:9B:03:EA:2A:80:89 SHA256: 86:12:AF:78:E6:63:68:B7:9E:B7:70:A3:CF:EF:35:35:FF:46:15:18:97:97:A8:1A:17:79:85:F5:99:9E:61:0A Signature algorithm name: SHA384withECDSA Subject Public Key Algorithm: 384-bit EC (secp384r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_45aa4647-b976-44b8-a94d-025ecced0fe9_enc_rsa-oaep Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4c0fc7cf58866f4beee13c4bf8d12bd084b264f6bedfa484b54034a385d563db Valid from: Tue Aug 08 06:57:45 CDT 2023 until: Tue Aug 08 06:57:55 CDT 2073 Certificate fingerprints: SHA1: 91:48:30:F4:F6:E8:5D:AF:09:79:C2:EC:F9:C6:20:B0:85:3C:02:7E SHA256: 9A:D9:B9:3A:74:AF:99:A9:B2:44:40:1F:8D:E2:C5:72:6E:E3:AA:43:52:A0:8A:1E:61:5A:48:29:57:7E:92:60 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_46f71619-57a9-4c3f-bc15-b91872c828cf_sig_es256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 1187ed8ad9aa4a985c68ba2e0665665a50c970a06e25697360b0c680bda347a3 Valid from: Tue Aug 08 06:57:37 CDT 2023 until: Tue Aug 08 06:57:47 CDT 2073 Certificate fingerprints: SHA1: 9F:F8:EC:FF:83:8A:35:73:B1:AB:89:FF:39:6C:61:C2:76:24:78:37 SHA256: B5:3C:C6:0B:13:D2:C0:E5:3D:E4:7D:66:B4:DA:AA:B1:6E:23:82:07:57:D9:ED:3B:47:28:91:CE:76:EE:62:64 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_51b7ce59-5b1e-4f24-92d0-57edff831f37_sig_es512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: e2dd7decf9dd456bddfa2b9800ac47a4e38ac420cf416c0255820851a8041daf Valid from: Tue Aug 08 06:57:39 CDT 2023 until: Tue Aug 08 06:57:49 CDT 2073 Certificate fingerprints: SHA1: A0:F0:F1:30:66:6B:35:DB:31:AB:8D:D3:E5:58:F4:31:F9:0B:60:E8 SHA256: 5F:CF:BB:E8:6E:FE:A9:F3:D0:09:8E:A5:2A:C7:A8:3B:42:CF:2C:A9:59:D9:A2:86:9B:B2:E3:A1:81:D9:BF:2F Signature algorithm name: SHA512withECDSA Subject Public Key Algorithm: 521-bit EC (secp521r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_5b5666f0-8c3c-46db-8e10-190263885d01_sig_rs512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 88d0bbd883c815c46882674a9e0cb82d4c27bc18231177a262aab71b28e1878 Valid from: Tue Aug 08 06:57:37 CDT 2023 until: Tue Aug 08 06:57:47 CDT 2073 Certificate fingerprints: SHA1: E7:6A:0E:37:85:BD:F9:E2:FD:B2:4B:96:A9:3A:97:91:EE:30:91:53 SHA256: 41:AB:78:C1:91:19:BA:03:13:B1:D6:62:27:1D:6E:0B:53:FC:91:AF:DF:E0:6A:17:61:E5:28:D7:AF:26:BA:E1 Signature algorithm name: SHA512withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_64a3d3e3-503c-4574-a544-ea63bab7f637_enc_ecdh-es Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 58380f109ee41ec443e0e1655e4009f7c782b4e48203464651b92508e37e8cb1 Valid from: Tue Aug 08 06:57:46 CDT 2023 until: Tue Aug 08 06:57:56 CDT 2073 Certificate fingerprints: SHA1: DF:F5:B0:63:1B:B4:A1:81:28:FF:FB:0E:97:78:49:B1:0F:A7:9F:CA SHA256: 4E:72:58:BB:D6:8E:D1:D1:C8:33:32:2F:58:FA:66:8A:26:1E:10:4F:C3:7F:DD:33:6E:39:38:1F:11:A6:EF:7F Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_9b146bc3-5987-414c-9ed6-7ba735b0ab10_sig_rs384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: d62267e39615f334538d64353a48539673b6c8331f3dbb5bdae6b6897541a631 Valid from: Tue Aug 08 06:57:36 CDT 2023 until: Tue Aug 08 06:57:46 CDT 2073 Certificate fingerprints: SHA1: 15:16:97:87:F1:EF:56:12:9E:FB:24:A5:8E:EA:CF:B5:14:9F:81:24 SHA256: 61:C4:F6:D9:8A:54:A9:31:D6:4D:09:B0:D9:0B:36:01:4F:97:53:B8:0D:09:83:01:E3:1B:67:F6:66:F9:05:0B Signature algorithm name: SHA384withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_b037a3dc-b4a9-46a6-8b45-66df01da4f0a_sig_ps256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 8decb6c87779103a3915f71963b3c6d6208c7530a6935215b3f7ef6a2832effb Valid from: Tue Aug 08 06:57:39 CDT 2023 until: Tue Aug 08 06:57:49 CDT 2073 Certificate fingerprints: SHA1: 74:9C:1C:D1:D0:15:92:A4:35:38:C7:12:FC:89:D8:19:29:B7:77:EE SHA256: AF:39:10:89:1E:0B:08:2F:AF:C1:D4:F9:13:73:1D:72:C9:6B:27:EF:8A:F0:66:D6:89:BA:27:CB:1A:90:16:EA Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_b0b8feac-e048-407c-afc8-44008b4e88cb_sig_rs256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 9a20c156e837e5f7d974e6ec9c3da25f30170e775f789c4836d3a00d919fe5e5 Valid from: Tue Aug 08 06:57:36 CDT 2023 until: Tue Aug 08 06:57:46 CDT 2073 Certificate fingerprints: SHA1: 3F:8D:06:04:A6:9F:ED:C1:39:FC:86:40:C4:8C:19:6D:C2:E3:A9:5E SHA256: 3A:1D:39:FC:3C:BD:17:A9:19:A8:45:BB:FD:FE:2A:3A:24:BD:CF:A6:0A:07:17:21:BF:D8:75:84:5E:10:50:16 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_b68c6303-e35e-44f0-b300-e9347e3e3305_sig_ps384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 9bd61db1532aef6c9efa870ccf8cd39caf227037d82c9c0404ba3c95bff46322 Valid from: Tue Aug 08 06:57:40 CDT 2023 until: Tue Aug 08 06:57:50 CDT 2073 Certificate fingerprints: SHA1: 34:29:CF:02:EF:D0:C9:CF:A3:6C:79:A8:B9:36:D8:6F:CB:6F:4D:02 SHA256: 8B:F9:35:9E:86:1E:0A:1C:BC:2E:7C:BB:C9:50:FD:F3:84:51:F6:E8:92:C6:03:2A:0C:EB:74:0C:7D:93:8C:28 Signature algorithm name: RSASSA-PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_cef00de1-5a40-444a-94b4-35d7a290efad_enc_rsa1_5 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 845d78edfaf1912519bddcffffa6aaae9253dd1a087c781132686472763314e2 Valid from: Tue Aug 08 06:57:44 CDT 2023 until: Tue Aug 08 06:57:54 CDT 2073 Certificate fingerprints: SHA1: A4:EC:F5:F6:80:A1:51:FE:DD:65:AC:7E:2E:78:C9:0B:FB:82:33:DC SHA256: C9:62:C8:12:CB:C6:6B:96:C6:D4:E4:9B:1D:0A:8A:E8:47:0E:C6:EA:70:E2:CE:DE:06:C8:77:4D:84:3E:32:33 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* Alias name: ssa_cef05e47-6622-43e7-b61d-1209f0dcdf99_sig_es256k Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ee31a06bda23b8f5a042295d851018c3502a7a8bcd22e2367226c9b5014699a8 Valid from: Tue Aug 08 06:57:38 CDT 2023 until: Tue Aug 08 06:57:48 CDT 2073 Certificate fingerprints: SHA1: 22:EC:A2:90:AA:1C:73:0C:23:B2:AA:F8:B2:CD:35:C2:A4:10:0E:0E SHA256: F2:B4:3B:93:BA:BF:08:E0:58:30:78:03:8F:C0:60:6A:68:E7:68:7D:00:ED:50:B2:9A:8B:21:C3:9F:71:4A:8A Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256k1) key (disabled) Version: 3 Extensions: #1: ObjectId: 2.5.29.37 Criticality=false ExtendedKeyUsages [ serverAuth clientAuth anyExtendedKeyUsage ] ******************************************* ******************************************* All keys are saved in aliases. Every alias has follow format: KeyOpsType + GUID + Use + Algorithm . Where: - KeyOpsType: values Connect | SSA - Use: sig (signature) | enc (encryption) - Algorithm: if Use == sig follow algorithm values are used: RS256 RS384 RS512 ES256 ES256K ES384 ES512 PS256 PS384 PS512 EdDSA if Use == enc follow algorithm values are used: RSA1_5 RSA-OAEP RSA-OAEP-256 ECDH-ES ECDH-ES+A128KW ECDH-ES+A192KW ECDH-ES+A256KW . This Key Store is used for keys/certificates keeping, which are used by the OpenID provider ( jans-auth-server ).", "title": "jans-auth-keys.pkcs12"}, {"location": "janssen-server/auth-server/crypto/key-storage/#smtp-keyspkcs12", "text": "Here is the example of the file: /etc/certs/smtp-keys.pkcs12 (list of entries/aliases). keytool -list -v -storetype PKCS12 -keystore /etc/certs/smtp-keys.pkcs12 -storepass 6VkIGu0DhnrD Keystore type: PKCS12 Keystore provider: SUN Your keystore contains 1 entry Alias name: smtp_sig_ec256 Creation date: Aug 8, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=SMTP CA Certificate Issuer: CN=SMTP CA Certificate Serial number: 690675c1 Valid from: Tue Aug 08 06:57:12 CDT 2023 until: Fri Aug 05 06:57:12 CDT 2033 Certificate fingerprints: SHA1: 69:77:F6:3E:44:0C:3A:BE:0D:58:02:71:21:72:39:12:54:DB:D7:88 SHA256: E5:E6:CB:BE:76:62:06:2F:A0:C9:49:0F:DD:0D:B1:D1:5B:D6:A2:2C:11:E1:0B:FE:84:67:B0:9D:EB:9B:3A:ED Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC (secp256r1) key Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 94 D2 A8 BC 8C D7 6F E0 EC BF 2D 92 3A 8D E1 CE ......o...-.:... 0010: 3D 71 CB B0 =q.. ] ] ******************************************* ******************************************* This Key Store stores one alias ( smtp_sig_ec256 ) and it is used for keeping of key/certificate, which is used by email sending functionality - signing of emails. Alias smtp_sig_ec256 contains self-signed certificate. User/Admin can update this KeyStore, adding key/certificate signed by trusted certificate authority (CA) (X-509 PKI).", "title": "smtp-keys.pkcs12"}, {"location": "janssen-server/auth-server/crypto/key-storage/#bcfks-keystore", "text": "Janssen also supports BCFKS format of KeyStore. As a rule this format is used on RHEL/DISA-STIG OS. Access to this type of KeyStore is provided by BCFIPS crypto provider. Modules of cryptoprovider can be found (after installing on RHEL/DISA-STIG OS) here: /var/gluu/dist/app/bc-fips-1.0.2.3.jar /var/gluu/dist/app/bcpkix-fips-1.0.6.jar . Here is example of the BCFKS KeyStore /etc/certs/jans-auth-keys.bcfks (list of entries/aliases): keytool -list -v -keystore /etc/certs/jans-auth-keys.bcfks -storetype BCFKS -providerpath /var/gluu/dist/app/bc-fips-1.0.2.3.jar:/var/gluu/dist/app/bcpkix-fips-1.0.6.jar -provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -storepass CqE4ApXQxz5y Keystore type: BCFKS Keystore provider: BCFIPS Your keystore contains 30 entries Alias name: connect_01906c9d-fed6-48f1-94b8-85446a692f23_enc_rsa1_5 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 3b795840da219a3a7736d0ac0ebc2d632e925dc4b472a02e4b930eb1d5ca278b Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 40:B5:54:85:6B:3B:B1:A9:93:22:6D:91:AA:37:AD:92:A9:B0:5A:A9 SHA256: 06:23:28:01:89:6A:96:EA:A6:3E:EA:27:1D:7C:7A:8A:C7:C9:6D:3F:D0:BF:00:69:35:27:CA:CB:54:75:C6:F1 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_03a3687a-9c3c-4026-abfc-cafef6a76f92_enc_rsa-oaep Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: df266f1918ae93954aaad44cdceab2ac89be1c20ad16245f1567d751db5d6d1a Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 12:12:0B:15:47:A4:C9:AB:44:4A:00:5E:B3:3A:8E:EE:56:70:6F:A7 SHA256: 11:F8:12:47:17:E6:D1:D4:80:1F:66:72:22:2C:49:93:72:DE:EF:5E:58:40:74:5B:AE:66:C4:96:F5:9C:86:13 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_1b960e55-7b8c-4eeb-9379-b933b8a28fb6_enc_ecdh-es+a128kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ad0cb98a5844cfe6a56c944d269aa3ce6379dc8fea2b0752514753935ae3d821 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 28:8F:83:99:24:8E:97:54:5A:B7:41:BB:28:C5:5E:BE:67:38:AF:F4 SHA256: E5:DE:D0:4A:17:5B:F8:5D:32:E4:8B:E2:E6:24:D6:22:50:D6:2E:E1:D4:ED:AB:9A:AB:74:B8:24:8C:16:97:14 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_4260d824-790d-440e-b2e0-a1a4ab813169_sig_es512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 28f4866a894a33bb70dcb33138631be67a3b3b2c2b02c31a24913fde2d6d905d Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: CD:2C:FC:D2:81:A7:26:EA:C1:63:66:C4:AF:43:20:F3:E0:10:B7:41 SHA256: F5:3F:81:C5:B4:CD:8B:7D:B1:E4:83:54:DE:B9:88:F5:1B:3E:DA:CD:A5:93:86:D5:21:E5:3B:3D:42:5C:56:E3 Signature algorithm name: SHA512WITHECDSA Subject Public Key Algorithm: 521-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_464cc164-24ec-43c2-9f13-bca1c7faab11_sig_es256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: d4786313f02f3444beabbac0ed6c307db4af29e3f044edd047e976efe48c2337 Valid from: Thu Aug 17 04:58:50 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 8A:37:4D:12:F9:24:93:DF:1B:59:90:26:3B:1A:95:5A:F8:46:1E:CB SHA256: B4:28:C6:BC:3D:AA:7C:52:5C:E4:22:FC:E7:E0:94:BF:22:66:91:0F:D6:CF:37:6E:C5:54:ED:0C:30:A8:24:CF Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_53cfa5f1-c227-4843-94d0-e5369cd822b0_sig_rs384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 321e23c27b9ec8a65e7e8fe0e64f68aa7390d713bebfa78b17f8962bb28c1d4f Valid from: Thu Aug 17 04:58:50 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 6F:D2:4A:FC:48:1F:F3:B7:CC:13:4B:41:3A:BC:19:C4:85:A9:E9:7C SHA256: 43:80:83:D8:84:75:87:5A:24:D6:6B:AC:EC:0D:45:2E:8F:4A:FC:B4:47:D4:D7:49:E8:06:12:2F:98:7C:91:8F Signature algorithm name: SHA384WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_63e8e482-18ef-410e-bf27-0543a37ac166_sig_ps512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 5fe30fe9ce2b55b6738ec74e0b711c5aa3052ae200fdb9c39bb1392420087d7c Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 1C:27:A5:78:64:EA:01:13:C8:62:D4:4C:93:7A:95:F5:CC:C0:55:BA SHA256: F6:CB:47:52:9D:10:B6:31:FB:C2:1F:CC:30:DD:91:DD:2D:85:C0:44:BB:AB:CA:05:9D:47:05:00:7E:35:73:8B Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_64e35c92-c4f2-4104-81ef-7a366f2dbc38_sig_ps384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 6742d9b42e180b7f4a1f58121dddb02896ff1638e8254bd74415a90e47718e91 Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 75:AB:EA:2C:D7:C8:87:86:7C:FE:0D:23:33:24:CE:FD:75:3E:E5:E0 SHA256: EA:7D:7F:F1:51:00:5F:D8:80:A5:AF:67:F4:E1:84:A2:E5:D0:0A:8F:A3:98:81:29:36:9B:14:DA:59:02:76:AA Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_71a098e5-0fe0-4946-85f8-adf0d6759413_enc_ecdh-es+a256kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 285d3bcd2569a9a0db6091c184e47bf855edf758251749b739267b7f6f9821d3 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: D6:D7:0C:33:6E:A8:A4:54:2A:1F:2D:59:7D:2C:26:0A:EB:B8:AE:41 SHA256: EC:82:5E:A3:66:99:FB:3E:64:B7:47:27:AA:0D:13:C6:64:E1:42:41:B4:8E:F7:B9:23:20:AA:15:1E:F3:22:F7 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_82a7b334-4756-4201-a432-1b181badf695_sig_ps256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: cce1b501329cff10503a96587042b4f37cc994ac3f98c615bab4c9680a53d769 Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 37:1C:A3:F4:A3:04:E4:DC:AA:F3:21:AD:BD:B0:5F:D8:0A:95:7B:29 SHA256: D7:CA:AE:57:A3:43:1E:94:93:ED:C8:34:72:29:DD:CE:02:BD:E5:69:6D:34:D3:7D:26:AE:78:19:4C:E9:BF:CE Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_a3d528cf-fd43-4015-92be-1e644310bbf0_enc_ecdh-es Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: de13b1e646dd2456c3512de303b2fb272108bcdb40c180717077820c07e32f65 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: EF:5E:62:AA:89:31:70:83:35:40:CB:9E:30:23:32:21:12:77:DC:83 SHA256: 88:1A:A2:85:DB:27:46:04:EE:E5:DC:8A:5E:A7:77:CC:36:C5:A6:1A:E7:A1:85:44:2E:E4:A0:91:8A:FD:A4:6F Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_ab2f67de-14fb-4312-89fa-56b2cd70f616_sig_es256k Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: d36755d2a472837ab9fe1dad688b5a1881bff6073d5a494af0275226f236146c Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 8B:FD:A9:75:7C:33:1E:9D:03:47:58:2E:31:D6:49:30:E6:65:6B:A7 SHA256: 5C:E2:28:7B:B0:66:17:A8:14:82:49:14:16:E8:40:B3:B6:C1:5F:90:77:25:A3:C4:A5:25:E6:77:CB:B9:92:91 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_ae7adf42-8f9b-4fe0-bbf1-e9e1016904f5_enc_rsa-oaep-256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 324a9b70a8410e9a02eb596e536cda516f91b250befb22699a909d0b2505e03 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 66:CF:B6:EB:27:10:CC:45:E4:CF:8A:66:71:05:97:22:BA:47:6B:33 SHA256: EF:16:46:1F:C5:0B:41:0B:B4:06:A7:9D:7F:EB:81:76:5F:35:B3:E4:09:67:95:D2:2A:10:D3:2F:59:DA:5D:73 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_b52de13d-33fe-446f-b4fa-6b4ce816c18e_sig_rs256 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4d4b22cacdd15cd7bbf339c18ef14fba4ba7b0f13ad37f9452e00404488a880c Valid from: Thu Aug 17 04:58:50 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 47:03:76:16:4B:D9:5C:83:AC:C7:40:10:F3:46:72:86:15:21:6C:CD SHA256: A3:3A:22:75:E2:E5:5B:69:31:FB:E8:59:E0:90:20:60:BC:47:30:9C:5C:5A:B6:97:92:37:71:CD:91:BF:93:78 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_c82cc876-6e92-408c-b519-76d153aad42d_enc_ecdh-es+a192kw Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 586b7dd9cecd3ef8c58b1bac766caec5d4c2ac8097c1cc4a22a20905ce5f9229 Valid from: Thu Aug 17 04:58:52 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: E6:3E:62:82:3C:6F:FE:CF:85:FD:6D:82:A9:7D:68:03:38:F0:AB:63 SHA256: 0D:D0:1B:50:02:0B:41:C1:35:CD:A9:7A:E5:10:AA:88:F2:AD:F7:8E:88:C2:3F:68:A9:33:E6:1B:EB:28:71:30 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: connect_d1001a39-29a1-45e4-ae0d-2eee86a83ada_sig_rs512 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ba44ac71c5a340aec0d8e0078b059c36a2819915774e8403e1b589a330570833 Valid from: Thu Aug 17 04:58:50 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 49:59:6A:9D:D6:E6:98:05:18:BD:25:1A:C5:C0:2B:A6:C3:3E:36:52 SHA256: DA:57:65:45:A2:16:76:E0:B7:20:DA:82:BF:77:AF:B9:58:D5:E7:D3:2F:1B:D3:BC:48:51:E2:D1:C2:41:A9:FA Signature algorithm name: SHA512WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: connect_f32a5790-4e43-4629-95bd-37b35d7c2e39_sig_es384 Creation date: Aug 17, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 9f0340f5c5cafc1816d2a31c20846fb24d400b3b5194a629ac5baf6db6d15e60 Valid from: Thu Aug 17 04:58:51 CDT 2023 until: Sat Aug 19 05:58:59 CDT 2023 Certificate fingerprints: SHA1: 5A:37:CA:6A:27:AB:9F:FC:6B:C3:D3:C6:B4:47:F3:10:F4:C9:F3:B3 SHA256: 11:A4:9C:ED:C0:05:B9:27:89:2B:17:52:11:AA:34:B4:E7:81:08:13:44:7D:93:3A:DE:CA:23:A4:22:F7:05:9F Signature algorithm name: SHA384WITHECDSA Subject Public Key Algorithm: 384-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_0639ba94-902c-4ab6-923a-58137554f667_enc_ecdh-es Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 6fac3869f3fc7297470eee65fc4315328edaf475798d5bbc469de652f3088ca3 Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:01 CDT 2073 Certificate fingerprints: SHA1: 76:B5:F0:B9:1C:88:54:95:5B:11:2A:6A:AE:2E:C3:02:59:1B:07:2C SHA256: 7B:26:2E:36:4B:27:AA:C0:5B:FE:2C:2E:73:B1:75:64:2D:3E:0B:D2:C4:8D:F6:63:12:E8:2E:4C:46:EB:35:4C Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_0d94f183-878c-445d-9917-28357b15c4ee_sig_rs256 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 6d76a82ed166e13ecc2fb0742ebc72f619af0b738baf69438d2aba4262cfdbc4 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: 14:8E:19:D8:8D:FD:68:14:40:72:35:1F:93:2A:7D:83:81:7E:6C:D8 SHA256: CB:69:E0:7C:55:2C:39:56:F8:17:ED:72:96:47:DB:8C:90:1A:1E:2A:E8:33:CA:79:96:DD:44:9F:F7:63:A2:D4 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_1a5ea0d5-0c70-43d2-ab23-e324620b413b_sig_ps512 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 42bd6fbc27749cd6598c54aa0928e93057dc6c6c083c9f73d4e2046c4bac02d0 Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:01 CDT 2073 Certificate fingerprints: SHA1: D3:D1:31:59:33:D1:A6:86:8F:A5:F8:7F:D6:15:44:53:15:99:6D:DC SHA256: 88:95:8C:89:F3:E7:28:E8:3D:9F:47:39:E2:F8:F5:FC:FA:63:71:B3:81:F0:9C:98:7E:A4:0A:FD:7E:7E:E9:AD Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_20d8cce9-0994-4fca-9cfa-f5fbe22eb940_sig_es256k Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: a192c3ca749b78a153cb3134c50fddcdd5dd401dd399b831199ba383eddf355b Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: 4E:94:55:21:15:53:1E:3E:3B:6E:85:B9:BF:A7:4B:46:2A:FB:09:4F SHA256: BA:AB:58:DF:29:7C:5A:D5:31:2F:B9:8B:CE:E9:3F:0B:5B:E5:01:94:CC:A8:9B:41:8B:45:9B:30:D2:63:D6:24 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_33b1591d-1b79-490f-a980-573486ec620b_sig_es384 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: ba8a0e96843f1a5181a96d2fc1bdae8b6954bb70b2b5c1fad4895438f4079dd0 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: B8:97:F4:EA:85:14:41:24:8C:DC:E0:8F:66:18:FD:31:7E:0B:5D:D5 SHA256: F3:9E:1F:25:E2:03:3C:7B:69:15:12:01:E2:94:EF:1E:95:43:43:A2:CB:8E:88:88:8A:3D:53:5E:82:E9:0E:9C Signature algorithm name: SHA384WITHECDSA Subject Public Key Algorithm: 384-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_34943497-d9fb-43ca-8ee1-1437e1dcf78e_sig_ps384 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: b45de18f13366f309b100be313770edc6e80942771b08d656e699f7e081e5a69 Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: C4:2D:DB:4D:06:7F:27:89:9A:C0:84:DB:08:BF:0C:75:3B:5B:74:22 SHA256: 77:07:D2:90:7C:AD:7A:F1:D8:EE:C1:84:54:B6:E5:41:7B:BB:C7:8F:64:96:D4:D3:ED:FD:32:F3:6C:10:11:62 Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_475830af-d019-4e04-9fb9-e68f0491284a_sig_es512 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 69e6093118ce51ec5f21477e2946dd023f3c5b70bbde2922b26139b653eddd62 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: 30:9D:95:9C:AE:60:F9:3F:D8:7A:AD:89:9D:AC:5D:7F:05:52:F9:50 SHA256: CA:90:7B:75:3C:99:CE:F2:42:DE:55:38:83:CB:C2:EA:F8:E7:0D:2B:00:5F:57:CF:75:D5:33:C4:5E:32:7E:A7 Signature algorithm name: SHA512WITHECDSA Subject Public Key Algorithm: 521-bit EC key Version: 3 ******************************************* ******************************************* Alias name: ssa_59bb3fe7-bf2a-4244-85a7-dd18785bcac6_enc_rsa-oaep Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 7f3e4adf1e08994ba83a1a59584c6f402e584baaecf1735ff9e0add33d65a423 Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:01 CDT 2073 Certificate fingerprints: SHA1: FC:D7:45:92:F4:60:73:C6:7C:19:DA:AB:EC:54:FF:B4:62:C6:AC:CB SHA256: 66:05:C9:4C:3D:CA:EC:9F:29:06:57:00:A8:90:09:24:17:41:71:DC:1F:8E:7F:E7:5B:39:D8:A1:8B:A3:5A:F2 Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_5e0f07d5-1e91-4bd3-bf56-6caa8a137ea6_enc_rsa1_5 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 3449c41d6f7c1b5b7f33c7411a81f41883f6f1fccb64d4e2bc22c130d771a26a Valid from: Thu Aug 10 18:20:51 CDT 2023 until: Thu Aug 10 18:21:01 CDT 2073 Certificate fingerprints: SHA1: 1F:55:2E:62:3D:7E:FE:92:20:13:0D:FC:33:F8:82:B1:B7:BF:9E:7A SHA256: C9:6E:48:AF:F7:8B:04:30:FB:4B:30:47:A2:83:1E:4C:AF:9E:04:E6:07:8A:B1:AE:3B:CD:92:AE:CB:97:D2:EB Signature algorithm name: SHA256WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_7d9cec29-697e-4e3e-9991-eba03394b69c_sig_ps256 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 15e7eed8194a80919e9bd699212efca7e50ec9aa3834c6a8e32a7eeb9d9e1da9 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: A5:BE:24:97:EB:F5:0F:18:05:56:02:BF:66:24:98:24:59:82:5A:E6 SHA256: 16:EF:DD:45:17:3B:D7:66:36:14:7E:96:03:1F:51:02:6C:86:1E:19:E7:43:C7:DF:E9:A9:D0:86:9C:A6:7C:B8 Signature algorithm name: PSS Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_96ea824f-f915-4da8-8f76-3b4bf8bdf552_sig_rs384 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 4c79afa5d03e2aaab17c90519d59dec517de004f4c9b62960ebf10276b699105 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: E8:F3:5D:16:D0:2C:47:98:D4:F6:98:A1:5F:46:A0:DB:BD:F8:72:30 SHA256: 15:42:A4:30:FE:DB:D8:C4:61:11:A6:8D:10:51:02:64:70:C7:EA:BF:F3:C8:F3:42:03:D9:F8:00:19:F9:7C:28 Signature algorithm name: SHA384WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_b7ee7e46-0a6b-4040-b6b3-a78e9dedc116_sig_rs512 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 82f95026558b89f3ca8c1129d3b79c74ce2ff70bb849991a8305afea974ebe1c Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: D8:45:78:27:94:39:93:57:DF:67:56:3B:06:5C:0C:2A:20:93:F6:0F SHA256: 6D:55:8E:F3:5F:6A:EA:6D:37:71:A9:57:1D:32:98:92:04:5E:8B:4A:C4:FC:E1:ED:B1:7A:D4:11:BF:38:02:80 Signature algorithm name: SHA512WITHRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 ******************************************* ******************************************* Alias name: ssa_b9d65217-ff51-4eab-914f-aeb40eb30bc2_sig_es256 Creation date: Aug 10, 2023 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Jans Auth CA Certificates Issuer: CN=Jans Auth CA Certificates Serial number: 632a5f6e2bf5c5dbabf7376718c35b3101fe8a8065a6bf54db3dde5a1825dbf4 Valid from: Thu Aug 10 18:20:50 CDT 2023 until: Thu Aug 10 18:21:00 CDT 2073 Certificate fingerprints: SHA1: 7D:51:C1:44:45:EF:6B:71:3D:EF:BC:20:E0:AE:59:4C:3D:16:10:23 SHA256: CC:1C:60:5E:E4:6A:B4:C4:7F:3F:2D:1B:2F:12:B4:79:27:94:3D:1D:D5:FA:C4:11:0E:53:76:DA:52:34:B0:62 Signature algorithm name: SHA256WITHECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 ******************************************* ******************************************* .", "title": "BCFKS KeyStore"}, {"location": "janssen-server/auth-server/crypto/keys/", "tags": ["administration", "auth-server", "cryptography", "keys"], "text": "Overview # Janssen uses keys for signing and encryption, primarily concerning JSON documents. Janssen supports several signing and encryption algorithms in salted and unsalted, to fit a variety of business needs. If other algorithms are necessary, Janssen supports them via interception scripts. Keys # A key is a piece of information, usually a string of numbers or letters that are stored in a file, which, when processed through a cryptographic algorithm, can encode or decode cryptographic data. In Janssen we use keys for creating token like id_token , access_token . access_token : Access tokens are what the OAuth client uses to make requests to an API. The access token is meant to be read and validated by the API. id_token : An ID token is an artifact that proves that the user has been authenticated. It was introduced by OpenID Connect (OIDC) , an open standard for authentication used by Janssen. It contains information about what happened when a user authenticated, and is intended to be read by the OAuth client. The ID token may also contain information about the user such as their name or email address, although that is not a requirement of an ID token. Jans server JSON objects of public key # Gets list of JSON Web Key (JWK) used by server. JWK is a JSON data structure that represents a set of public keys as a JSON object. Browse below endpoint to know more about public keys used by server. https:///jans-auth/restv1/jwks Let's see some example of JWT public keys used in janssen. When jwk is expired, it is archived and can be access by following url: https:///jans-auth/restv1/jwks/archived/{kid} More info about archived jwks can be found here Example-1 # The \"kty\" (Key Type) of this key is RSA. This key is \"use\" (Public Key Use) for \"sig\" (Signature) on data. The \"alg\" (Algorithm) intended with this key is \"RS256\". { \"name\" : \"Connect RS256 Sign Key\" \"descr\" : \"Signature Key: RSA RSASSA-PKCS1-v1_5 using SHA-256\", ... } Example-2 # The \"kty\" (Key Type) of this key is RSA. This key is \"use\" (Public Key Use) for \"sig\" (Signature) on data. The \"alg\" (Algorithm) intended with this key is \"RS384\". { \"name\" : \"Connect RS384 Sign Key\", \"descr\" : \"Signature Key: RSA RSASSA-PKCS1-v1_5 using SHA-384\", ... } Example-3 # The \"kty\" (Key Type) of this key is RSA. This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"RS512\". { \"name\" : \"Connect RS512 Sign Key\", \"descr\" : \"Signature Key: RSA RSASSA-PKCS1-v1_5 using SHA-512\", ... } Example-4 # The \"kty\" (Key Type) of this key is \"EC\" (Ellliptic Curve). This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"ES256\". { \"name\" : \"Connect ES256 Sign Key\", \"descr\" : \"Signature Key: ECDSA using P-256 (secp256r1) and SHA-256\", ... } Example-5 # The \"kty\" (Key Type) of this key is \"EC\" (Ellliptic Curve). This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"ES256K\". { \"name\" : \"Connect ES256 Sign Key\", \"descr\" : \"Signature Key: ECDSA using P-256 (secp256r1) and SHA-256\", ... } Example-6 # The \"kty\" (Key Type) of this key is \"EC\" (Ellliptic Curve). This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"ES256K\". { \"name\" : \"Connect ES384 Sign Key\", \"descr\" : \"Signature Key: ECDSA using P-384 (secp384r1) and SHA-384\", ... } Example-7 # The \"kty\" (Key Type) of this key is \"EC\" (Ellliptic Curve). This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"ES512\". { \"name\" : \"Connect ES512 Sign Key\", \"descr\" : \"Signature Key: ECDSA using P-521 (secp521r1) and SHA-512\", ... } Example-8 # The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"PS256\". { \"name\" : \"Connect PS256 Sign Key\", \"descr\" : \"Signature Key: RSASSA-PSS using SHA-256 and MGF1 with SHA-256\", ... } Example-9 # The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"PS384\". { \"name\" : \"Connect PS384 Sign Key\", \"descr\" : \"Signature Key: RSASSA-PSS using SHA-384 and MGF1 with SHA-384\", ... } Example-10 # The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"PS512\". { \"name\" : \"Connect PS512 Sign Key\", \"descr\" : \"Signature Key: RSASSA-PSS using SHA-512 and MGF1 with SHA-512\", ... } Example-11 # The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for \"enc\" (encryption) on data. The \"alg\" (Algorithm) intended with this key is \"RSA1_5\". ``commandLine { \"name\" : \"Connect RSA1_5 Encryption Key\", \"descr\" : \"Encryption Key: RSAES-PKCS1-v1_5\", ... } ### Example-12 The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for \"enc\" (encryption) on data. The \"alg\" (Algorithm) intended with this key is \"RSA-OAEP\". ```commandLine { \"name\" : \"Connect RSA-OAEP Encryption Key\", \"descr\" : \"Encryption Key: RSAES OAEP using default parameters\", ... } Crypto Supported # Depending on the transport through which the messages are sent, the integrity of the message might not be guaranteed and the originator of the message might not be authenticated. To mitigate these risks, ID Token, UserInfo Response, Request Object, and Client Authentication JWT values can utilize JSON Web Signature (JWS) [JWS] to sign their contents. To achieve message confidentiality, these values can also use JSON Web Encryption (JWE) [JWE] to encrypt their contents. Signing algorithms # Signing or Signature algorithm is a cryptographic mechanism used to verify the authenticity and integrity of digital data. We may consider it as a digital version of the ordinary handwritten signatures, but with higher levels of complexity and security. Let's see some signing key algorithms Name Kty Use Alg RS256 Sign Key RSA sig RS256 RS384 Sign Key RSA sig RS384 RS512 Sign Key RSA sig RS512 ES256 Sign Key EC sig ES256 ES256 Sign Key EC sig ES256K ES384 Sign Key EC sig ES384 ES512 Sign Key EC sig ES384 PS256 Sign Key RSA sig PS256 PS384 sign Key RSA sig PS384 PS512 sign Key RSA sig PS512 Encryption algorithms # In cryptography, encryption is the process of encoding information. This process converts the original representation of the information, known as plaintext, into an alternative form known as ciphertext. Ideally, only authorized parties can decipher a ciphertext back to plaintext and access the original information. Let's see some encryption keys. Name Kty Use Alg RSA1_5 Encryption key RSA enc RSA1_5 RSA-OAEP Encryption Key RSA enc RSA-OAEP ECDH-ES Encryption Key CE enc ECDH-ES RSA Key Formats # PKCS#8 encrypted private key \"EncryptedPrivateKeyInfo\" (default for private keys) PKCS#1 \"RSAPublicKey\" (default for public keys) PKCS#8 unencrypted \"PrivateKeyInfo\" PKCS#1 unencrypted \"RSAPrivateKey\" (OpenSSL private key file format) X.509 \"SubjectPublicKeyInfo\" (OpenSSL public key file format) The above key values can be passed as (a) a binary DER-encoded ASN.1 file, (b) a text file in PEM format, (c) a string containing the key in PEM format . Also supported are RSA private and public keys represented in XML format to XKMS 2.0 [XKMS] and JSON Web Key (JWK) format [JWK] . For more details, see Key Storage Format . To know more about RSA keyformat browse here Janssen Keystore Formats # In Janssen we use keystore formats PKCS12 . Which is Encrypted private key formats. In Janssen currently using an extension of p12 . We also have pkcs12 , pfx . We can store private keys, secret keys and certificates on this type. You can find jans-auth-keys.p12 in /etc/certs/ To see the private key you can use bellow command keytool -list -v -keystore /etc/certs/jans-auth-keys.p12 -storetype pkcs12 -storepass ", "title": "Keys"}, {"location": "janssen-server/auth-server/crypto/keys/#overview", "text": "Janssen uses keys for signing and encryption, primarily concerning JSON documents. Janssen supports several signing and encryption algorithms in salted and unsalted, to fit a variety of business needs. If other algorithms are necessary, Janssen supports them via interception scripts.", "title": "Overview"}, {"location": "janssen-server/auth-server/crypto/keys/#keys", "text": "A key is a piece of information, usually a string of numbers or letters that are stored in a file, which, when processed through a cryptographic algorithm, can encode or decode cryptographic data. In Janssen we use keys for creating token like id_token , access_token . access_token : Access tokens are what the OAuth client uses to make requests to an API. The access token is meant to be read and validated by the API. id_token : An ID token is an artifact that proves that the user has been authenticated. It was introduced by OpenID Connect (OIDC) , an open standard for authentication used by Janssen. It contains information about what happened when a user authenticated, and is intended to be read by the OAuth client. The ID token may also contain information about the user such as their name or email address, although that is not a requirement of an ID token.", "title": "Keys"}, {"location": "janssen-server/auth-server/crypto/keys/#jans-server-json-objects-of-public-key", "text": "Gets list of JSON Web Key (JWK) used by server. JWK is a JSON data structure that represents a set of public keys as a JSON object. Browse below endpoint to know more about public keys used by server. https:///jans-auth/restv1/jwks Let's see some example of JWT public keys used in janssen. When jwk is expired, it is archived and can be access by following url: https:///jans-auth/restv1/jwks/archived/{kid} More info about archived jwks can be found here", "title": "Jans server JSON objects of public key"}, {"location": "janssen-server/auth-server/crypto/keys/#example-1", "text": "The \"kty\" (Key Type) of this key is RSA. This key is \"use\" (Public Key Use) for \"sig\" (Signature) on data. The \"alg\" (Algorithm) intended with this key is \"RS256\". { \"name\" : \"Connect RS256 Sign Key\" \"descr\" : \"Signature Key: RSA RSASSA-PKCS1-v1_5 using SHA-256\", ... }", "title": "Example-1"}, {"location": "janssen-server/auth-server/crypto/keys/#example-2", "text": "The \"kty\" (Key Type) of this key is RSA. This key is \"use\" (Public Key Use) for \"sig\" (Signature) on data. The \"alg\" (Algorithm) intended with this key is \"RS384\". { \"name\" : \"Connect RS384 Sign Key\", \"descr\" : \"Signature Key: RSA RSASSA-PKCS1-v1_5 using SHA-384\", ... }", "title": "Example-2"}, {"location": "janssen-server/auth-server/crypto/keys/#example-3", "text": "The \"kty\" (Key Type) of this key is RSA. This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"RS512\". { \"name\" : \"Connect RS512 Sign Key\", \"descr\" : \"Signature Key: RSA RSASSA-PKCS1-v1_5 using SHA-512\", ... }", "title": "Example-3"}, {"location": "janssen-server/auth-server/crypto/keys/#example-4", "text": "The \"kty\" (Key Type) of this key is \"EC\" (Ellliptic Curve). This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"ES256\". { \"name\" : \"Connect ES256 Sign Key\", \"descr\" : \"Signature Key: ECDSA using P-256 (secp256r1) and SHA-256\", ... }", "title": "Example-4"}, {"location": "janssen-server/auth-server/crypto/keys/#example-5", "text": "The \"kty\" (Key Type) of this key is \"EC\" (Ellliptic Curve). This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"ES256K\". { \"name\" : \"Connect ES256 Sign Key\", \"descr\" : \"Signature Key: ECDSA using P-256 (secp256r1) and SHA-256\", ... }", "title": "Example-5"}, {"location": "janssen-server/auth-server/crypto/keys/#example-6", "text": "The \"kty\" (Key Type) of this key is \"EC\" (Ellliptic Curve). This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"ES256K\". { \"name\" : \"Connect ES384 Sign Key\", \"descr\" : \"Signature Key: ECDSA using P-384 (secp384r1) and SHA-384\", ... }", "title": "Example-6"}, {"location": "janssen-server/auth-server/crypto/keys/#example-7", "text": "The \"kty\" (Key Type) of this key is \"EC\" (Ellliptic Curve). This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"ES512\". { \"name\" : \"Connect ES512 Sign Key\", \"descr\" : \"Signature Key: ECDSA using P-521 (secp521r1) and SHA-512\", ... }", "title": "Example-7"}, {"location": "janssen-server/auth-server/crypto/keys/#example-8", "text": "The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"PS256\". { \"name\" : \"Connect PS256 Sign Key\", \"descr\" : \"Signature Key: RSASSA-PSS using SHA-256 and MGF1 with SHA-256\", ... }", "title": "Example-8"}, {"location": "janssen-server/auth-server/crypto/keys/#example-9", "text": "The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"PS384\". { \"name\" : \"Connect PS384 Sign Key\", \"descr\" : \"Signature Key: RSASSA-PSS using SHA-384 and MGF1 with SHA-384\", ... }", "title": "Example-9"}, {"location": "janssen-server/auth-server/crypto/keys/#example-10", "text": "The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for signature (\"sig\") on data. The \"alg\" (Algorithm) intended with this key is \"PS512\". { \"name\" : \"Connect PS512 Sign Key\", \"descr\" : \"Signature Key: RSASSA-PSS using SHA-512 and MGF1 with SHA-512\", ... }", "title": "Example-10"}, {"location": "janssen-server/auth-server/crypto/keys/#example-11", "text": "The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for \"enc\" (encryption) on data. The \"alg\" (Algorithm) intended with this key is \"RSA1_5\". ``commandLine { \"name\" : \"Connect RSA1_5 Encryption Key\", \"descr\" : \"Encryption Key: RSAES-PKCS1-v1_5\", ... } ### Example-12 The \"kty\" (Key Type) of this key is \"RSA\". This key is \"use\" (Public Key Use) for \"enc\" (encryption) on data. The \"alg\" (Algorithm) intended with this key is \"RSA-OAEP\". ```commandLine { \"name\" : \"Connect RSA-OAEP Encryption Key\", \"descr\" : \"Encryption Key: RSAES OAEP using default parameters\", ... }", "title": "Example-11"}, {"location": "janssen-server/auth-server/crypto/keys/#crypto-supported", "text": "Depending on the transport through which the messages are sent, the integrity of the message might not be guaranteed and the originator of the message might not be authenticated. To mitigate these risks, ID Token, UserInfo Response, Request Object, and Client Authentication JWT values can utilize JSON Web Signature (JWS) [JWS] to sign their contents. To achieve message confidentiality, these values can also use JSON Web Encryption (JWE) [JWE] to encrypt their contents.", "title": "Crypto Supported"}, {"location": "janssen-server/auth-server/crypto/keys/#signing-algorithms", "text": "Signing or Signature algorithm is a cryptographic mechanism used to verify the authenticity and integrity of digital data. We may consider it as a digital version of the ordinary handwritten signatures, but with higher levels of complexity and security. Let's see some signing key algorithms Name Kty Use Alg RS256 Sign Key RSA sig RS256 RS384 Sign Key RSA sig RS384 RS512 Sign Key RSA sig RS512 ES256 Sign Key EC sig ES256 ES256 Sign Key EC sig ES256K ES384 Sign Key EC sig ES384 ES512 Sign Key EC sig ES384 PS256 Sign Key RSA sig PS256 PS384 sign Key RSA sig PS384 PS512 sign Key RSA sig PS512", "title": "Signing algorithms"}, {"location": "janssen-server/auth-server/crypto/keys/#encryption-algorithms", "text": "In cryptography, encryption is the process of encoding information. This process converts the original representation of the information, known as plaintext, into an alternative form known as ciphertext. Ideally, only authorized parties can decipher a ciphertext back to plaintext and access the original information. Let's see some encryption keys. Name Kty Use Alg RSA1_5 Encryption key RSA enc RSA1_5 RSA-OAEP Encryption Key RSA enc RSA-OAEP ECDH-ES Encryption Key CE enc ECDH-ES", "title": "Encryption algorithms"}, {"location": "janssen-server/auth-server/crypto/keys/#rsa-key-formats", "text": "PKCS#8 encrypted private key \"EncryptedPrivateKeyInfo\" (default for private keys) PKCS#1 \"RSAPublicKey\" (default for public keys) PKCS#8 unencrypted \"PrivateKeyInfo\" PKCS#1 unencrypted \"RSAPrivateKey\" (OpenSSL private key file format) X.509 \"SubjectPublicKeyInfo\" (OpenSSL public key file format) The above key values can be passed as (a) a binary DER-encoded ASN.1 file, (b) a text file in PEM format, (c) a string containing the key in PEM format . Also supported are RSA private and public keys represented in XML format to XKMS 2.0 [XKMS] and JSON Web Key (JWK) format [JWK] . For more details, see Key Storage Format . To know more about RSA keyformat browse here", "title": "RSA Key Formats"}, {"location": "janssen-server/auth-server/crypto/keys/#janssen-keystore-formats", "text": "In Janssen we use keystore formats PKCS12 . Which is Encrypted private key formats. In Janssen currently using an extension of p12 . We also have pkcs12 , pfx . We can store private keys, secret keys and certificates on this type. You can find jans-auth-keys.p12 in /etc/certs/ To see the private key you can use bellow command keytool -list -v -keystore /etc/certs/jans-auth-keys.p12 -storetype pkcs12 -storepass ", "title": "Janssen Keystore Formats"}, {"location": "janssen-server/auth-server/endpoints/access-evaluation/", "tags": ["administration", "auth-server", "access-evaluation", "endpoint"], "text": "Overview # The Jans-Auth server implements OpenID AuthZEN Authorization API 1.0 \u2013 draft 01 . The AuthZEN Authorization API 1.0 specification defines a standardized interface for communication between Policy Enforcement Points (PEPs) and Policy Decision Points (PDPs) to facilitate consistent authorization decisions across diverse systems. It introduces an Access Evaluation API that allows PEPs to query PDPs about specific access requests, enhancing interoperability and scalability in authorization processes. The specification is transport-agnostic, with an initial focus on HTTPS bindings, and emphasizes secure, fine-grained, and dynamic authorization mechanisms. The Access Evaluation Endpoint in the AuthZEN specification serves as a mechanism for Policy Enforcement Points (PEPs) to request access decisions from a Policy Decision Point (PDP) for specific resources and actions. Upon receiving a request, the endpoint evaluates the subject, resource, and action against defined policies to determine if access should be granted, denied, or if additional information is needed. The endpoint's responses are typically concise, aiming to provide a rapid decision that PEPs can enforce in real-time. The goal is to provide a scalable, secure interface for dynamic and fine-grained access control across applications. URL to access access evaluation endpoint on Janssen Server is listed in both: - the response of Janssen Server's well-known configuration endpoint given below. - the response of Janssen Server's /.well-known/authzen-configuration endpoint. OpenID Discovery https://janssen.server.host/jans-auth/.well-known/openid-configuration AuthZEN Discovery https://janssen.server.host/jans-auth/.well-known/authzen-configuration /.well-known/authzen-configuration allows to publish data specific to AuthZEN only. Response of AuthZEN discovery endpoint can be changed via AccessEvaluationDiscoveryType custom script. Snippet of AccessEvaluationDiscoveryType @Override public boolean modifyResponse ( Object responseAsJsonObject , Object context ) { scriptLogger . info ( \"write to script logger\" ); JSONObject response = ( JSONObject ) responseAsJsonObject ; response . accumulate ( \"key_from_java\" , \"value_from_script_on_java\" ); return true ; } access_evaluation_v1_endpoint claim in the response specifies the URL for access evaluation endpoint. By default, access evaluation endpoint looks like below: https://janssen.server.host/jans-auth/restv1/access/v1/evaluation In order to call Access Evaluation Endpoint client must have access_evaluation scope. If scope is not present AS rejects call with 401 (unauthorized) http status code. Authorization header must contain valid access_token with access_evaluation scope granted to it. Otherwise it's possible to use Basic token with encoded client credentials if set accessEvaluationAllowBasicClientAuthorization AS configuration property to true . Bearer token : Authorization: Bearer Basic authorization : Authorization: Basic More information about request and response of the Access Evaluation Endpoint can be found in the OpenAPI specification of jans-auth-server module . Sample request POST /jans-auth/restv1/access/v1/evaluation HTTP/1.1 Host: happy-example.gluu.info Content-Type: application/json Authorization: Basic M2NjOTdhYWItMDE0Zi00ZWM5LWI4M2EtNTE3MTRlODE3MDMwOmFlYmMwZWFhLWY5N2YtNDU5NS04ZWExLWFlNmU1NDFmNDZjNg== { \"subject\": { \"id\": \"alice@acmecorp.com\", \"type\": \"super_admin\", \"properties\": null }, \"resource\": { \"id\": \"123\", \"type\": \"account\", \"properties\": null }, \"action\": { \"name\": \"can_read\", \"properties\": { \"method\": \"GET\" } }, \"context\": { \"properties\": null } } Sample successful response with authorization_code . HTTP/1.1 200 Content-Type: application/json { \"decision\":true, \"context\": { \"id\":\"9e04dd22-e980-4e54-bc04-d64a0c2e1afe\", \"reason_admin\":{\"reason\":\"super_admin\"}, \"reason_user\":null } } Sample error response HTTP/1.1 401 Unauthorized Content-Type: application/json Cache-Control: no-store { \"error\": \"invalid_token\" } Configuration Properties # Access Evaluation Endpoint AS configuration: accessEvaluationScriptName - Access evaluation custom script name. If not set AS falls back to first valid script found in database. accessEvaluationAllowBasicClientAuthorization - Allow basic client authorization for access evaluation endpoint. Custom script # AS provides AccessEvaluationType custom script which must be used to control Access Evaluation Endpoint behaviour. Use accessEvaluationScriptName configuration property to specify custom script. If not set AS falls back to first valid script found in database. Main evaluate method returns response which grants or denies access. Please see following snippet below: @Override public AccessEvaluationResponse evaluate ( AccessEvaluationRequest request , Object scriptContext ) { ExternalScriptContext context = ( ExternalScriptContext ) scriptContext ; // 1. access http request via context.getHttpRequest() // 2. access all access evaluation specific data directly with 'request', e.g. request.getSubject() // 3. perform custom validation if needed validateResource ( request . getResource ()); // typically some internal validation must be performed here // request data alone must not be trusted, it's just sample to demo script with endpoint if ( \"super_admin\" . equalsIgnoreCase ( request . getSubject (). getType ())) { final ObjectNode reasonAdmin = objectMapper . createObjectNode (); reasonAdmin . put ( \"reason\" , \"super_admin\" ); final AccessEvaluationResponseContext responseContext = new AccessEvaluationResponseContext (); responseContext . setId ( UUID . randomUUID (). toString ()); responseContext . setReasonAdmin ( reasonAdmin ); return new AccessEvaluationResponse ( true , responseContext ); } return AccessEvaluationResponse . FALSE ; } More details in Access Evaluation Custom Script Page . Full sample script can be found here Full successful Access Evaluation Flow sample # ####################################################### TEST: OpenID Connect Discovery ####################################################### ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /.well-known/webfinger HTTP/1.1?resource=acct%3Aadmin%40happy-example.gluu.info&rel=http%3A%2F%2Fopenid.net%2Fspecs%2Fconnect%2F1.0%2Fissuer HTTP/1.1 Host: happy-example.gluu.info ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 207 Content-Type: application/jrd+json;charset=iso-8859-1 Date: Fri, 08 Nov 2024 17:15:19 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.52 (Ubuntu) Set-Cookie: X-Correlation-Id=f8a91ca8-3ebb-48fb-852e-31e40b398b6d; Secure; HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"subject\": \"acct:admin@happy-example.gluu.info\", \"links\": [{ \"rel\": \"http://openid.net/specs/connect/1.0/issuer\", \"href\": \"https://happy-example.gluu.info\" }] } OpenID Connect Configuration ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /.well-known/openid-configuration HTTP/1.1 HTTP/1.1 Host: happy-example.gluu.info ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 7715 Content-Type: application/json Date: Fri, 08 Nov 2024 17:15:19 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.52 (Ubuntu) Set-Cookie: X-Correlation-Id=474307e2-ed02-404e-bf35-a2bc60bf3421; Secure; HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"request_parameter_supported\" : true, \"pushed_authorization_request_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/par\", \"introspection_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"introspection_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/introspection\", \"claims_parameter_supported\" : false, \"status_list_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/status_list\", \"issuer\" : \"https://happy-example.gluu.info\", \"userinfo_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"id_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"access_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"authorization_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/authorize\", \"service_documentation\" : \"http://jans.org/docs\", \"authorization_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"introspection_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"claims_supported\" : [ \"street_address\", \"country\", \"zoneinfo\", \"birthdate\", \"role\", \"gender\", \"formatted\", \"user_name\", \"phone_mobile_number\", \"preferred_username\", \"locale\", \"inum\", \"updated_at\", \"post_office_box\", \"nickname\", \"preferred_language\", \"email\", \"website\", \"email_verified\", \"profile\", \"locality\", \"room_number\", \"phone_number_verified\", \"given_name\", \"middle_name\", \"picture\", \"name\", \"phone_number\", \"postal_code\", \"region\", \"family_name\", \"jansAdminUIRole\" ], \"ssa_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/ssa\", \"token_endpoint_auth_methods_supported\" : [ \"client_secret_basic\", \"client_secret_post\", \"client_secret_jwt\", \"private_key_jwt\", \"tls_client_auth\", \"self_signed_tls_client_auth\" ], \"tls_client_certificate_bound_access_tokens\" : true, \"response_modes_supported\" : [ \"fragment\", \"query.jwt\", \"query\", \"fragment.jwt\", \"jwt\", \"form_post.jwt\", \"form_post\" ], \"backchannel_logout_session_supported\" : true, \"token_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/token\", \"response_types_supported\" : [ \"code token\", \"code\", \"code id_token\", \"code token id_token\", \"token id_token\", \"token\", \"id_token\" ], \"tx_token_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"authorization_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"backchannel_token_delivery_modes_supported\" : [ \"poll\", \"ping\", \"push\" ], \"dpop_signing_alg_values_supported\" : [ \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_uri_parameter_supported\" : true, \"backchannel_user_code_parameter_supported\" : false, \"grant_types_supported\" : [ \"client_credentials\", \"urn:ietf:params:oauth:grant-type:device_code\", \"refresh_token\", \"implicit\", \"password\", \"authorization_code\", \"urn:ietf:params:oauth:grant-type:uma-ticket\", \"urn:ietf:params:oauth:grant-type:token-exchange\" ], \"ui_locales_supported\" : [ \"en\", \"bg\", \"de\", \"es\", \"fr\", \"it\", \"ru\", \"tr\" ], \"prompt_values_supported\" : [ \"none\", \"login\", \"consent\", \"select_account\", \"create\" ], \"userinfo_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/userinfo\", \"access_evaluation_v1_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/access/v1/evaluation\", \"authorization_challenge_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/authorization_challenge\", \"op_tos_uri\" : \"https://happy-example.gluu.info/tos\", \"require_request_uri_registration\" : false, \"id_token_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"frontchannel_logout_session_supported\" : true, \"authorization_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"claims_locales_supported\" : [ \"en\" ], \"clientinfo_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/clientinfo\", \"request_object_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_object_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"global_token_revocation_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/global-token-revocation\", \"introspection_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"tx_token_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"session_revocation_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/revoke_session\", \"check_session_iframe\" : \"https://happy-example.gluu.info/jans-auth/opiframe.htm\", \"scopes_supported\" : [ \"address\", \"introspection\", \"role\", \"access_evaluation\", \"https://jans.io/auth/ssa.admin\", \"online_access\", \"openid\", \"clientinfo\", \"user_name\", \"profile\", \"uma_protection\", \"revoke_any_token\", \"global_token_revocation\", \"https://jans.io/scim/users.write\", \"revoke_session\", \"device_sso\", \"https://jans.io/scim/users.read\", \"phone\", \"mobile_phone\", \"offline_access\", \"authorization_challenge\", \"https://jans.io/oauth/lock/audit.write\", \"email\", \"https://jans.io/oauth/lock/audit.readonly\" ], \"backchannel_logout_supported\" : true, \"acr_values_supported\" : [ \"simple_password_auth\" ], \"archived_jwks_uri\" : \"https://happy-example.gluu.info/jans-auth/restv1/jwks/archived\", \"request_object_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"device_authorization_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/device_authorization\", \"display_values_supported\" : [ \"page\", \"popup\" ], \"tx_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"userinfo_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"require_pushed_authorization_requests\" : false, \"claim_types_supported\" : [ \"normal\" ], \"userinfo_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"end_session_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/end_session\", \"revocation_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/revoke\", \"backchannel_authentication_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/bc-authorize\", \"token_endpoint_auth_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"frontchannel_logout_supported\" : true, \"jwks_uri\" : \"https://happy-example.gluu.info/jans-auth/restv1/jwks\", \"subject_types_supported\" : [ \"public\", \"pairwise\" ], \"id_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"registration_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/register\", \"id_token_token_binding_cnf_values_supported\" : [ \"tbh\" ] } ####################################################### TEST: accessEvaluation_whenSubjectTypeIsAcceptedByScript_shouldGrantAccess ####################################################### ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/register HTTP/1.1 Host: happy-example.gluu.info Content-Type: application/json Accept: application/json { \"grant_types\" : [ \"authorization_code\", \"refresh_token\" ], \"subject_type\" : \"public\", \"application_type\" : \"web\", \"scope\" : \"access_evaluation openid profile address email phone user_name\", \"minimum_acr_priority_list\" : [ ], \"redirect_uris\" : [ \"https://happy-example.gluu.info/jans-auth-rp/home.htm\", \"https://client.example.com/cb\", \"https://client.example.com/cb1\", \"https://client.example.com/cb2\" ], \"client_name\" : \"access_evaluation test\", \"additional_audience\" : [ ], \"response_types\" : [ \"code\", \"id_token\" ] } ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 201 Cache-Control: no-store Connection: Keep-Alive Content-Length: 1664 Content-Type: application/json Date: Fri, 08 Nov 2024 17:15:20 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.52 (Ubuntu) Set-Cookie: X-Correlation-Id=d7035723-e472-4cac-84c5-ef19f14fcc09; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"allow_spontaneous_scopes\": false, \"application_type\": \"web\", \"rpt_as_jwt\": false, \"registration_client_uri\": \"https://happy-example.gluu.info/jans-auth/restv1/register?client_id=3cc97aab-014f-4ec9-b83a-51714e817030\", \"tls_client_auth_subject_dn\": \"\", \"run_introspection_script_before_jwt_creation\": false, \"registration_access_token\": \"bcf42a29-d534-4ed4-a4aa-eceb4e50f472\", \"client_id\": \"3cc97aab-014f-4ec9-b83a-51714e817030\", \"token_endpoint_auth_method\": \"client_secret_basic\", \"scope\": \"openid access_evaluation\", \"client_secret\": \"aebc0eaa-f97f-4595-8ea1-ae6e541f46c6\", \"client_id_issued_at\": 1731086120, \"backchannel_logout_session_required\": false, \"client_name\": \"access_evaluation test\", \"par_lifetime\": 600, \"spontaneous_scopes\": [], \"id_token_signed_response_alg\": \"RS256\", \"access_token_as_jwt\": false, \"grant_types\": [ \"refresh_token\", \"authorization_code\" ], \"subject_type\": \"public\", \"authorization_details_types\": [], \"additional_token_endpoint_auth_methods\": [], \"keep_client_authorization_after_expiration\": false, \"require_par\": false, \"redirect_uris\": [ \"https://client.example.com/cb2\", \"https://client.example.com/cb1\", \"https://client.example.com/cb\", \"https://happy-example.gluu.info/jans-auth-rp/home.htm\" ], \"redirect_uris_regex\": \"\", \"additional_audience\": [], \"frontchannel_logout_session_required\": false, \"client_secret_expires_at\": 0, \"access_token_signing_alg\": \"RS256\", \"response_types\": [ \"code\", \"id_token\" ] } ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/access/v1/evaluation HTTP/1.1 Host: happy-example.gluu.info Content-Type: application/json Authorization: Basic M2NjOTdhYWItMDE0Zi00ZWM5LWI4M2EtNTE3MTRlODE3MDMwOmFlYmMwZWFhLWY5N2YtNDU5NS04ZWExLWFlNmU1NDFmNDZjNg== {\"subject\":{\"id\":\"alice@acmecorp.com\",\"type\":\"super_admin\",\"properties\":null},\"resource\":{\"id\":\"123\",\"type\":\"account\",\"properties\":null},\"action\":{\"name\":\"can_read\",\"properties\":{\"method\":\"GET\"}},\"context\":{\"properties\":null}} ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 132 Content-Type: application/json Date: Fri, 08 Nov 2024 17:15:21 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.52 (Ubuntu) Set-Cookie: X-Correlation-Id=d4f99d9f-5b94-4863-a020-73f6fb62c5e8; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"decision\":true,\"context\":{\"id\":\"9e04dd22-e980-4e54-bc04-d64a0c2e1afe\",\"reason_admin\":{\"reason\":\"super_admin\"},\"reason_user\":null}}", "title": "Access Evaluation"}, {"location": "janssen-server/auth-server/endpoints/access-evaluation/#overview", "text": "The Jans-Auth server implements OpenID AuthZEN Authorization API 1.0 \u2013 draft 01 . The AuthZEN Authorization API 1.0 specification defines a standardized interface for communication between Policy Enforcement Points (PEPs) and Policy Decision Points (PDPs) to facilitate consistent authorization decisions across diverse systems. It introduces an Access Evaluation API that allows PEPs to query PDPs about specific access requests, enhancing interoperability and scalability in authorization processes. The specification is transport-agnostic, with an initial focus on HTTPS bindings, and emphasizes secure, fine-grained, and dynamic authorization mechanisms. The Access Evaluation Endpoint in the AuthZEN specification serves as a mechanism for Policy Enforcement Points (PEPs) to request access decisions from a Policy Decision Point (PDP) for specific resources and actions. Upon receiving a request, the endpoint evaluates the subject, resource, and action against defined policies to determine if access should be granted, denied, or if additional information is needed. The endpoint's responses are typically concise, aiming to provide a rapid decision that PEPs can enforce in real-time. The goal is to provide a scalable, secure interface for dynamic and fine-grained access control across applications. URL to access access evaluation endpoint on Janssen Server is listed in both: - the response of Janssen Server's well-known configuration endpoint given below. - the response of Janssen Server's /.well-known/authzen-configuration endpoint. OpenID Discovery https://janssen.server.host/jans-auth/.well-known/openid-configuration AuthZEN Discovery https://janssen.server.host/jans-auth/.well-known/authzen-configuration /.well-known/authzen-configuration allows to publish data specific to AuthZEN only. Response of AuthZEN discovery endpoint can be changed via AccessEvaluationDiscoveryType custom script. Snippet of AccessEvaluationDiscoveryType @Override public boolean modifyResponse ( Object responseAsJsonObject , Object context ) { scriptLogger . info ( \"write to script logger\" ); JSONObject response = ( JSONObject ) responseAsJsonObject ; response . accumulate ( \"key_from_java\" , \"value_from_script_on_java\" ); return true ; } access_evaluation_v1_endpoint claim in the response specifies the URL for access evaluation endpoint. By default, access evaluation endpoint looks like below: https://janssen.server.host/jans-auth/restv1/access/v1/evaluation In order to call Access Evaluation Endpoint client must have access_evaluation scope. If scope is not present AS rejects call with 401 (unauthorized) http status code. Authorization header must contain valid access_token with access_evaluation scope granted to it. Otherwise it's possible to use Basic token with encoded client credentials if set accessEvaluationAllowBasicClientAuthorization AS configuration property to true . Bearer token : Authorization: Bearer Basic authorization : Authorization: Basic More information about request and response of the Access Evaluation Endpoint can be found in the OpenAPI specification of jans-auth-server module . Sample request POST /jans-auth/restv1/access/v1/evaluation HTTP/1.1 Host: happy-example.gluu.info Content-Type: application/json Authorization: Basic M2NjOTdhYWItMDE0Zi00ZWM5LWI4M2EtNTE3MTRlODE3MDMwOmFlYmMwZWFhLWY5N2YtNDU5NS04ZWExLWFlNmU1NDFmNDZjNg== { \"subject\": { \"id\": \"alice@acmecorp.com\", \"type\": \"super_admin\", \"properties\": null }, \"resource\": { \"id\": \"123\", \"type\": \"account\", \"properties\": null }, \"action\": { \"name\": \"can_read\", \"properties\": { \"method\": \"GET\" } }, \"context\": { \"properties\": null } } Sample successful response with authorization_code . HTTP/1.1 200 Content-Type: application/json { \"decision\":true, \"context\": { \"id\":\"9e04dd22-e980-4e54-bc04-d64a0c2e1afe\", \"reason_admin\":{\"reason\":\"super_admin\"}, \"reason_user\":null } } Sample error response HTTP/1.1 401 Unauthorized Content-Type: application/json Cache-Control: no-store { \"error\": \"invalid_token\" }", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/access-evaluation/#configuration-properties", "text": "Access Evaluation Endpoint AS configuration: accessEvaluationScriptName - Access evaluation custom script name. If not set AS falls back to first valid script found in database. accessEvaluationAllowBasicClientAuthorization - Allow basic client authorization for access evaluation endpoint.", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/access-evaluation/#custom-script", "text": "AS provides AccessEvaluationType custom script which must be used to control Access Evaluation Endpoint behaviour. Use accessEvaluationScriptName configuration property to specify custom script. If not set AS falls back to first valid script found in database. Main evaluate method returns response which grants or denies access. Please see following snippet below: @Override public AccessEvaluationResponse evaluate ( AccessEvaluationRequest request , Object scriptContext ) { ExternalScriptContext context = ( ExternalScriptContext ) scriptContext ; // 1. access http request via context.getHttpRequest() // 2. access all access evaluation specific data directly with 'request', e.g. request.getSubject() // 3. perform custom validation if needed validateResource ( request . getResource ()); // typically some internal validation must be performed here // request data alone must not be trusted, it's just sample to demo script with endpoint if ( \"super_admin\" . equalsIgnoreCase ( request . getSubject (). getType ())) { final ObjectNode reasonAdmin = objectMapper . createObjectNode (); reasonAdmin . put ( \"reason\" , \"super_admin\" ); final AccessEvaluationResponseContext responseContext = new AccessEvaluationResponseContext (); responseContext . setId ( UUID . randomUUID (). toString ()); responseContext . setReasonAdmin ( reasonAdmin ); return new AccessEvaluationResponse ( true , responseContext ); } return AccessEvaluationResponse . FALSE ; } More details in Access Evaluation Custom Script Page . Full sample script can be found here", "title": "Custom script"}, {"location": "janssen-server/auth-server/endpoints/access-evaluation/#full-successful-access-evaluation-flow-sample", "text": "####################################################### TEST: OpenID Connect Discovery ####################################################### ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /.well-known/webfinger HTTP/1.1?resource=acct%3Aadmin%40happy-example.gluu.info&rel=http%3A%2F%2Fopenid.net%2Fspecs%2Fconnect%2F1.0%2Fissuer HTTP/1.1 Host: happy-example.gluu.info ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 207 Content-Type: application/jrd+json;charset=iso-8859-1 Date: Fri, 08 Nov 2024 17:15:19 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.52 (Ubuntu) Set-Cookie: X-Correlation-Id=f8a91ca8-3ebb-48fb-852e-31e40b398b6d; Secure; HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"subject\": \"acct:admin@happy-example.gluu.info\", \"links\": [{ \"rel\": \"http://openid.net/specs/connect/1.0/issuer\", \"href\": \"https://happy-example.gluu.info\" }] } OpenID Connect Configuration ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /.well-known/openid-configuration HTTP/1.1 HTTP/1.1 Host: happy-example.gluu.info ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 7715 Content-Type: application/json Date: Fri, 08 Nov 2024 17:15:19 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.52 (Ubuntu) Set-Cookie: X-Correlation-Id=474307e2-ed02-404e-bf35-a2bc60bf3421; Secure; HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"request_parameter_supported\" : true, \"pushed_authorization_request_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/par\", \"introspection_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"introspection_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/introspection\", \"claims_parameter_supported\" : false, \"status_list_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/status_list\", \"issuer\" : \"https://happy-example.gluu.info\", \"userinfo_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"id_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"access_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"authorization_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/authorize\", \"service_documentation\" : \"http://jans.org/docs\", \"authorization_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"introspection_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"claims_supported\" : [ \"street_address\", \"country\", \"zoneinfo\", \"birthdate\", \"role\", \"gender\", \"formatted\", \"user_name\", \"phone_mobile_number\", \"preferred_username\", \"locale\", \"inum\", \"updated_at\", \"post_office_box\", \"nickname\", \"preferred_language\", \"email\", \"website\", \"email_verified\", \"profile\", \"locality\", \"room_number\", \"phone_number_verified\", \"given_name\", \"middle_name\", \"picture\", \"name\", \"phone_number\", \"postal_code\", \"region\", \"family_name\", \"jansAdminUIRole\" ], \"ssa_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/ssa\", \"token_endpoint_auth_methods_supported\" : [ \"client_secret_basic\", \"client_secret_post\", \"client_secret_jwt\", \"private_key_jwt\", \"tls_client_auth\", \"self_signed_tls_client_auth\" ], \"tls_client_certificate_bound_access_tokens\" : true, \"response_modes_supported\" : [ \"fragment\", \"query.jwt\", \"query\", \"fragment.jwt\", \"jwt\", \"form_post.jwt\", \"form_post\" ], \"backchannel_logout_session_supported\" : true, \"token_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/token\", \"response_types_supported\" : [ \"code token\", \"code\", \"code id_token\", \"code token id_token\", \"token id_token\", \"token\", \"id_token\" ], \"tx_token_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"authorization_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"backchannel_token_delivery_modes_supported\" : [ \"poll\", \"ping\", \"push\" ], \"dpop_signing_alg_values_supported\" : [ \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_uri_parameter_supported\" : true, \"backchannel_user_code_parameter_supported\" : false, \"grant_types_supported\" : [ \"client_credentials\", \"urn:ietf:params:oauth:grant-type:device_code\", \"refresh_token\", \"implicit\", \"password\", \"authorization_code\", \"urn:ietf:params:oauth:grant-type:uma-ticket\", \"urn:ietf:params:oauth:grant-type:token-exchange\" ], \"ui_locales_supported\" : [ \"en\", \"bg\", \"de\", \"es\", \"fr\", \"it\", \"ru\", \"tr\" ], \"prompt_values_supported\" : [ \"none\", \"login\", \"consent\", \"select_account\", \"create\" ], \"userinfo_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/userinfo\", \"access_evaluation_v1_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/access/v1/evaluation\", \"authorization_challenge_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/authorization_challenge\", \"op_tos_uri\" : \"https://happy-example.gluu.info/tos\", \"require_request_uri_registration\" : false, \"id_token_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"frontchannel_logout_session_supported\" : true, \"authorization_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"claims_locales_supported\" : [ \"en\" ], \"clientinfo_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/clientinfo\", \"request_object_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_object_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"global_token_revocation_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/global-token-revocation\", \"introspection_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"tx_token_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"session_revocation_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/revoke_session\", \"check_session_iframe\" : \"https://happy-example.gluu.info/jans-auth/opiframe.htm\", \"scopes_supported\" : [ \"address\", \"introspection\", \"role\", \"access_evaluation\", \"https://jans.io/auth/ssa.admin\", \"online_access\", \"openid\", \"clientinfo\", \"user_name\", \"profile\", \"uma_protection\", \"revoke_any_token\", \"global_token_revocation\", \"https://jans.io/scim/users.write\", \"revoke_session\", \"device_sso\", \"https://jans.io/scim/users.read\", \"phone\", \"mobile_phone\", \"offline_access\", \"authorization_challenge\", \"https://jans.io/oauth/lock/audit.write\", \"email\", \"https://jans.io/oauth/lock/audit.readonly\" ], \"backchannel_logout_supported\" : true, \"acr_values_supported\" : [ \"simple_password_auth\" ], \"archived_jwks_uri\" : \"https://happy-example.gluu.info/jans-auth/restv1/jwks/archived\", \"request_object_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"device_authorization_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/device_authorization\", \"display_values_supported\" : [ \"page\", \"popup\" ], \"tx_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"userinfo_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"require_pushed_authorization_requests\" : false, \"claim_types_supported\" : [ \"normal\" ], \"userinfo_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"end_session_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/end_session\", \"revocation_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/revoke\", \"backchannel_authentication_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/bc-authorize\", \"token_endpoint_auth_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"frontchannel_logout_supported\" : true, \"jwks_uri\" : \"https://happy-example.gluu.info/jans-auth/restv1/jwks\", \"subject_types_supported\" : [ \"public\", \"pairwise\" ], \"id_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"registration_endpoint\" : \"https://happy-example.gluu.info/jans-auth/restv1/register\", \"id_token_token_binding_cnf_values_supported\" : [ \"tbh\" ] } ####################################################### TEST: accessEvaluation_whenSubjectTypeIsAcceptedByScript_shouldGrantAccess ####################################################### ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/register HTTP/1.1 Host: happy-example.gluu.info Content-Type: application/json Accept: application/json { \"grant_types\" : [ \"authorization_code\", \"refresh_token\" ], \"subject_type\" : \"public\", \"application_type\" : \"web\", \"scope\" : \"access_evaluation openid profile address email phone user_name\", \"minimum_acr_priority_list\" : [ ], \"redirect_uris\" : [ \"https://happy-example.gluu.info/jans-auth-rp/home.htm\", \"https://client.example.com/cb\", \"https://client.example.com/cb1\", \"https://client.example.com/cb2\" ], \"client_name\" : \"access_evaluation test\", \"additional_audience\" : [ ], \"response_types\" : [ \"code\", \"id_token\" ] } ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 201 Cache-Control: no-store Connection: Keep-Alive Content-Length: 1664 Content-Type: application/json Date: Fri, 08 Nov 2024 17:15:20 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.52 (Ubuntu) Set-Cookie: X-Correlation-Id=d7035723-e472-4cac-84c5-ef19f14fcc09; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"allow_spontaneous_scopes\": false, \"application_type\": \"web\", \"rpt_as_jwt\": false, \"registration_client_uri\": \"https://happy-example.gluu.info/jans-auth/restv1/register?client_id=3cc97aab-014f-4ec9-b83a-51714e817030\", \"tls_client_auth_subject_dn\": \"\", \"run_introspection_script_before_jwt_creation\": false, \"registration_access_token\": \"bcf42a29-d534-4ed4-a4aa-eceb4e50f472\", \"client_id\": \"3cc97aab-014f-4ec9-b83a-51714e817030\", \"token_endpoint_auth_method\": \"client_secret_basic\", \"scope\": \"openid access_evaluation\", \"client_secret\": \"aebc0eaa-f97f-4595-8ea1-ae6e541f46c6\", \"client_id_issued_at\": 1731086120, \"backchannel_logout_session_required\": false, \"client_name\": \"access_evaluation test\", \"par_lifetime\": 600, \"spontaneous_scopes\": [], \"id_token_signed_response_alg\": \"RS256\", \"access_token_as_jwt\": false, \"grant_types\": [ \"refresh_token\", \"authorization_code\" ], \"subject_type\": \"public\", \"authorization_details_types\": [], \"additional_token_endpoint_auth_methods\": [], \"keep_client_authorization_after_expiration\": false, \"require_par\": false, \"redirect_uris\": [ \"https://client.example.com/cb2\", \"https://client.example.com/cb1\", \"https://client.example.com/cb\", \"https://happy-example.gluu.info/jans-auth-rp/home.htm\" ], \"redirect_uris_regex\": \"\", \"additional_audience\": [], \"frontchannel_logout_session_required\": false, \"client_secret_expires_at\": 0, \"access_token_signing_alg\": \"RS256\", \"response_types\": [ \"code\", \"id_token\" ] } ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/access/v1/evaluation HTTP/1.1 Host: happy-example.gluu.info Content-Type: application/json Authorization: Basic M2NjOTdhYWItMDE0Zi00ZWM5LWI4M2EtNTE3MTRlODE3MDMwOmFlYmMwZWFhLWY5N2YtNDU5NS04ZWExLWFlNmU1NDFmNDZjNg== {\"subject\":{\"id\":\"alice@acmecorp.com\",\"type\":\"super_admin\",\"properties\":null},\"resource\":{\"id\":\"123\",\"type\":\"account\",\"properties\":null},\"action\":{\"name\":\"can_read\",\"properties\":{\"method\":\"GET\"}},\"context\":{\"properties\":null}} ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 132 Content-Type: application/json Date: Fri, 08 Nov 2024 17:15:21 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.52 (Ubuntu) Set-Cookie: X-Correlation-Id=d4f99d9f-5b94-4863-a020-73f6fb62c5e8; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"decision\":true,\"context\":{\"id\":\"9e04dd22-e980-4e54-bc04-d64a0c2e1afe\",\"reason_admin\":{\"reason\":\"super_admin\"},\"reason_user\":null}}", "title": "Full successful Access Evaluation Flow sample"}, {"location": "janssen-server/auth-server/endpoints/archived-jwks-uri/", "tags": ["administration", "auth-server", "jwks", "json-web-key-set", "endpoint"], "text": "Overview # Janssen Server supports /jwks/archived/{kid} metadata endpoint and publishes its Archived JSON Web Keys (JWKs) at this endpoint. This endpoint publishes expired signing keys as well as expired encryption keys used by Janssen Server. RP can use these keys to validate signatures from Janssen Server, and also to perform encryption and decryption if keys are no longer present in /jwks endpoint. Like other metadata endpoints, this is not a secure endpoint. URL to access archived jwks endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration archived_jwks_uri claim in the response specifies the URL for archived jwks endpoint. By default, the archived jwks endpoint looks like below: https://janssen.server.host/jans-auth/restv1/jwks/archived/{kid} This endpoint is always enabled and can not be disabled using feature flags. Configuration Properties # Archived JWKs endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . archivedJwksUri archivedJwkLifetimeInSeconds If archivedJwkLifetimeInSeconds is not set then AS falls back to one year expiration. After archived jwk lifetime is passed, jwk is removed from archive. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Archived JWKS URI"}, {"location": "janssen-server/auth-server/endpoints/archived-jwks-uri/#overview", "text": "Janssen Server supports /jwks/archived/{kid} metadata endpoint and publishes its Archived JSON Web Keys (JWKs) at this endpoint. This endpoint publishes expired signing keys as well as expired encryption keys used by Janssen Server. RP can use these keys to validate signatures from Janssen Server, and also to perform encryption and decryption if keys are no longer present in /jwks endpoint. Like other metadata endpoints, this is not a secure endpoint. URL to access archived jwks endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration archived_jwks_uri claim in the response specifies the URL for archived jwks endpoint. By default, the archived jwks endpoint looks like below: https://janssen.server.host/jans-auth/restv1/jwks/archived/{kid} This endpoint is always enabled and can not be disabled using feature flags.", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/archived-jwks-uri/#configuration-properties", "text": "Archived JWKs endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . archivedJwksUri archivedJwkLifetimeInSeconds If archivedJwkLifetimeInSeconds is not set then AS falls back to one year expiration. After archived jwk lifetime is passed, jwk is removed from archive.", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/archived-jwks-uri/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/endpoints/authorization-challenge/", "tags": ["administration", "auth-server", "authorization-challenge", "endpoint"], "text": "Overview # Authorization Challenge Endpoint allows first-party native client obtain authorization code which later can be exchanged on access token. This can provide an entirely browserless OAuth 2.0 experience suited for native applications. This endpoint conforms to OAuth 2.0 for First-Party Applications specifications. URL to access authorization challenge endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration authorization_challenge_endpoint claim in the response specifies the URL for authorization challenge endpoint. By default, authorization challenge endpoint looks like below: https://janssen.server.host/jans-auth/restv1/authorize-challenge In order to call Authorization Challenge Endpoint client must have authorization_challenge scope. If scope is not present AS rejects call with 401 (unauthorized) http status code. Authorization Challenge Endpoint supports Proof Key for Code Exchange (PKCE). More information about request and response of the authorization challenge endpoint can be found in the OpenAPI specification of jans-auth-server module . Sample request POST /authorize HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded login_hint=%2B1-310-123-4567&scope=profile &client_id=bb16c14c73415 Sample successful response with authorization_code . HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store { \"authorization_code\": \"uY29tL2F1dGhlbnRpY\" } Sample error response HTTP/1.1 401 Unauthorized Content-Type: application/json Cache-Control: no-store { \"error\": \"username_required\" } Configuration Properties # Authorization Challenge Endpoint AS configuration: authorizationChallengeEndpoint - The authorization challenge endpoint URL authorizationChallengeDefaultAcr - Authorization Challenge Endpoint Default ACR if no value is specified in acr_values request parameter. Default value is default_challenge . authorizationChallengeShouldGenerateSession - Boolean value specifying whether to generate session_id (AS object and cookie) during authorization at Authorization Challenge Endpoint. Default value is false . mtlsAuthorizationChallengeEndpoint - URL for Mutual TLS (mTLS) Client Authentication and Certificate-Bound Access Tokens (MTLS) Authorization Challenge Endpoint. Custom script # AS provides AuthorizationChallengeType custom script which must be used to control Authorization Challenge Endpoint behaviour. If request does not have acr_values specified and script name falls back to default_challenge which is available and enabled during installation. Default script name can be changed via authorizationChallengeDefaultAcr configuration property. Main method return true/false which indicates to server whether to issue authorization_code in response or not. If parameters is not present then error has to be created and false returned. If all is good script has to return true and it's strongly recommended to set user context.getExecutionContext().setUser(user); so AS can keep tracking what exactly user is authenticated. Please see following snippet below: public boolean authorize ( Object scriptContext ) { ExternalScriptContext context = ( ExternalScriptContext ) scriptContext ; // 1. validate all required parameters are present final String username = getParameterOrCreateError ( context , USERNAME_PARAMETER ); if ( StringUtils . isBlank ( username )) { return false ; } final String password = getParameterOrCreateError ( context , PASSWORD_PARAMETER ); if ( StringUtils . isBlank ( password )) { return false ; } scriptLogger . trace ( \"All required parameters are present\" ); // 2. main authorization logic, if ok -> set authorized user into \"context.getExecutionContext().setUser(user);\" and return true UserService userService = CdiUtil . bean ( UserService . class ); PersistenceEntryManager entryManager = CdiUtil . bean ( PersistenceEntryManager . class ); final User user = userService . getUser ( username ); if ( user == null ) { scriptLogger . trace ( \"User is not found by username {}\" , username ); createError ( context , \"username_invalid\" ); return false ; } final boolean ok = entryManager . authenticate ( user . getDn (), User . class , password ); if ( ok ) { context . getExecutionContext (). setUser ( user ); // <- IMPORTANT : without user set, user relation will not be associated with token scriptLogger . trace ( \"User {} is authenticated successfully.\" , username ); return true ; } // 3. not ok -> set error which explains what is wrong and return false scriptLogger . trace ( \"Failed to authenticate user {}. Please check username and password.\" , username ); createError ( context , \"username_or_password_invalid\" ); return false ; } More details in Authorization Challenge Custom Script Page . Full sample script can be found here Auth session # Auth session is optional. AS does not return it by default. It's possible to pass in request use_auth_session=true which makes AS return it in error response. If it is desired to use auth_session and don't pass client_id (or other parameters) in next request, it should be put in attributes of auth_session object. auth_session object lifetime is set by authorizationChallengeSessionLifetimeInSeconds AS configuration property. If authorizationChallengeSessionLifetimeInSeconds is not set then value falls back to 86400 seconds. Example String clientId = context . getHttpRequest (). getParameter ( \"client_id\" ); authorizationChallengeSessionObject . getAttributes (). getAttributes (). put ( \"client_id\" , clientId ); AS automatically validates DPoP if it is set during auth session creation. Thus it's recommended to set jkt of the auth session if DPoP is used. final String dpop = context . getHttpRequest (). getHeader ( DpopService . DPOP ); if ( StringUtils . isNotBlank ( dpop )) { authorizationChallengeSessionObject . getAttributes (). setJkt ( getDpopJkt ( dpop )); } Full sample script can be found here Web session # Authorization challenge script is first-party flow and thus web session is not created by default. However there can be cases when such session has to be created. Please set authorizationChallengeShouldGenerateSession configuration property to true to force session creation. In case it is needed to prepare session with specific data, it is possible to create session in script and set it into context. Example: SessionIdService sessionIdService = CdiUtil . bean ( SessionIdService . class ); Identity identityService = CdiUtil . bean ( Identity . class ); Map < String , String > sessionStore = new HashMap < String , String > (); sessionStore . put ( \"login_id_token\" , login_id_token ); sessionStore . put ( \"login_access_token\" , login_access_token ); sessionStore . put ( \"transaction_status\" , \"PENDING\" ); SessionId sessionId = sessionIdService . generateAuthenticatedSessionId ( context . getHttpRequest (), user . getDn (), sessionStore ); context . getExecutionContext (). setAuthorizationChallengeSessionId ( sessionId ); scriptLogger . trace ( \"Created Authorization challenge session successfully\" ); Multi-step example # Sometimes it's required to send data sequentially. Step by step. Calls to Authorization Challenge Endpoint must have use_auth_session=true parameter to force tracking data between request. Lets consider example when RP first sends username and then in next request OTP . POST /jans-auth/restv1/authorize-challenge HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded username=alice &scope=photos &client_id=bb16c14c73415 AS accepts username and returns back error with auth_session . HTTP/1.1 401 Unauthorized Content-Type: application/json Cache-Control: no-store { \"error\": \"otp_required\", \"auth_session\": \"ce6772f5e07bc8361572f\" } In next call RP can send OTP and auth_session (AS matches user from auth_session ) POST /jans-auth/restv1/authorize-challenge HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded otp=ccnnju667d&auth_session=ce6772f5e07bc8361572f In custom script it's easy to code what data has to be kept in auth_session . private void createError(ExternalScriptContext context, String errorCode) { String deviceSessionPart = prepareDeviceSessionSubJson(context); final String entity = String.format(\"{\\\"error\\\": \\\"%s\\\"%s}\", errorCode, deviceSessionPart); context.createWebApplicationException(401, entity); } private String prepareDeviceSessionSubJson(ExternalScriptContext context) { DeviceSession authorizationChallengeSessionObject = context.getAuthzRequest().getDeviceSessionObject(); if (authorizationChallengeSessionObject != null) { prepareDeviceSession(context, authorizationChallengeSessionObject); return String.format(\",\\\"auth_session\\\":\\\"%s\\\"\", authorizationChallengeSessionObject.getId()); } else if (context.getAuthzRequest().isUseDeviceSession()) { authorizationChallengeSessionObject = prepareDeviceSession(context, null); return String.format(\",\\\"auth_session\\\":\\\"%s\\\"\", authorizationChallengeSessionObject.getId()); } return \"\"; } private DeviceSession prepareDeviceSession(ExternalScriptContext context, DeviceSession authorizationChallengeSessionObject) { DeviceSessionService deviceSessionService = CdiUtil.bean(DeviceSessionService.class); boolean newSave = authorizationChallengeSessionObject == null; if (newSave) { authorizationChallengeSessionObject = deviceSessionService.newDeviceSession(); } String username = context.getHttpRequest().getParameter(USERNAME_PARAMETER); if (StringUtils.isNotBlank(username)) { authorizationChallengeSessionObject.getAttributes().getAttributes().put(USERNAME_PARAMETER, username); } String otp = context.getHttpRequest().getParameter(OTP_PARAMETER); if (StringUtils.isNotBlank(otp)) { authorizationChallengeSessionObject.getAttributes().getAttributes().put(OTP_PARAMETER, otp); } String clientId = context.getHttpRequest().getParameter(\"client_id\"); if (StringUtils.isNotBlank(clientId)) { authorizationChallengeSessionObject.getAttributes().getAttributes().put(\"client_id\", clientId); } String acrValues = context.getHttpRequest().getParameter(\"acr_values\"); if (StringUtils.isNotBlank(acrValues)) { authorizationChallengeSessionObject.getAttributes().getAttributes().put(\"acr_values\", acrValues); } if (newSave) { deviceSessionService.persist(authorizationChallengeSessionObject); } else { deviceSessionService.merge(authorizationChallengeSessionObject); } return authorizationChallengeSessionObject; } More details in Authorization Challenge Custom Script Page . Full multi-step sample script can be found here Full successful Authorization Challenge Flow sample # OpenID Connect Configuration ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /.well-known/openid-configuration HTTP/1.1 HTTP/1.1 Host: yuriyz-fond-skink.gluu.info ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 6244 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:04 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=fa097a44-5568-48aa-9390-1880616e5a69; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"request_parameter_supported\" : true, \"pushed_authorization_request_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/par\", \"introspection_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/introspection\", \"claims_parameter_supported\" : false, \"issuer\" : \"https://yuriyz-fond-skink.gluu.info\", \"userinfo_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"id_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"access_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"authorization_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/authorize\", \"service_documentation\" : \"http://jans.org/docs\", \"authorization_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"claims_supported\" : [ \"street_address\", \"country\", \"zoneinfo\", \"birthdate\", \"role\", \"gender\", \"formatted\", \"user_name\", \"phone_mobile_number\", \"preferred_username\", \"locale\", \"inum\", \"updated_at\", \"post_office_box\", \"nickname\", \"preferred_language\", \"email\", \"website\", \"email_verified\", \"profile\", \"locality\", \"phone_number_verified\", \"room_number\", \"given_name\", \"middle_name\", \"picture\", \"name\", \"phone_number\", \"postal_code\", \"region\", \"family_name\", \"jansAdminUIRole\" ], \"ssa_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/ssa\", \"token_endpoint_auth_methods_supported\" : [ \"client_secret_basic\", \"client_secret_post\", \"client_secret_jwt\", \"private_key_jwt\", \"tls_client_auth\", \"self_signed_tls_client_auth\" ], \"tls_client_certificate_bound_access_tokens\" : true, \"response_modes_supported\" : [ \"query\", \"jwt\", \"query.jwt\", \"form_post.jwt\", \"form_post\", \"fragment\", \"fragment.jwt\" ], \"backchannel_logout_session_supported\" : true, \"token_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/token\", \"response_types_supported\" : [ \"code\", \"code id_token token\", \"id_token\", \"code id_token\", \"token\", \"id_token token\", \"code token\" ], \"authorization_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"backchannel_token_delivery_modes_supported\" : [ \"poll\", \"ping\", \"push\" ], \"dpop_signing_alg_values_supported\" : [ \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_uri_parameter_supported\" : true, \"backchannel_user_code_parameter_supported\" : false, \"grant_types_supported\" : [ \"client_credentials\", \"urn:ietf:params:oauth:grant-type:uma-ticket\", \"urn:ietf:params:oauth:grant-type:device_code\", \"urn:ietf:params:oauth:grant-type:token-exchange\", \"implicit\", \"authorization_code\", \"password\", \"refresh_token\" ], \"ui_locales_supported\" : [ \"en\", \"bg\", \"de\", \"es\", \"fr\", \"it\", \"ru\", \"tr\" ], \"userinfo_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/userinfo\", \"authorization_challenge_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/authorize-challenge\", \"op_tos_uri\" : \"https://yuriyz-fond-skink.gluu.info/tos\", \"require_request_uri_registration\" : false, \"id_token_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"frontchannel_logout_session_supported\" : true, \"authorization_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"claims_locales_supported\" : [ \"en\" ], \"clientinfo_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/clientinfo\", \"request_object_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_object_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"key_from_java\" : \"value_from_script_on_java\", \"session_revocation_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/revoke_session\", \"check_session_iframe\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/opiframe.htm\", \"scopes_supported\" : [ \"address\", \"introspection\", \"https://jans.io/auth/ssa.admin\", \"online_access\", \"openid\", \"user_name\", \"clientinfo\", \"profile\", \"uma_protection\", \"permission\", \"https://jans.io/scim/users.write\", \"revoke_session\", \"https://jans.io/scim/users.read\", \"device_sso\", \"phone\", \"mobile_phone\", \"offline_access\", \"email\" ], \"backchannel_logout_supported\" : true, \"acr_values_supported\" : [ \"simple_password_auth\" ], \"request_object_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"device_authorization_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/device_authorization\", \"display_values_supported\" : [ \"page\", \"popup\" ], \"userinfo_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"require_pushed_authorization_requests\" : false, \"claim_types_supported\" : [ \"normal\" ], \"userinfo_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"end_session_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/end_session\", \"revocation_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/revoke\", \"backchannel_authentication_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/bc-authorize\", \"token_endpoint_auth_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"frontchannel_logout_supported\" : true, \"jwks_uri\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/jwks\", \"subject_types_supported\" : [ \"public\", \"pairwise\" ], \"id_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"registration_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/register\", \"id_token_token_binding_cnf_values_supported\" : [ \"tbh\" ] } ####################################################### TEST: authorizationChallengeFlow ####################################################### ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/register HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Content-Type: application/json Accept: application/json { \"grant_types\" : [ \"authorization_code\", \"refresh_token\" ], \"subject_type\" : \"public\", \"application_type\" : \"web\", \"scope\" : \"openid profile address email phone user_name\", \"minimum_acr_priority_list\" : [ ], \"redirect_uris\" : [ \"https://yuriyz-fond-skink.gluu.info/jans-auth-rp/home.htm\", \"https://client.example.com/cb\", \"https://client.example.com/cb1\", \"https://client.example.com/cb2\" ], \"client_name\" : \"jans test app\", \"additional_audience\" : [ ], \"response_types\" : [ \"code\", \"id_token\" ] } ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 201 Cache-Control: no-store Connection: Keep-Alive Content-Length: 1633 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:05 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=81dc6c45-7831-4738-b169-b087ee9a6bd6; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"allow_spontaneous_scopes\": false, \"application_type\": \"web\", \"rpt_as_jwt\": false, \"registration_client_uri\": \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/register?client_id=999e13b8-f4a2-4fed-ad3c-6c88bd2c92ea\", \"tls_client_auth_subject_dn\": \"\", \"run_introspection_script_before_jwt_creation\": false, \"registration_access_token\": \"28a50db3-b6d1-4054-a259-ef7168afa760\", \"client_id\": \"999e13b8-f4a2-4fed-ad3c-6c88bd2c92ea\", \"token_endpoint_auth_method\": \"client_secret_basic\", \"scope\": \"openid\", \"client_secret\": \"f6364c5c-295d-4e6e-bb40-6ad3a47b2119\", \"client_id_issued_at\": 1691668385, \"backchannel_logout_uri\": \"\", \"backchannel_logout_session_required\": false, \"client_name\": \"jans test app\", \"par_lifetime\": 600, \"spontaneous_scopes\": [], \"id_token_signed_response_alg\": \"RS256\", \"access_token_as_jwt\": false, \"grant_types\": [ \"authorization_code\", \"refresh_token\" ], \"subject_type\": \"public\", \"additional_token_endpoint_auth_methods\": [], \"keep_client_authorization_after_expiration\": false, \"require_par\": false, \"redirect_uris\": [ \"https://client.example.com/cb2\", \"https://client.example.com/cb1\", \"https://client.example.com/cb\", \"https://yuriyz-fond-skink.gluu.info/jans-auth-rp/home.htm\" ], \"redirect_uris_regex\": \"\", \"additional_audience\": [], \"frontchannel_logout_session_required\": false, \"client_secret_expires_at\": 1691704385, \"access_token_signing_alg\": \"RS256\", \"response_types\": [ \"code\", \"id_token\" ] } ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/authorize-challenge HTTP/1.1 Host: yuriyz-fond-skink.gluu.info client_id=999e13b8-f4a2-4fed-ad3c-6c88bd2c92ea&scope=openid+profile+address+email+phone+user_name&state=b4a41b29-51c8-4354-9c8c-fda38b4dbd43&nonce=3a56f8d0-f78e-4b15-857c-3e792801be68&prompt=&ui_locales=&claims_locales=&acr_values=&request_session_id=false&password=secret&username=admin ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Cache-Control: no-transform, no-store Connection: Keep-Alive Content-Length: 61 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:06 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=3aa95eb7-73e2-40ae-9303-34adf30a1a05; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"authorization_code\":\"9e3dc65b-937a-49c2-bdff-41fbc1a352d0\"} Successfully obtained authorization code 9e3dc65b-937a-49c2-bdff-41fbc1a352d0 at Authorization Challenge Endpoint ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/token HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Content-Type: application/x-www-form-urlencoded Authorization: Basic OTk5ZTEzYjgtZjRhMi00ZmVkLWFkM2MtNmM4OGJkMmM5MmVhOmY2MzY0YzVjLTI5NWQtNGU2ZS1iYjQwLTZhZDNhNDdiMjExOQ== grant_type=authorization_code&code=9e3dc65b-937a-49c2-bdff-41fbc1a352d0&redirect_uri=https%3A%2F%2Fyuriyz-fond-skink.gluu.info%2Fjans-auth-rp%2Fhome.htm ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Cache-Control: no-store Connection: Keep-Alive Content-Length: 1250 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:06 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=3eb3c205-6206-4a70-98fb-75bf81757976; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"access_token\":\"d87aa8d2-fefb-4d16-a775-9b9d27f73bfc\",\"refresh_token\":\"505314a7-05f5-4c9f-8900-ccb0685dea17\",\"id_token\":\"eyJraWQiOiJjb25uZWN0XzI1OGZmMmFiLWE4ODQtNDIxNy1iNmQ4LTJhMGI2NDhmOTcxZF9zaWdfcnMyNTYiLCJ0eXAiOiJqd3QiLCJhbGciOiJSUzI1NiJ9.eyJhdF9oYXNoIjoiUC04RktlejhlNHROTURTbVlGeHV5dyIsInN1YiI6IjI1Nzg0ZDQ5LTg0ZjMtNGIyNi1hZWUyLTEwNDkzMzM5MjMyZCIsImFtciI6W10sImlzcyI6Imh0dHBzOi8veXVyaXl6LWZvbmQtc2tpbmsuZ2x1dS5pbmZvIiwibm9uY2UiOiIzYTU2ZjhkMC1mNzhlLTRiMTUtODU3Yy0zZTc5MjgwMWJlNjgiLCJqYW5zT3BlbklEQ29ubmVjdFZlcnNpb24iOiJvcGVuaWRjb25uZWN0LTEuMCIsImF1ZCI6Ijk5OWUxM2I4LWY0YTItNGZlZC1hZDNjLTZjODhiZDJjOTJlYSIsInJhbmRvbSI6ImJmYmI5OTBmLWNkYTEtNGM3OC1hNjM4LWFhN2NiMjc5MjU3MiIsImFjciI6ImRlZmF1bHRfY2hhbGxlbmdlIiwiY19oYXNoIjoiTnFoSGFIenZZYjYxeDFackQwUEZVdyIsImF1dGhfdGltZSI6MTY5MTY2ODM4NiwiZXhwIjoxNjkxNjcxOTg2LCJncmFudCI6ImF1dGhvcml6YXRpb25fY29kZSIsImlhdCI6MTY5MTY2ODM4Nn0.QTUmzJaHtbPGjrV4E0MUn_fU1On44B6-_7pT0Dz_cY29s_KajGLfin3G_WsYmZA--ysyRLAmdK_X5C3W-wpkpDJ8906vuZST5547lSJGOZ45_VFv7XnTmBip3zRQOmrlxdU6OQ5Vmj3xMON_NQ-ckEUSNr65xWTAPmOQoncGYp8s-TO7ethyx6UyDTnW8d1YiXWCUYfQDQ8d5wCPHnfoYAsZCs_f0xaBUmaiwvUL3ckiXgMr2yHjWKWQuezlbjJk7ODu2cgoAzs3IWMonaixIJeeJJcOvFB4SPTnbToJe7ISvvsZTEwrLWW_E_LgTUEDqHbeWyeQI8WqDa9EOwMEFw\",\"token_type\":\"Bearer\",\"expires_in\":299} ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/token HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Content-Type: application/x-www-form-urlencoded Authorization: Basic OTk5ZTEzYjgtZjRhMi00ZmVkLWFkM2MtNmM4OGJkMmM5MmVhOmY2MzY0YzVjLTI5NWQtNGU2ZS1iYjQwLTZhZDNhNDdiMjExOQ== grant_type=refresh_token&refresh_token=505314a7-05f5-4c9f-8900-ccb0685dea17 ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Cache-Control: no-store Connection: Keep-Alive Content-Length: 166 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:08 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=88a6b7a5-3230-4f0f-b859-09df77a5c67a; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"access_token\":\"572f6422-caf9-496a-a6be-4ab39c872816\",\"refresh_token\":\"e93b6576-5297-4d9d-a92b-3276d90a75e4\",\"scope\":\"openid\",\"token_type\":\"Bearer\",\"expires_in\":299} ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /jans-auth/restv1/userinfo HTTP/1.1 HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Authorization: Bearer 572f6422-caf9-496a-a6be-4ab39c872816 ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Cache-Control: no-store, private Connection: Keep-Alive Content-Length: 46 Content-Type: application/json;charset=utf-8 Date: Thu, 10 Aug 2023 11:53:08 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=390c7a63-fe06-48a5-b3bf-2549267ba9b0; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"sub\":\"25784d49-84f3-4b26-aee2-10493339232d\"} Authorization Challenge Flow sample with invalid user # OpenID Connect Configuration ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /.well-known/openid-configuration HTTP/1.1 HTTP/1.1 Host: yuriyz-fond-skink.gluu.info ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 6244 Content-Type: application/json Date: Thu, 10 Aug 2023 11:57:01 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=79c5fed3-d69a-4fdf-af88-fce550cd1819; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"request_parameter_supported\" : true, \"pushed_authorization_request_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/par\", \"introspection_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/introspection\", \"claims_parameter_supported\" : false, \"issuer\" : \"https://yuriyz-fond-skink.gluu.info\", \"userinfo_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"id_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"access_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"authorization_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/authorize\", \"service_documentation\" : \"http://jans.org/docs\", \"authorization_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"claims_supported\" : [ \"street_address\", \"country\", \"zoneinfo\", \"birthdate\", \"role\", \"gender\", \"formatted\", \"user_name\", \"phone_mobile_number\", \"preferred_username\", \"locale\", \"inum\", \"updated_at\", \"post_office_box\", \"nickname\", \"preferred_language\", \"email\", \"website\", \"email_verified\", \"profile\", \"locality\", \"phone_number_verified\", \"room_number\", \"given_name\", \"middle_name\", \"picture\", \"name\", \"phone_number\", \"postal_code\", \"region\", \"family_name\", \"jansAdminUIRole\" ], \"ssa_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/ssa\", \"token_endpoint_auth_methods_supported\" : [ \"client_secret_basic\", \"client_secret_post\", \"client_secret_jwt\", \"private_key_jwt\", \"tls_client_auth\", \"self_signed_tls_client_auth\" ], \"tls_client_certificate_bound_access_tokens\" : true, \"response_modes_supported\" : [ \"query\", \"jwt\", \"query.jwt\", \"form_post.jwt\", \"form_post\", \"fragment\", \"fragment.jwt\" ], \"backchannel_logout_session_supported\" : true, \"token_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/token\", \"response_types_supported\" : [ \"code\", \"code id_token token\", \"id_token\", \"code id_token\", \"token\", \"id_token token\", \"code token\" ], \"authorization_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"backchannel_token_delivery_modes_supported\" : [ \"poll\", \"ping\", \"push\" ], \"dpop_signing_alg_values_supported\" : [ \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_uri_parameter_supported\" : true, \"backchannel_user_code_parameter_supported\" : false, \"grant_types_supported\" : [ \"client_credentials\", \"urn:ietf:params:oauth:grant-type:uma-ticket\", \"urn:ietf:params:oauth:grant-type:device_code\", \"urn:ietf:params:oauth:grant-type:token-exchange\", \"implicit\", \"authorization_code\", \"password\", \"refresh_token\" ], \"ui_locales_supported\" : [ \"en\", \"bg\", \"de\", \"es\", \"fr\", \"it\", \"ru\", \"tr\" ], \"userinfo_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/userinfo\", \"authorization_challenge_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/authorize-challenge\", \"op_tos_uri\" : \"https://yuriyz-fond-skink.gluu.info/tos\", \"require_request_uri_registration\" : false, \"id_token_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"frontchannel_logout_session_supported\" : true, \"authorization_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"claims_locales_supported\" : [ \"en\" ], \"clientinfo_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/clientinfo\", \"request_object_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_object_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"key_from_java\" : \"value_from_script_on_java\", \"session_revocation_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/revoke_session\", \"check_session_iframe\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/opiframe.htm\", \"scopes_supported\" : [ \"address\", \"introspection\", \"https://jans.io/auth/ssa.admin\", \"online_access\", \"openid\", \"user_name\", \"clientinfo\", \"profile\", \"uma_protection\", \"permission\", \"https://jans.io/scim/users.write\", \"revoke_session\", \"https://jans.io/scim/users.read\", \"device_sso\", \"phone\", \"mobile_phone\", \"offline_access\", \"email\" ], \"backchannel_logout_supported\" : true, \"acr_values_supported\" : [ \"simple_password_auth\" ], \"request_object_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"device_authorization_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/device_authorization\", \"display_values_supported\" : [ \"page\", \"popup\" ], \"userinfo_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"require_pushed_authorization_requests\" : false, \"claim_types_supported\" : [ \"normal\" ], \"userinfo_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"end_session_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/end_session\", \"revocation_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/revoke\", \"backchannel_authentication_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/bc-authorize\", \"token_endpoint_auth_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"frontchannel_logout_supported\" : true, \"jwks_uri\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/jwks\", \"subject_types_supported\" : [ \"public\", \"pairwise\" ], \"id_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"registration_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/register\", \"id_token_token_binding_cnf_values_supported\" : [ \"tbh\" ] } ####################################################### TEST: authorizationChallengeFlow ####################################################### ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/register HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Content-Type: application/json Accept: application/json { \"grant_types\" : [ \"authorization_code\", \"refresh_token\" ], \"subject_type\" : \"public\", \"application_type\" : \"web\", \"scope\" : \"openid profile address email phone user_name\", \"minimum_acr_priority_list\" : [ ], \"redirect_uris\" : [ \"https://yuriyz-fond-skink.gluu.info/jans-auth-rp/home.htm\", \"https://client.example.com/cb\", \"https://client.example.com/cb1\", \"https://client.example.com/cb2\" ], \"client_name\" : \"jans test app\", \"additional_audience\" : [ ], \"response_types\" : [ \"code\", \"id_token\" ] } ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 201 Cache-Control: no-store Connection: Keep-Alive Content-Length: 1633 Content-Type: application/json Date: Thu, 10 Aug 2023 11:57:02 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=7045173c-9a96-418a-86ed-47a09749b004; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"allow_spontaneous_scopes\": false, \"application_type\": \"web\", \"rpt_as_jwt\": false, \"registration_client_uri\": \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/register?client_id=d93a5129-1546-4b9b-bf8c-ea19e36ea2c8\", \"tls_client_auth_subject_dn\": \"\", \"run_introspection_script_before_jwt_creation\": false, \"registration_access_token\": \"67aa99de-e977-4562-955d-6292f2c95df4\", \"client_id\": \"d93a5129-1546-4b9b-bf8c-ea19e36ea2c8\", \"token_endpoint_auth_method\": \"client_secret_basic\", \"scope\": \"openid\", \"client_secret\": \"f921c89c-57f0-4a91-baaa-036a4a22737b\", \"client_id_issued_at\": 1691668622, \"backchannel_logout_uri\": \"\", \"backchannel_logout_session_required\": false, \"client_name\": \"jans test app\", \"par_lifetime\": 600, \"spontaneous_scopes\": [], \"id_token_signed_response_alg\": \"RS256\", \"access_token_as_jwt\": false, \"grant_types\": [ \"authorization_code\", \"refresh_token\" ], \"subject_type\": \"public\", \"additional_token_endpoint_auth_methods\": [], \"keep_client_authorization_after_expiration\": false, \"require_par\": false, \"redirect_uris\": [ \"https://client.example.com/cb2\", \"https://client.example.com/cb1\", \"https://client.example.com/cb\", \"https://yuriyz-fond-skink.gluu.info/jans-auth-rp/home.htm\" ], \"redirect_uris_regex\": \"\", \"additional_audience\": [], \"frontchannel_logout_session_required\": false, \"client_secret_expires_at\": 1691704622, \"access_token_signing_alg\": \"RS256\", \"response_types\": [ \"code\", \"id_token\" ] } ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/authorize-challenge HTTP/1.1 Host: yuriyz-fond-skink.gluu.info client_id=d93a5129-1546-4b9b-bf8c-ea19e36ea2c8&scope=openid+profile+address+email+phone+user_name&state=4f925a8d-287a-4cba-a174-04d2e56109df&nonce=84c9b6dd-635c-4ca4-bba1-35c53c51a339&prompt=&ui_locales=&claims_locales=&acr_values=&request_session_id=false&password=secret&username=invalidUser ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 401 Cache-Control: no-transform, no-store Connection: Keep-Alive Content-Length: 29 Content-Type: application/json Date: Thu, 10 Aug 2023 11:57:02 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=4c89e007-6c77-43da-a67f-b7ee1ff0e60a; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"error\": \"username_invalid\"}", "title": "Authorization Challenge"}, {"location": "janssen-server/auth-server/endpoints/authorization-challenge/#overview", "text": "Authorization Challenge Endpoint allows first-party native client obtain authorization code which later can be exchanged on access token. This can provide an entirely browserless OAuth 2.0 experience suited for native applications. This endpoint conforms to OAuth 2.0 for First-Party Applications specifications. URL to access authorization challenge endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration authorization_challenge_endpoint claim in the response specifies the URL for authorization challenge endpoint. By default, authorization challenge endpoint looks like below: https://janssen.server.host/jans-auth/restv1/authorize-challenge In order to call Authorization Challenge Endpoint client must have authorization_challenge scope. If scope is not present AS rejects call with 401 (unauthorized) http status code. Authorization Challenge Endpoint supports Proof Key for Code Exchange (PKCE). More information about request and response of the authorization challenge endpoint can be found in the OpenAPI specification of jans-auth-server module . Sample request POST /authorize HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded login_hint=%2B1-310-123-4567&scope=profile &client_id=bb16c14c73415 Sample successful response with authorization_code . HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store { \"authorization_code\": \"uY29tL2F1dGhlbnRpY\" } Sample error response HTTP/1.1 401 Unauthorized Content-Type: application/json Cache-Control: no-store { \"error\": \"username_required\" }", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/authorization-challenge/#configuration-properties", "text": "Authorization Challenge Endpoint AS configuration: authorizationChallengeEndpoint - The authorization challenge endpoint URL authorizationChallengeDefaultAcr - Authorization Challenge Endpoint Default ACR if no value is specified in acr_values request parameter. Default value is default_challenge . authorizationChallengeShouldGenerateSession - Boolean value specifying whether to generate session_id (AS object and cookie) during authorization at Authorization Challenge Endpoint. Default value is false . mtlsAuthorizationChallengeEndpoint - URL for Mutual TLS (mTLS) Client Authentication and Certificate-Bound Access Tokens (MTLS) Authorization Challenge Endpoint.", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/authorization-challenge/#custom-script", "text": "AS provides AuthorizationChallengeType custom script which must be used to control Authorization Challenge Endpoint behaviour. If request does not have acr_values specified and script name falls back to default_challenge which is available and enabled during installation. Default script name can be changed via authorizationChallengeDefaultAcr configuration property. Main method return true/false which indicates to server whether to issue authorization_code in response or not. If parameters is not present then error has to be created and false returned. If all is good script has to return true and it's strongly recommended to set user context.getExecutionContext().setUser(user); so AS can keep tracking what exactly user is authenticated. Please see following snippet below: public boolean authorize ( Object scriptContext ) { ExternalScriptContext context = ( ExternalScriptContext ) scriptContext ; // 1. validate all required parameters are present final String username = getParameterOrCreateError ( context , USERNAME_PARAMETER ); if ( StringUtils . isBlank ( username )) { return false ; } final String password = getParameterOrCreateError ( context , PASSWORD_PARAMETER ); if ( StringUtils . isBlank ( password )) { return false ; } scriptLogger . trace ( \"All required parameters are present\" ); // 2. main authorization logic, if ok -> set authorized user into \"context.getExecutionContext().setUser(user);\" and return true UserService userService = CdiUtil . bean ( UserService . class ); PersistenceEntryManager entryManager = CdiUtil . bean ( PersistenceEntryManager . class ); final User user = userService . getUser ( username ); if ( user == null ) { scriptLogger . trace ( \"User is not found by username {}\" , username ); createError ( context , \"username_invalid\" ); return false ; } final boolean ok = entryManager . authenticate ( user . getDn (), User . class , password ); if ( ok ) { context . getExecutionContext (). setUser ( user ); // <- IMPORTANT : without user set, user relation will not be associated with token scriptLogger . trace ( \"User {} is authenticated successfully.\" , username ); return true ; } // 3. not ok -> set error which explains what is wrong and return false scriptLogger . trace ( \"Failed to authenticate user {}. Please check username and password.\" , username ); createError ( context , \"username_or_password_invalid\" ); return false ; } More details in Authorization Challenge Custom Script Page . Full sample script can be found here", "title": "Custom script"}, {"location": "janssen-server/auth-server/endpoints/authorization-challenge/#auth-session", "text": "Auth session is optional. AS does not return it by default. It's possible to pass in request use_auth_session=true which makes AS return it in error response. If it is desired to use auth_session and don't pass client_id (or other parameters) in next request, it should be put in attributes of auth_session object. auth_session object lifetime is set by authorizationChallengeSessionLifetimeInSeconds AS configuration property. If authorizationChallengeSessionLifetimeInSeconds is not set then value falls back to 86400 seconds. Example String clientId = context . getHttpRequest (). getParameter ( \"client_id\" ); authorizationChallengeSessionObject . getAttributes (). getAttributes (). put ( \"client_id\" , clientId ); AS automatically validates DPoP if it is set during auth session creation. Thus it's recommended to set jkt of the auth session if DPoP is used. final String dpop = context . getHttpRequest (). getHeader ( DpopService . DPOP ); if ( StringUtils . isNotBlank ( dpop )) { authorizationChallengeSessionObject . getAttributes (). setJkt ( getDpopJkt ( dpop )); } Full sample script can be found here", "title": "Auth session"}, {"location": "janssen-server/auth-server/endpoints/authorization-challenge/#web-session", "text": "Authorization challenge script is first-party flow and thus web session is not created by default. However there can be cases when such session has to be created. Please set authorizationChallengeShouldGenerateSession configuration property to true to force session creation. In case it is needed to prepare session with specific data, it is possible to create session in script and set it into context. Example: SessionIdService sessionIdService = CdiUtil . bean ( SessionIdService . class ); Identity identityService = CdiUtil . bean ( Identity . class ); Map < String , String > sessionStore = new HashMap < String , String > (); sessionStore . put ( \"login_id_token\" , login_id_token ); sessionStore . put ( \"login_access_token\" , login_access_token ); sessionStore . put ( \"transaction_status\" , \"PENDING\" ); SessionId sessionId = sessionIdService . generateAuthenticatedSessionId ( context . getHttpRequest (), user . getDn (), sessionStore ); context . getExecutionContext (). setAuthorizationChallengeSessionId ( sessionId ); scriptLogger . trace ( \"Created Authorization challenge session successfully\" );", "title": "Web session"}, {"location": "janssen-server/auth-server/endpoints/authorization-challenge/#multi-step-example", "text": "Sometimes it's required to send data sequentially. Step by step. Calls to Authorization Challenge Endpoint must have use_auth_session=true parameter to force tracking data between request. Lets consider example when RP first sends username and then in next request OTP . POST /jans-auth/restv1/authorize-challenge HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded username=alice &scope=photos &client_id=bb16c14c73415 AS accepts username and returns back error with auth_session . HTTP/1.1 401 Unauthorized Content-Type: application/json Cache-Control: no-store { \"error\": \"otp_required\", \"auth_session\": \"ce6772f5e07bc8361572f\" } In next call RP can send OTP and auth_session (AS matches user from auth_session ) POST /jans-auth/restv1/authorize-challenge HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded otp=ccnnju667d&auth_session=ce6772f5e07bc8361572f In custom script it's easy to code what data has to be kept in auth_session . private void createError(ExternalScriptContext context, String errorCode) { String deviceSessionPart = prepareDeviceSessionSubJson(context); final String entity = String.format(\"{\\\"error\\\": \\\"%s\\\"%s}\", errorCode, deviceSessionPart); context.createWebApplicationException(401, entity); } private String prepareDeviceSessionSubJson(ExternalScriptContext context) { DeviceSession authorizationChallengeSessionObject = context.getAuthzRequest().getDeviceSessionObject(); if (authorizationChallengeSessionObject != null) { prepareDeviceSession(context, authorizationChallengeSessionObject); return String.format(\",\\\"auth_session\\\":\\\"%s\\\"\", authorizationChallengeSessionObject.getId()); } else if (context.getAuthzRequest().isUseDeviceSession()) { authorizationChallengeSessionObject = prepareDeviceSession(context, null); return String.format(\",\\\"auth_session\\\":\\\"%s\\\"\", authorizationChallengeSessionObject.getId()); } return \"\"; } private DeviceSession prepareDeviceSession(ExternalScriptContext context, DeviceSession authorizationChallengeSessionObject) { DeviceSessionService deviceSessionService = CdiUtil.bean(DeviceSessionService.class); boolean newSave = authorizationChallengeSessionObject == null; if (newSave) { authorizationChallengeSessionObject = deviceSessionService.newDeviceSession(); } String username = context.getHttpRequest().getParameter(USERNAME_PARAMETER); if (StringUtils.isNotBlank(username)) { authorizationChallengeSessionObject.getAttributes().getAttributes().put(USERNAME_PARAMETER, username); } String otp = context.getHttpRequest().getParameter(OTP_PARAMETER); if (StringUtils.isNotBlank(otp)) { authorizationChallengeSessionObject.getAttributes().getAttributes().put(OTP_PARAMETER, otp); } String clientId = context.getHttpRequest().getParameter(\"client_id\"); if (StringUtils.isNotBlank(clientId)) { authorizationChallengeSessionObject.getAttributes().getAttributes().put(\"client_id\", clientId); } String acrValues = context.getHttpRequest().getParameter(\"acr_values\"); if (StringUtils.isNotBlank(acrValues)) { authorizationChallengeSessionObject.getAttributes().getAttributes().put(\"acr_values\", acrValues); } if (newSave) { deviceSessionService.persist(authorizationChallengeSessionObject); } else { deviceSessionService.merge(authorizationChallengeSessionObject); } return authorizationChallengeSessionObject; } More details in Authorization Challenge Custom Script Page . Full multi-step sample script can be found here", "title": "Multi-step example"}, {"location": "janssen-server/auth-server/endpoints/authorization-challenge/#full-successful-authorization-challenge-flow-sample", "text": "OpenID Connect Configuration ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /.well-known/openid-configuration HTTP/1.1 HTTP/1.1 Host: yuriyz-fond-skink.gluu.info ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 6244 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:04 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=fa097a44-5568-48aa-9390-1880616e5a69; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"request_parameter_supported\" : true, \"pushed_authorization_request_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/par\", \"introspection_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/introspection\", \"claims_parameter_supported\" : false, \"issuer\" : \"https://yuriyz-fond-skink.gluu.info\", \"userinfo_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"id_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"access_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"authorization_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/authorize\", \"service_documentation\" : \"http://jans.org/docs\", \"authorization_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"claims_supported\" : [ \"street_address\", \"country\", \"zoneinfo\", \"birthdate\", \"role\", \"gender\", \"formatted\", \"user_name\", \"phone_mobile_number\", \"preferred_username\", \"locale\", \"inum\", \"updated_at\", \"post_office_box\", \"nickname\", \"preferred_language\", \"email\", \"website\", \"email_verified\", \"profile\", \"locality\", \"phone_number_verified\", \"room_number\", \"given_name\", \"middle_name\", \"picture\", \"name\", \"phone_number\", \"postal_code\", \"region\", \"family_name\", \"jansAdminUIRole\" ], \"ssa_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/ssa\", \"token_endpoint_auth_methods_supported\" : [ \"client_secret_basic\", \"client_secret_post\", \"client_secret_jwt\", \"private_key_jwt\", \"tls_client_auth\", \"self_signed_tls_client_auth\" ], \"tls_client_certificate_bound_access_tokens\" : true, \"response_modes_supported\" : [ \"query\", \"jwt\", \"query.jwt\", \"form_post.jwt\", \"form_post\", \"fragment\", \"fragment.jwt\" ], \"backchannel_logout_session_supported\" : true, \"token_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/token\", \"response_types_supported\" : [ \"code\", \"code id_token token\", \"id_token\", \"code id_token\", \"token\", \"id_token token\", \"code token\" ], \"authorization_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"backchannel_token_delivery_modes_supported\" : [ \"poll\", \"ping\", \"push\" ], \"dpop_signing_alg_values_supported\" : [ \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_uri_parameter_supported\" : true, \"backchannel_user_code_parameter_supported\" : false, \"grant_types_supported\" : [ \"client_credentials\", \"urn:ietf:params:oauth:grant-type:uma-ticket\", \"urn:ietf:params:oauth:grant-type:device_code\", \"urn:ietf:params:oauth:grant-type:token-exchange\", \"implicit\", \"authorization_code\", \"password\", \"refresh_token\" ], \"ui_locales_supported\" : [ \"en\", \"bg\", \"de\", \"es\", \"fr\", \"it\", \"ru\", \"tr\" ], \"userinfo_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/userinfo\", \"authorization_challenge_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/authorize-challenge\", \"op_tos_uri\" : \"https://yuriyz-fond-skink.gluu.info/tos\", \"require_request_uri_registration\" : false, \"id_token_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"frontchannel_logout_session_supported\" : true, \"authorization_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"claims_locales_supported\" : [ \"en\" ], \"clientinfo_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/clientinfo\", \"request_object_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_object_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"key_from_java\" : \"value_from_script_on_java\", \"session_revocation_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/revoke_session\", \"check_session_iframe\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/opiframe.htm\", \"scopes_supported\" : [ \"address\", \"introspection\", \"https://jans.io/auth/ssa.admin\", \"online_access\", \"openid\", \"user_name\", \"clientinfo\", \"profile\", \"uma_protection\", \"permission\", \"https://jans.io/scim/users.write\", \"revoke_session\", \"https://jans.io/scim/users.read\", \"device_sso\", \"phone\", \"mobile_phone\", \"offline_access\", \"email\" ], \"backchannel_logout_supported\" : true, \"acr_values_supported\" : [ \"simple_password_auth\" ], \"request_object_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"device_authorization_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/device_authorization\", \"display_values_supported\" : [ \"page\", \"popup\" ], \"userinfo_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"require_pushed_authorization_requests\" : false, \"claim_types_supported\" : [ \"normal\" ], \"userinfo_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"end_session_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/end_session\", \"revocation_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/revoke\", \"backchannel_authentication_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/bc-authorize\", \"token_endpoint_auth_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"frontchannel_logout_supported\" : true, \"jwks_uri\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/jwks\", \"subject_types_supported\" : [ \"public\", \"pairwise\" ], \"id_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"registration_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/register\", \"id_token_token_binding_cnf_values_supported\" : [ \"tbh\" ] } ####################################################### TEST: authorizationChallengeFlow ####################################################### ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/register HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Content-Type: application/json Accept: application/json { \"grant_types\" : [ \"authorization_code\", \"refresh_token\" ], \"subject_type\" : \"public\", \"application_type\" : \"web\", \"scope\" : \"openid profile address email phone user_name\", \"minimum_acr_priority_list\" : [ ], \"redirect_uris\" : [ \"https://yuriyz-fond-skink.gluu.info/jans-auth-rp/home.htm\", \"https://client.example.com/cb\", \"https://client.example.com/cb1\", \"https://client.example.com/cb2\" ], \"client_name\" : \"jans test app\", \"additional_audience\" : [ ], \"response_types\" : [ \"code\", \"id_token\" ] } ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 201 Cache-Control: no-store Connection: Keep-Alive Content-Length: 1633 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:05 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=81dc6c45-7831-4738-b169-b087ee9a6bd6; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"allow_spontaneous_scopes\": false, \"application_type\": \"web\", \"rpt_as_jwt\": false, \"registration_client_uri\": \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/register?client_id=999e13b8-f4a2-4fed-ad3c-6c88bd2c92ea\", \"tls_client_auth_subject_dn\": \"\", \"run_introspection_script_before_jwt_creation\": false, \"registration_access_token\": \"28a50db3-b6d1-4054-a259-ef7168afa760\", \"client_id\": \"999e13b8-f4a2-4fed-ad3c-6c88bd2c92ea\", \"token_endpoint_auth_method\": \"client_secret_basic\", \"scope\": \"openid\", \"client_secret\": \"f6364c5c-295d-4e6e-bb40-6ad3a47b2119\", \"client_id_issued_at\": 1691668385, \"backchannel_logout_uri\": \"\", \"backchannel_logout_session_required\": false, \"client_name\": \"jans test app\", \"par_lifetime\": 600, \"spontaneous_scopes\": [], \"id_token_signed_response_alg\": \"RS256\", \"access_token_as_jwt\": false, \"grant_types\": [ \"authorization_code\", \"refresh_token\" ], \"subject_type\": \"public\", \"additional_token_endpoint_auth_methods\": [], \"keep_client_authorization_after_expiration\": false, \"require_par\": false, \"redirect_uris\": [ \"https://client.example.com/cb2\", \"https://client.example.com/cb1\", \"https://client.example.com/cb\", \"https://yuriyz-fond-skink.gluu.info/jans-auth-rp/home.htm\" ], \"redirect_uris_regex\": \"\", \"additional_audience\": [], \"frontchannel_logout_session_required\": false, \"client_secret_expires_at\": 1691704385, \"access_token_signing_alg\": \"RS256\", \"response_types\": [ \"code\", \"id_token\" ] } ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/authorize-challenge HTTP/1.1 Host: yuriyz-fond-skink.gluu.info client_id=999e13b8-f4a2-4fed-ad3c-6c88bd2c92ea&scope=openid+profile+address+email+phone+user_name&state=b4a41b29-51c8-4354-9c8c-fda38b4dbd43&nonce=3a56f8d0-f78e-4b15-857c-3e792801be68&prompt=&ui_locales=&claims_locales=&acr_values=&request_session_id=false&password=secret&username=admin ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Cache-Control: no-transform, no-store Connection: Keep-Alive Content-Length: 61 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:06 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=3aa95eb7-73e2-40ae-9303-34adf30a1a05; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"authorization_code\":\"9e3dc65b-937a-49c2-bdff-41fbc1a352d0\"} Successfully obtained authorization code 9e3dc65b-937a-49c2-bdff-41fbc1a352d0 at Authorization Challenge Endpoint ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/token HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Content-Type: application/x-www-form-urlencoded Authorization: Basic OTk5ZTEzYjgtZjRhMi00ZmVkLWFkM2MtNmM4OGJkMmM5MmVhOmY2MzY0YzVjLTI5NWQtNGU2ZS1iYjQwLTZhZDNhNDdiMjExOQ== grant_type=authorization_code&code=9e3dc65b-937a-49c2-bdff-41fbc1a352d0&redirect_uri=https%3A%2F%2Fyuriyz-fond-skink.gluu.info%2Fjans-auth-rp%2Fhome.htm ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Cache-Control: no-store Connection: Keep-Alive Content-Length: 1250 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:06 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=3eb3c205-6206-4a70-98fb-75bf81757976; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"access_token\":\"d87aa8d2-fefb-4d16-a775-9b9d27f73bfc\",\"refresh_token\":\"505314a7-05f5-4c9f-8900-ccb0685dea17\",\"id_token\":\"eyJraWQiOiJjb25uZWN0XzI1OGZmMmFiLWE4ODQtNDIxNy1iNmQ4LTJhMGI2NDhmOTcxZF9zaWdfcnMyNTYiLCJ0eXAiOiJqd3QiLCJhbGciOiJSUzI1NiJ9.eyJhdF9oYXNoIjoiUC04RktlejhlNHROTURTbVlGeHV5dyIsInN1YiI6IjI1Nzg0ZDQ5LTg0ZjMtNGIyNi1hZWUyLTEwNDkzMzM5MjMyZCIsImFtciI6W10sImlzcyI6Imh0dHBzOi8veXVyaXl6LWZvbmQtc2tpbmsuZ2x1dS5pbmZvIiwibm9uY2UiOiIzYTU2ZjhkMC1mNzhlLTRiMTUtODU3Yy0zZTc5MjgwMWJlNjgiLCJqYW5zT3BlbklEQ29ubmVjdFZlcnNpb24iOiJvcGVuaWRjb25uZWN0LTEuMCIsImF1ZCI6Ijk5OWUxM2I4LWY0YTItNGZlZC1hZDNjLTZjODhiZDJjOTJlYSIsInJhbmRvbSI6ImJmYmI5OTBmLWNkYTEtNGM3OC1hNjM4LWFhN2NiMjc5MjU3MiIsImFjciI6ImRlZmF1bHRfY2hhbGxlbmdlIiwiY19oYXNoIjoiTnFoSGFIenZZYjYxeDFackQwUEZVdyIsImF1dGhfdGltZSI6MTY5MTY2ODM4NiwiZXhwIjoxNjkxNjcxOTg2LCJncmFudCI6ImF1dGhvcml6YXRpb25fY29kZSIsImlhdCI6MTY5MTY2ODM4Nn0.QTUmzJaHtbPGjrV4E0MUn_fU1On44B6-_7pT0Dz_cY29s_KajGLfin3G_WsYmZA--ysyRLAmdK_X5C3W-wpkpDJ8906vuZST5547lSJGOZ45_VFv7XnTmBip3zRQOmrlxdU6OQ5Vmj3xMON_NQ-ckEUSNr65xWTAPmOQoncGYp8s-TO7ethyx6UyDTnW8d1YiXWCUYfQDQ8d5wCPHnfoYAsZCs_f0xaBUmaiwvUL3ckiXgMr2yHjWKWQuezlbjJk7ODu2cgoAzs3IWMonaixIJeeJJcOvFB4SPTnbToJe7ISvvsZTEwrLWW_E_LgTUEDqHbeWyeQI8WqDa9EOwMEFw\",\"token_type\":\"Bearer\",\"expires_in\":299} ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/token HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Content-Type: application/x-www-form-urlencoded Authorization: Basic OTk5ZTEzYjgtZjRhMi00ZmVkLWFkM2MtNmM4OGJkMmM5MmVhOmY2MzY0YzVjLTI5NWQtNGU2ZS1iYjQwLTZhZDNhNDdiMjExOQ== grant_type=refresh_token&refresh_token=505314a7-05f5-4c9f-8900-ccb0685dea17 ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Cache-Control: no-store Connection: Keep-Alive Content-Length: 166 Content-Type: application/json Date: Thu, 10 Aug 2023 11:53:08 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=88a6b7a5-3230-4f0f-b859-09df77a5c67a; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"access_token\":\"572f6422-caf9-496a-a6be-4ab39c872816\",\"refresh_token\":\"e93b6576-5297-4d9d-a92b-3276d90a75e4\",\"scope\":\"openid\",\"token_type\":\"Bearer\",\"expires_in\":299} ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /jans-auth/restv1/userinfo HTTP/1.1 HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Authorization: Bearer 572f6422-caf9-496a-a6be-4ab39c872816 ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Cache-Control: no-store, private Connection: Keep-Alive Content-Length: 46 Content-Type: application/json;charset=utf-8 Date: Thu, 10 Aug 2023 11:53:08 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=390c7a63-fe06-48a5-b3bf-2549267ba9b0; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"sub\":\"25784d49-84f3-4b26-aee2-10493339232d\"}", "title": "Full successful Authorization Challenge Flow sample"}, {"location": "janssen-server/auth-server/endpoints/authorization-challenge/#authorization-challenge-flow-sample-with-invalid-user", "text": "OpenID Connect Configuration ------------------------------------------------------- REQUEST: ------------------------------------------------------- GET /.well-known/openid-configuration HTTP/1.1 HTTP/1.1 Host: yuriyz-fond-skink.gluu.info ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 200 Connection: Keep-Alive Content-Length: 6244 Content-Type: application/json Date: Thu, 10 Aug 2023 11:57:01 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=79c5fed3-d69a-4fdf-af88-fce550cd1819; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"request_parameter_supported\" : true, \"pushed_authorization_request_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/par\", \"introspection_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/introspection\", \"claims_parameter_supported\" : false, \"issuer\" : \"https://yuriyz-fond-skink.gluu.info\", \"userinfo_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"id_token_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"access_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"authorization_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/authorize\", \"service_documentation\" : \"http://jans.org/docs\", \"authorization_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"claims_supported\" : [ \"street_address\", \"country\", \"zoneinfo\", \"birthdate\", \"role\", \"gender\", \"formatted\", \"user_name\", \"phone_mobile_number\", \"preferred_username\", \"locale\", \"inum\", \"updated_at\", \"post_office_box\", \"nickname\", \"preferred_language\", \"email\", \"website\", \"email_verified\", \"profile\", \"locality\", \"phone_number_verified\", \"room_number\", \"given_name\", \"middle_name\", \"picture\", \"name\", \"phone_number\", \"postal_code\", \"region\", \"family_name\", \"jansAdminUIRole\" ], \"ssa_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/ssa\", \"token_endpoint_auth_methods_supported\" : [ \"client_secret_basic\", \"client_secret_post\", \"client_secret_jwt\", \"private_key_jwt\", \"tls_client_auth\", \"self_signed_tls_client_auth\" ], \"tls_client_certificate_bound_access_tokens\" : true, \"response_modes_supported\" : [ \"query\", \"jwt\", \"query.jwt\", \"form_post.jwt\", \"form_post\", \"fragment\", \"fragment.jwt\" ], \"backchannel_logout_session_supported\" : true, \"token_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/token\", \"response_types_supported\" : [ \"code\", \"code id_token token\", \"id_token\", \"code id_token\", \"token\", \"id_token token\", \"code token\" ], \"authorization_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"backchannel_token_delivery_modes_supported\" : [ \"poll\", \"ping\", \"push\" ], \"dpop_signing_alg_values_supported\" : [ \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_uri_parameter_supported\" : true, \"backchannel_user_code_parameter_supported\" : false, \"grant_types_supported\" : [ \"client_credentials\", \"urn:ietf:params:oauth:grant-type:uma-ticket\", \"urn:ietf:params:oauth:grant-type:device_code\", \"urn:ietf:params:oauth:grant-type:token-exchange\", \"implicit\", \"authorization_code\", \"password\", \"refresh_token\" ], \"ui_locales_supported\" : [ \"en\", \"bg\", \"de\", \"es\", \"fr\", \"it\", \"ru\", \"tr\" ], \"userinfo_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/userinfo\", \"authorization_challenge_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/authorize-challenge\", \"op_tos_uri\" : \"https://yuriyz-fond-skink.gluu.info/tos\", \"require_request_uri_registration\" : false, \"id_token_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"frontchannel_logout_session_supported\" : true, \"authorization_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"claims_locales_supported\" : [ \"en\" ], \"clientinfo_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/clientinfo\", \"request_object_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"request_object_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"key_from_java\" : \"value_from_script_on_java\", \"session_revocation_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/revoke_session\", \"check_session_iframe\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/opiframe.htm\", \"scopes_supported\" : [ \"address\", \"introspection\", \"https://jans.io/auth/ssa.admin\", \"online_access\", \"openid\", \"user_name\", \"clientinfo\", \"profile\", \"uma_protection\", \"permission\", \"https://jans.io/scim/users.write\", \"revoke_session\", \"https://jans.io/scim/users.read\", \"device_sso\", \"phone\", \"mobile_phone\", \"offline_access\", \"email\" ], \"backchannel_logout_supported\" : true, \"acr_values_supported\" : [ \"simple_password_auth\" ], \"request_object_encryption_enc_values_supported\" : [ \"A128CBC+HS256\", \"A256CBC+HS512\", \"A128GCM\", \"A256GCM\" ], \"device_authorization_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/device_authorization\", \"display_values_supported\" : [ \"page\", \"popup\" ], \"userinfo_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"require_pushed_authorization_requests\" : false, \"claim_types_supported\" : [ \"normal\" ], \"userinfo_encryption_alg_values_supported\" : [ \"RSA1_5\", \"RSA-OAEP\", \"A128KW\", \"A256KW\" ], \"end_session_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/end_session\", \"revocation_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/revoke\", \"backchannel_authentication_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/bc-authorize\", \"token_endpoint_auth_signing_alg_values_supported\" : [ \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"frontchannel_logout_supported\" : true, \"jwks_uri\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/jwks\", \"subject_types_supported\" : [ \"public\", \"pairwise\" ], \"id_token_signing_alg_values_supported\" : [ \"none\", \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"ES256\", \"ES384\", \"ES512\", \"ES512\", \"PS256\", \"PS384\", \"PS512\" ], \"registration_endpoint\" : \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/register\", \"id_token_token_binding_cnf_values_supported\" : [ \"tbh\" ] } ####################################################### TEST: authorizationChallengeFlow ####################################################### ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/register HTTP/1.1 Host: yuriyz-fond-skink.gluu.info Content-Type: application/json Accept: application/json { \"grant_types\" : [ \"authorization_code\", \"refresh_token\" ], \"subject_type\" : \"public\", \"application_type\" : \"web\", \"scope\" : \"openid profile address email phone user_name\", \"minimum_acr_priority_list\" : [ ], \"redirect_uris\" : [ \"https://yuriyz-fond-skink.gluu.info/jans-auth-rp/home.htm\", \"https://client.example.com/cb\", \"https://client.example.com/cb1\", \"https://client.example.com/cb2\" ], \"client_name\" : \"jans test app\", \"additional_audience\" : [ ], \"response_types\" : [ \"code\", \"id_token\" ] } ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 201 Cache-Control: no-store Connection: Keep-Alive Content-Length: 1633 Content-Type: application/json Date: Thu, 10 Aug 2023 11:57:02 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=7045173c-9a96-418a-86ed-47a09749b004; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block { \"allow_spontaneous_scopes\": false, \"application_type\": \"web\", \"rpt_as_jwt\": false, \"registration_client_uri\": \"https://yuriyz-fond-skink.gluu.info/jans-auth/restv1/register?client_id=d93a5129-1546-4b9b-bf8c-ea19e36ea2c8\", \"tls_client_auth_subject_dn\": \"\", \"run_introspection_script_before_jwt_creation\": false, \"registration_access_token\": \"67aa99de-e977-4562-955d-6292f2c95df4\", \"client_id\": \"d93a5129-1546-4b9b-bf8c-ea19e36ea2c8\", \"token_endpoint_auth_method\": \"client_secret_basic\", \"scope\": \"openid\", \"client_secret\": \"f921c89c-57f0-4a91-baaa-036a4a22737b\", \"client_id_issued_at\": 1691668622, \"backchannel_logout_uri\": \"\", \"backchannel_logout_session_required\": false, \"client_name\": \"jans test app\", \"par_lifetime\": 600, \"spontaneous_scopes\": [], \"id_token_signed_response_alg\": \"RS256\", \"access_token_as_jwt\": false, \"grant_types\": [ \"authorization_code\", \"refresh_token\" ], \"subject_type\": \"public\", \"additional_token_endpoint_auth_methods\": [], \"keep_client_authorization_after_expiration\": false, \"require_par\": false, \"redirect_uris\": [ \"https://client.example.com/cb2\", \"https://client.example.com/cb1\", \"https://client.example.com/cb\", \"https://yuriyz-fond-skink.gluu.info/jans-auth-rp/home.htm\" ], \"redirect_uris_regex\": \"\", \"additional_audience\": [], \"frontchannel_logout_session_required\": false, \"client_secret_expires_at\": 1691704622, \"access_token_signing_alg\": \"RS256\", \"response_types\": [ \"code\", \"id_token\" ] } ------------------------------------------------------- REQUEST: ------------------------------------------------------- POST /jans-auth/restv1/authorize-challenge HTTP/1.1 Host: yuriyz-fond-skink.gluu.info client_id=d93a5129-1546-4b9b-bf8c-ea19e36ea2c8&scope=openid+profile+address+email+phone+user_name&state=4f925a8d-287a-4cba-a174-04d2e56109df&nonce=84c9b6dd-635c-4ca4-bba1-35c53c51a339&prompt=&ui_locales=&claims_locales=&acr_values=&request_session_id=false&password=secret&username=invalidUser ------------------------------------------------------- RESPONSE: ------------------------------------------------------- HTTP/1.1 401 Cache-Control: no-transform, no-store Connection: Keep-Alive Content-Length: 29 Content-Type: application/json Date: Thu, 10 Aug 2023 11:57:02 GMT Expires: Thu, 01 Jan 1970 00:00:00 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.41 (Ubuntu) Set-Cookie: X-Correlation-Id=4c89e007-6c77-43da-a67f-b7ee1ff0e60a; Secure; HttpOnly;HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Xss-Protection: 1; mode=block {\"error\": \"username_invalid\"}", "title": "Authorization Challenge Flow sample with invalid user"}, {"location": "janssen-server/auth-server/endpoints/authorization/", "tags": ["administration", "auth-server", "authorization", "endpoint"], "text": "Overview # Janssen Server exposes authorization endpoint compliant with OAuth2 framework . A client uses authorization endpoint to obtain an authorization grant. Based on response type requested by the client, the authorization endpoint issues an authorization code or an access token. Authorization endpoint is a protected endpoint which will require end-user authentication before issuing authorization code or access token. URL to access authorization endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration authorization_endpoint claim in the response specifies the URL for authorization endpoint. By default, authorization endpoint looks like below: https://janssen.server.host/jans-auth/restv1/authorize More information about request and response of the authorization endpoint can be found in the OpenAPI specification of jans-auth-server module . Configuration Properties # Authorization endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . issuer requirePkce fapiCompatibility forceSignedRequestObject authorizationCodeLifetime returnDeviceSecretFromAuthzEndpoint requestUriBlockList requireRequestObjectEncryption staticDecryptionKid requestUriHashVerificationEnabled legacyIdTokenClaims customHeadersWithAuthorizationResponse includeSidInResponse sessionIdRequestParameterEnabled returnDeviceSecretFromAuthzEndpoint requirePar cibaMaxExpirationTimeAllowedSec Required Client Configuration # Clients must be registered with Janssen Server as using code and/or implicit grant types in order to use authorization endpoint. Using Janssen Text-based UI(TUI) , client can be registered for appropriate grant type by navigating to Auth-Server -> Clients -> Add Client Using PKCE # Janssen Server supports PKCE , which recommended and more secure method for using code grant. PKCE can be enabled/disable by setting requirePkce property. Janssen server supports plain as well as s256 code challenge methods. Using PAR # As a separate endpoint, Janssen Server supports PAR (Pushed Authorization Requests) to enable authorization using more complex authorization requests and making it more secure at the same time. Use Janssen Server configuration property requirePar to accept only PAR requests. Using JARM # Authorization endpoint supports JWT Secured Authorization Response Mode, or JARM . Using JARM makes authorization responses more secure and compliant to be used in FAPI deployments. Janssen Server supports all response modes as defined in JARM specification Using Prompt Parameter # prompt request parameter is an ASCII string value that specifies whether the Authorization Server prompts the End-User for re-authentication and consent. Janssen Server supports none , login , consent , create and select_account values for prompt parameter. Multiple values can be specified by separating them with single space. Based on value/s of this request parameter Authorization Server prompts the End-User for re-authentication ( login ), consent or user registration details ( create ). Check Prompt page for more details. none # none value will instruct Janssen Server NOT to display any authentication or consent user interface pages. An error is returned if the End-User is not already authenticated or the Client does not have pre-configured consent for the requested scopes. This can be used as a method to check for existing authentication and/or consent. login # login value will instruct Janssen Server to prompt the End-User for re-authentication. consent # consent value will instruct Janssen Server to prompt the End-User for consent before returning information to the Client. select_account # select_account value will instruct Janssen Server to prompt the End-User to select a user account. This allows a user who has multiple accounts at the Authorization Server to select amongst the multiple accounts that they may have current sessions for. Configuring Authentication Methods # acr_values request parameter is used to specify authentication methods to be used by Janssen Server to authenticate the end user. Multiple acr values can be specified by separating them with a space. In order to use a particular acr value, the client needs to be authorized to use all the acr values in the list. If no the request doesn't specify any acr value then the default acr value configured for respective client is used by Janssen server for end user authentication. Customizing using Interception Scripts # Interception scripts allows flexibility to configure and customize multiple aspects in Janssen Server. For example, see this documentation to learn how person authentication and consent gathering can be customized using interception scripts. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Authorization"}, {"location": "janssen-server/auth-server/endpoints/authorization/#overview", "text": "Janssen Server exposes authorization endpoint compliant with OAuth2 framework . A client uses authorization endpoint to obtain an authorization grant. Based on response type requested by the client, the authorization endpoint issues an authorization code or an access token. Authorization endpoint is a protected endpoint which will require end-user authentication before issuing authorization code or access token. URL to access authorization endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration authorization_endpoint claim in the response specifies the URL for authorization endpoint. By default, authorization endpoint looks like below: https://janssen.server.host/jans-auth/restv1/authorize More information about request and response of the authorization endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/authorization/#configuration-properties", "text": "Authorization endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . issuer requirePkce fapiCompatibility forceSignedRequestObject authorizationCodeLifetime returnDeviceSecretFromAuthzEndpoint requestUriBlockList requireRequestObjectEncryption staticDecryptionKid requestUriHashVerificationEnabled legacyIdTokenClaims customHeadersWithAuthorizationResponse includeSidInResponse sessionIdRequestParameterEnabled returnDeviceSecretFromAuthzEndpoint requirePar cibaMaxExpirationTimeAllowedSec", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/authorization/#required-client-configuration", "text": "Clients must be registered with Janssen Server as using code and/or implicit grant types in order to use authorization endpoint. Using Janssen Text-based UI(TUI) , client can be registered for appropriate grant type by navigating to Auth-Server -> Clients -> Add Client", "title": "Required Client Configuration"}, {"location": "janssen-server/auth-server/endpoints/authorization/#using-pkce", "text": "Janssen Server supports PKCE , which recommended and more secure method for using code grant. PKCE can be enabled/disable by setting requirePkce property. Janssen server supports plain as well as s256 code challenge methods.", "title": "Using PKCE"}, {"location": "janssen-server/auth-server/endpoints/authorization/#using-par", "text": "As a separate endpoint, Janssen Server supports PAR (Pushed Authorization Requests) to enable authorization using more complex authorization requests and making it more secure at the same time. Use Janssen Server configuration property requirePar to accept only PAR requests.", "title": "Using PAR"}, {"location": "janssen-server/auth-server/endpoints/authorization/#using-jarm", "text": "Authorization endpoint supports JWT Secured Authorization Response Mode, or JARM . Using JARM makes authorization responses more secure and compliant to be used in FAPI deployments. Janssen Server supports all response modes as defined in JARM specification", "title": "Using JARM"}, {"location": "janssen-server/auth-server/endpoints/authorization/#using-prompt-parameter", "text": "prompt request parameter is an ASCII string value that specifies whether the Authorization Server prompts the End-User for re-authentication and consent. Janssen Server supports none , login , consent , create and select_account values for prompt parameter. Multiple values can be specified by separating them with single space. Based on value/s of this request parameter Authorization Server prompts the End-User for re-authentication ( login ), consent or user registration details ( create ). Check Prompt page for more details.", "title": "Using Prompt Parameter"}, {"location": "janssen-server/auth-server/endpoints/authorization/#none", "text": "none value will instruct Janssen Server NOT to display any authentication or consent user interface pages. An error is returned if the End-User is not already authenticated or the Client does not have pre-configured consent for the requested scopes. This can be used as a method to check for existing authentication and/or consent.", "title": "none"}, {"location": "janssen-server/auth-server/endpoints/authorization/#login", "text": "login value will instruct Janssen Server to prompt the End-User for re-authentication.", "title": "login"}, {"location": "janssen-server/auth-server/endpoints/authorization/#consent", "text": "consent value will instruct Janssen Server to prompt the End-User for consent before returning information to the Client.", "title": "consent"}, {"location": "janssen-server/auth-server/endpoints/authorization/#select_account", "text": "select_account value will instruct Janssen Server to prompt the End-User to select a user account. This allows a user who has multiple accounts at the Authorization Server to select amongst the multiple accounts that they may have current sessions for.", "title": "select_account"}, {"location": "janssen-server/auth-server/endpoints/authorization/#configuring-authentication-methods", "text": "acr_values request parameter is used to specify authentication methods to be used by Janssen Server to authenticate the end user. Multiple acr values can be specified by separating them with a space. In order to use a particular acr value, the client needs to be authorized to use all the acr values in the list. If no the request doesn't specify any acr value then the default acr value configured for respective client is used by Janssen server for end user authentication.", "title": "Configuring Authentication Methods"}, {"location": "janssen-server/auth-server/endpoints/authorization/#customizing-using-interception-scripts", "text": "Interception scripts allows flexibility to configure and customize multiple aspects in Janssen Server. For example, see this documentation to learn how person authentication and consent gathering can be customized using interception scripts.", "title": "Customizing using Interception Scripts"}, {"location": "janssen-server/auth-server/endpoints/authorization/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/", "tags": ["administration", "auth-server", "endpoint"], "text": "Backchannel authentication scripts # Janssen server enables domains to render the username/pw login form, avoiding the redirect to the IDP-hosted login page. Many SSO solutions offer a proprietary endpoint to accomplish this. However, in Janssen server, this is accomplished with the OAuth/OpenID framework by using a combination of calling the /token endpoint using the OAuth password flow, and then redirecting to browser to the /authorization endpoint, but auto-submitting the form. This article describes how to process login via backchannel and when browser is processing authorization, AS will recognize automatically the authenticated user, write cookies and then establish the session. Design # Source-code for sequence diagram Title password Grant with State Person->Browser: Navigate to website Browser->Website: Website->Browser:Display login page Person->Browser: Enter Username / PW Browser->Website: (creds) Website->IDP: /token?uid=_&pw=&browser_ip=_ IDP->Website: {\"redirect\": \"/authz/state=1F2D41A\", ...} Website->Browser: Browser->IDP: /authz?state=1F2D41A IDP->IDP: check IP address is\\n same as state IDP->Browser: write cookie / send redirect_uri Browser->Website: redirect_uri Solution # In order to process the whole authorization, idea is to use resource owner password credentials grant type in the first stage, over there process the authentication as we do today, but also write in cache a short-lived token to recognize such authenticated user, then return to the client such short-lived token. During authorization, browser should send that token as part of the custom params and in the AS we should verify if that user is already authenticated using the short-lived param in the cache, then AS will write cookies, create the session and return to the client information required for this. Jans App Configurations # Above the jans-auth record of the jansAppConf table, enable a new attribute on the jansConfDyn field Example: \"authorizationRequestCustomAllowedParameters\": [ { \"paramName\": \"bcAuthnToken\", \"returnInResponse\": true } ] Sample CURL 1. Obtain access token curl -u \"put_client_id_here:put_config_api_client_secret_here\" https:///jans-auth/restv1/token \\ -d \"grant_type=client_credentials&scope=https://jans.io/oauth/jans-auth-server/config/properties.write\" 2. Apply patch curl -X PATCH -k -H 'Content-Type: application/json-patch+json' \\ -i 'jans-config-api/api/v1/jans-auth-server/config' \\ -H \"Authorization: Bearer put_access_token_here\" --data '[ { \"op\": \"add\", \"path\": \"authorizationRequestCustomAllowedParameters\", \"value\": [ { \"paramName\": \"bcAuthnToken\", \"returnInResponse\": true } ] } ]' Custom Script Registration # In the table jansCustomScr enable 2 new scripts: 1. Script type resource_owner_password_credentials displayName ropc-backchannel [ropc-backchannel-script.py] See script below. 2. Script type person_autentication displayName backchannel-authentication [backchannel-authentication-script.py] See script below. Client Configuration # Associate script person_authentication on table jansClnt . Modify the jansAttrs field which contains a json and the ropcScripts field and add the dn from the ropc script record in the previous step Example: \"ropcScripts\": [ \"inum={SCRIPT_ID},ou=scripts,o=jans\", ], Flow # BcAuthToken request: # Firstly, the /token service is called to generate the bcAuthnToken (get it from the response header with the key Bc-Authn-Token ) In this request example, the client's basic credential is being used in order to authenticate the client, however you could use your preferred authn mode. Request curl --location --request POST 'https://jans.localhost/jans-auth/restv1/token' \\ --header 'Authorization: Basic MzE3MGNiYzUtMDAxOC00OWVmLThiYTYtMjY4MGI2NjhiZjBjOmFmNzk1ZjI1LWQ1MjktNDVlYi1iMTJlLWNjM2ExNTY5OTU1Ng==' \\ --header 'Content-Type: application/x-www-form-urlencoded' \\ --data-urlencode 'grant_type=password' \\ --data-urlencode 'username=test_user' \\ --data-urlencode 'password=test_user_password' \\ --data-urlencode 'custom1=your custom param 1' \\ --data-urlencode 'custom2=your custom param 2' \\ --data-urlencode 'scope=openid' Response HTTP/1.1 200 OK Date: Wed, 29 Jun 2022 14:03:25 GMT Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Bc-Authn-Token: dacfe4fc-d0ce-4673-9370-e66f652c4b7f Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 1109 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive {\"access_token\":\"7a024a59-e132-4c05-9126-f4f36b3d3677\",\"refresh_token\":\"184c2b60-b5c7-4250-9850-97b0f531743c\",\"scope\":\"openid\",\"id_token\":\"eyJraWQiOiJmZGJhY2Q2Yi05YTY0LTQ2MWQtOWJlYy1jOTAyMjc5ZGI2ODZfc2lnX3JzMjU2IiwidHlwIjoiand0IiwiYWxnIjoiUlMyNTYifQ.eyJhdWQiOiIzMTcwY2JjNS0wMDE4LTQ5ZWYtOGJhNi0yNjgwYjY2OGJmMGMiLCJhY3IiOiJzaW1wbGVfcGFzc3dvcmRfYXV0aCIsInN1YiI6Il9Fa3p5aXlRdVBzUm1mYjh3WHlmTTB4U0xDckxwTDJGNnA3RWhEeWRBUHciLCJjb2RlIjoiNDY4MzQ2NjktOGQ1Yy00NmQxLTkwNWEtNmMzNDg3YzZlMDg3IiwiYW1yIjpbXSwiaXNzIjoiaHR0cHM6Ly9qYW5zLmxvY2FsaG9zdCIsImV4cCI6MTY1NjUxNTAwNiwiZ3JhbnQiOiJwYXNzd29yZCIsImlhdCI6MTY1NjUxMTQwNiwic2lkIjoiMTg0ZTllOTktNjFmNi00ZWNhLWE0ZmUtMTMwZmFmZDk1MjE1Iiwib3hPcGVuSURDb25uZWN0VmVyc2lvbiI6Im9wZW5pZGNvbm5lY3QtMS4wIn0.hW0vReGYLzC2RyBHztSFbDYoaYHcCYxatX1lpzWqyW5U2S9eNp58mKKmvdZmMc229Sz5VxqfYflpWuI_6aXsLFR_KT9FY3exSRIRtPiD_fUETdhsVuKWavumVnjvwdAM6ytu5ORJx06DCxEgaG1uXmRiE9GoT8F1uqeo4NxURhVNXmMd2fiiUmgm1lt3-kNhlSg6vMDJS1Aq1idm-XhiSVy895BY-JdpLEGJEycPKr1lpsBTcmasbFNBJv6_orKWlvvgFCVxo7XmbH7Xnmqi6UUo30L6sULqmCsTLa6DaWYfGokHz_0xRflw_Ihv9wlVq8gSdOZGoMaVGzDdKlddZw\",\"token_type\":\"Bearer\",\"expires_in\":299} Authorize request: # Once you have gotten the bcAuthnToken from the previous /token call, you must call authorize attaching the bcAuthnToken as a parameter and in the acr_values param send the name of the backchannel-authentication registered in previous steps. This script will generate cookies and session associated with the browser if the BcAuthToken is valid. Example: https://jans.localhost/jans-auth/restv1/authorize?response_type=code&client_id=3170cbc5-0018-49ef-8ba6-2680b668bf0c&scope=openid+profile+address+email&redirect_uri=https://jans.localhost/jans-auth-rp/home.htm&state=2f78eaf1-d73e-49f2-8f50-e5faef80808a&nonce=92c3a631-db54-4ae9-bd53-caf92a4adbcf&prompt=&ui_locales=&claims_locales=&acr_values=backchannel-authentication&request_session_id=false&bcAuthnToken={your bcAuthnToken} This call will redirect to the redirect_uri that you sent as a parameter in the call and will receive a code as well, after that the process is more or less the same than the regular flow. Request /token: # With the code obtained previously, you must call /token again, adding the parameter code Request: curl --location --request POST 'https://jans.localhost/jans-auth/restv1/token' \\ --header 'Authorization: Basic MzlhNjlmYzAtNzNmYy00MWJhLWFiMGYtNDJhNWFmYWI2MjllOmJmMDRlZTM4LTM0MTktNGEzNS05YTI5LTcyODlmY2JkNzc2Zg==' \\ --header 'Content-Type: application/x-www-form-urlencoded' \\ --data-urlencode 'grant_type=authorization_code' \\ --data-urlencode 'code=d449a7b9-10f6-4320-b257-05fee91d3c16' \\ --data-urlencode 'redirect_uri=https://jans.localhost/jans-auth-rp/home.htm' Response: HTTP/1.1 200 OK Date: Wed, 29 Jun 2022 15:20:50 GMT Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 1291 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive {\"access_token\":\"896b04a2-fcbe-4466-89b9-184930b8675b\",\"refresh_token\":\"843995ef-cd0e-4b2c-9b91-7c68081325ab\",\"id_token\":\"eyJraWQiOiJmZGJhY2Q2Yi05YTY0LTQ2MWQtOWJlYy1jOTAyMjc5ZGI2ODZfc2lnX3JzMjU2IiwidHlwIjoiand0IiwiYWxnIjoiUlMyNTYifQ.eyJhdF9oYXNoIjoiMmx5OXh5emthMmc2T09HcVRPTmhqdyIsInN1YiI6Il9Fa3p5aXlRdVBzUm1mYjh3WHlmTTB4U0xDckxwTDJGNnA3RWhEeWRBUHciLCJjb2RlIjoiMjdiNjM0NTItMTE1My00ZDk5LTlkYzQtYzMyNGRmNjIwYWE0IiwiYW1yIjpbIjEwIl0sImlzcyI6Imh0dHBzOi8vamFucy5sb2NhbGhvc3QiLCJub25jZSI6IjkyYzNhNjMxLWRiNTQtNGFlOS1iZDUzLWNhZjkyYTRhZGJjZiIsInNpZCI6ImQzZDFlOWY2LWE1NTMtNDI2ZC04MWQ1LTE0YTFiZjg0MDJhNCIsIm94T3BlbklEQ29ubmVjdFZlcnNpb24iOiJvcGVuaWRjb25uZWN0LTEuMCIsImF1ZCI6IjMxNzBjYmM1LTAwMTgtNDllZi04YmE2LTI2ODBiNjY4YmYwYyIsImFjciI6InJvcGMtYmFja2NoYW5uZWwiLCJjX2hhc2giOiJzZVkxTldwNmN6ZGppUEdTWktqQlZRIiwiYXV0aF90aW1lIjoxNjU2NTE2MDM4LCJleHAiOjE2NTY1MTk2NTAsImdyYW50IjoiYXV0aG9yaXphdGlvbl9jb2RlIiwiaWF0IjoxNjU2NTE2MDUwfQ.giFYGuN-VUNSVMMT4bBkoGsZ-rKlByqe6qv24jzp7pk2eCY4FawiaLHJqH9MzBN7uEauRXYNR2pa_0oGoYnNNg4zbFiSARSKVsajcrPeDUgNs71MjMOYCH5dukXB7X5SEP3Drz5njxuXswI_EjM2Cd0OtJMoHQ0_IP_C3rzwmaQQsgWk81yAXl-eM4zABYV1e9OObGFqPtVjoHmpbFbg-teoRTr_LxYgKPwB1XnRqD4G9No7oV-9q1Bv1ED9AU6zxLWf9aGE2gQIC-jgkr7LZ5pB4zYgU_DwgmpaAuW_AT8ApfnQPqgNy7YouIPWZ8pyoncLjF0SdStVPEoreRx7GA\",\"token_type\":\"Bearer\",\"expires_in\":299} With info, you could do whatever you want using browser session. NOTE: I added some custom params in case you need to validate something else, for instance browser IP. Script templates # These scripts are examples of how it worked, but you could customize them based on your needs, for instance browser validations. Backchannel authentication script # from io.jans.service.cdi.util import CdiUtil from io.jans.as.server.security import Identity from io.jans.model.custom.script.type.auth import PersonAuthenticationType from io.jans.as.server.service import AuthenticationService from io.jans.util import StringHelper from io.jans.as.server.util import ServerUtil from io.jans.service.cache import CacheProvider from io.jans.as.server.service import SessionIdService from io.jans.as.server.service import CookieService from io.jans.as.server.security import Identity from io.jans.service.cache import CacheProvider import java class PersonAuthentication(PersonAuthenticationType): def __init__(self, currentTimeMillis): self.currentTimeMillis = currentTimeMillis def init(self, customScript, configurationAttributes): print \"Backchannel Authentication. Initialization\" print \"Backchannel Authentication. Initialized successfully\" return True def destroy(self, configurationAttributes): print \"Backchannel Authentication. Destroy\" print \"Backchannel Authentication. Destroyed successfully\" return True def getAuthenticationMethodClaims(self, requestParameters): return None def getApiVersion(self): return 11 def isValidAuthenticationMethod(self, usageType, configurationAttributes): return True def getAlternativeAuthenticationMethod(self, usageType, configurationAttributes): return None def authenticate(self, configurationAttributes, requestParameters, step): print \"Backchannel Authentication. Authenticate\" # Get bcAuthnToken from params bcAuthnToken = ServerUtil.getFirstValue(requestParameters, \"bcAuthnToken\") print \"Backchannel Authentication. Get bcAuthnToken from params: '%s'\" % (bcAuthnToken) if (bcAuthnToken == None): return False # Get sessionDn from cacheProvider cacheProvider = CdiUtil.bean(CacheProvider) sessionCacheDn = cacheProvider.get(bcAuthnToken) print \"Backchannel Authentication. Get sessionCacheDn from cacheProvider: '%s'\" % (sessionCacheDn) if (sessionCacheDn == None): return False # Get sessionId by sessionDn sessionId = CdiUtil.bean(SessionIdService).getSessionByDn(sessionCacheDn) print \"Backchannel Authentication. Get sessionId from sessionIdService: '%s'\" % ('None' if sessionId == None else sessionId.getId()) if (sessionId == None): return False # Write sessionId in cookies CdiUtil.bean(CookieService).createSessionIdCookie(sessionId, False) print \"Backchannel Authentication. Set session in Cookie\" # Set sessionId in Identity identity = CdiUtil.bean(Identity) identity.setSessionId(sessionId) print \"Backchannel Authentication. Set session in Identity\" # Remove bcAuthnToken from cacheProvider cacheProvider.remove(bcAuthnToken) print \"Backchannel Authentication. Removed cacheProvider bcAuthnToken: '%s'\" % bcAuthnToken return True def prepareForStep(self, configurationAttributes, requestParameters, step): if (step == 1): return True else: return False def getExtraParametersForStep(self, configurationAttributes, step): return None def getCountAuthenticationSteps(self, configurationAttributes): return 1 def getPageForStep(self, configurationAttributes, step): return \"postlogin.xhtml\" def getNextStep(self, configurationAttributes, requestParameters, step): return -1 def getLogoutExternalUrl(self, configurationAttributes, requestParameters): return None def logout(self, configurationAttributes, requestParameters): return True ROPC backchannel script # from io.jans.model.custom.script.type.owner import ResourceOwnerPasswordCredentialsType from io.jans.as.server.service import AuthenticationService, SessionIdService from io.jans.as.server.security import Identity from io.jans.service.cdi.util import CdiUtil from io.jans.as.model.authorize import AuthorizeRequestParam from io.jans.as.server.model.config import Constants from io.jans.util import StringHelper from java.lang import String from java.util import Date, HashMap from io.jans.service.cache import CacheProvider import uuid class ResourceOwnerPasswordCredentials(ResourceOwnerPasswordCredentialsType): def __init__(self, currentTimeMillis): self.currentTimeMillis = currentTimeMillis def init(self, customScript, configurationAttributes): print \"ROPC Backchannel. Initializing ...\" print \"ROPC Backchannel. Initialized successfully\" return True def destroy(self, configurationAttributes): print \"ROPC Backchannel. Destroying ...\" print \"ROPC Backchannel. Destroyed successfully\" return True def getApiVersion(self): return 11 def authenticate(self, context): print \"ROPC Backchannel. Authenticate\" # Do generic authentication authenticationService = CdiUtil.bean(AuthenticationService) username = context.getHttpRequest().getParameter(\"username\") password = context.getHttpRequest().getParameter(\"password\") # Add credential validation result = authenticationService.authenticate(username, password) if not result: print \"ROPC Backchannel. Authenticate. Could not authenticate user '%s' \" % username return False context.setUser(authenticationService.getAuthenticatedUser()) print \"ROPC Backchannel. Authenticate. User '%s' authenticated successfully\" % username # Get custom parameters from request customParam1Value = context.getHttpRequest().getParameter(\"custom1\") customParam2Value = context.getHttpRequest().getParameter(\"custom2\") customParameters = {} customParameters[\"custom1\"] = customParam1Value customParameters[\"custom2\"] = customParam2Value print \"ROPC Backchannel. Authenticate. User '%s'. Creating authenticated session with custom attributes: '%s'\" % (username, customParameters) session = self.createNewAuthenticatedSession(context, customParameters) # This is needed to allow store in token entry sessionId authenticationService.configureEventUser(session) print \"ROPC Backchannel. Authenticate. User '%s'. Created authenticated session: '%s'\" % (username, customParameters) return True def createNewAuthenticatedSession(self, context, customParameters={}): sessionIdService = CdiUtil.bean(SessionIdService) user = context.getUser() client = CdiUtil.bean(Identity).getSessionClient().getClient() # Add mandatory session parameters sessionAttributes = HashMap() sessionAttributes.put(Constants.AUTHENTICATED_USER, user.getUserId()) sessionAttributes.put(AuthorizeRequestParam.CLIENT_ID, client.getClientId()) # Add custom session parameters for key, value in customParameters.iteritems(): if StringHelper.isNotEmpty(value): sessionAttributes.put(key, value) # Generate authenticated session sessionId = sessionIdService.generateAuthenticatedSessionId(context.getHttpRequest(), user.getDn(), sessionAttributes) print \"ROPC Backchannel. Generated session id. DN: '%s'\" % sessionId.getDn() # Add state uuid in cache manager and response header bcAuthnToken = str(uuid.uuid4()) cacheProvider = CdiUtil.bean(CacheProvider) cacheProvider.put(300, bcAuthnToken, sessionId.getDn()) print \"ROPC Backchannel. Added cacheProvider id: '%s'\" % bcAuthnToken # Add response header Bc-Authn-Token context.getHttpResponse().setHeader(\"Bc-Authn-Token\", bcAuthnToken) print \"ROPC Backchannel. Added header Bc-Authn-Token\" return sessionId", "title": "Backchannel Authentication"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#backchannel-authentication-scripts", "text": "Janssen server enables domains to render the username/pw login form, avoiding the redirect to the IDP-hosted login page. Many SSO solutions offer a proprietary endpoint to accomplish this. However, in Janssen server, this is accomplished with the OAuth/OpenID framework by using a combination of calling the /token endpoint using the OAuth password flow, and then redirecting to browser to the /authorization endpoint, but auto-submitting the form. This article describes how to process login via backchannel and when browser is processing authorization, AS will recognize automatically the authenticated user, write cookies and then establish the session.", "title": "Backchannel authentication scripts"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#design", "text": "Source-code for sequence diagram Title password Grant with State Person->Browser: Navigate to website Browser->Website: Website->Browser:Display login page Person->Browser: Enter Username / PW Browser->Website: (creds) Website->IDP: /token?uid=_&pw=&browser_ip=_ IDP->Website: {\"redirect\": \"/authz/state=1F2D41A\", ...} Website->Browser: Browser->IDP: /authz?state=1F2D41A IDP->IDP: check IP address is\\n same as state IDP->Browser: write cookie / send redirect_uri Browser->Website: redirect_uri", "title": "Design"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#solution", "text": "In order to process the whole authorization, idea is to use resource owner password credentials grant type in the first stage, over there process the authentication as we do today, but also write in cache a short-lived token to recognize such authenticated user, then return to the client such short-lived token. During authorization, browser should send that token as part of the custom params and in the AS we should verify if that user is already authenticated using the short-lived param in the cache, then AS will write cookies, create the session and return to the client information required for this.", "title": "Solution"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#jans-app-configurations", "text": "Above the jans-auth record of the jansAppConf table, enable a new attribute on the jansConfDyn field Example: \"authorizationRequestCustomAllowedParameters\": [ { \"paramName\": \"bcAuthnToken\", \"returnInResponse\": true } ] Sample CURL 1. Obtain access token curl -u \"put_client_id_here:put_config_api_client_secret_here\" https:///jans-auth/restv1/token \\ -d \"grant_type=client_credentials&scope=https://jans.io/oauth/jans-auth-server/config/properties.write\" 2. Apply patch curl -X PATCH -k -H 'Content-Type: application/json-patch+json' \\ -i 'jans-config-api/api/v1/jans-auth-server/config' \\ -H \"Authorization: Bearer put_access_token_here\" --data '[ { \"op\": \"add\", \"path\": \"authorizationRequestCustomAllowedParameters\", \"value\": [ { \"paramName\": \"bcAuthnToken\", \"returnInResponse\": true } ] } ]'", "title": "Jans App Configurations"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#custom-script-registration", "text": "In the table jansCustomScr enable 2 new scripts: 1. Script type resource_owner_password_credentials displayName ropc-backchannel [ropc-backchannel-script.py] See script below. 2. Script type person_autentication displayName backchannel-authentication [backchannel-authentication-script.py] See script below.", "title": "Custom Script Registration"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#client-configuration", "text": "Associate script person_authentication on table jansClnt . Modify the jansAttrs field which contains a json and the ropcScripts field and add the dn from the ropc script record in the previous step Example: \"ropcScripts\": [ \"inum={SCRIPT_ID},ou=scripts,o=jans\", ],", "title": "Client Configuration"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#flow", "text": "", "title": "Flow"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#bcauthtoken-request", "text": "Firstly, the /token service is called to generate the bcAuthnToken (get it from the response header with the key Bc-Authn-Token ) In this request example, the client's basic credential is being used in order to authenticate the client, however you could use your preferred authn mode. Request curl --location --request POST 'https://jans.localhost/jans-auth/restv1/token' \\ --header 'Authorization: Basic MzE3MGNiYzUtMDAxOC00OWVmLThiYTYtMjY4MGI2NjhiZjBjOmFmNzk1ZjI1LWQ1MjktNDVlYi1iMTJlLWNjM2ExNTY5OTU1Ng==' \\ --header 'Content-Type: application/x-www-form-urlencoded' \\ --data-urlencode 'grant_type=password' \\ --data-urlencode 'username=test_user' \\ --data-urlencode 'password=test_user_password' \\ --data-urlencode 'custom1=your custom param 1' \\ --data-urlencode 'custom2=your custom param 2' \\ --data-urlencode 'scope=openid' Response HTTP/1.1 200 OK Date: Wed, 29 Jun 2022 14:03:25 GMT Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Bc-Authn-Token: dacfe4fc-d0ce-4673-9370-e66f652c4b7f Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 1109 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive {\"access_token\":\"7a024a59-e132-4c05-9126-f4f36b3d3677\",\"refresh_token\":\"184c2b60-b5c7-4250-9850-97b0f531743c\",\"scope\":\"openid\",\"id_token\":\"eyJraWQiOiJmZGJhY2Q2Yi05YTY0LTQ2MWQtOWJlYy1jOTAyMjc5ZGI2ODZfc2lnX3JzMjU2IiwidHlwIjoiand0IiwiYWxnIjoiUlMyNTYifQ.eyJhdWQiOiIzMTcwY2JjNS0wMDE4LTQ5ZWYtOGJhNi0yNjgwYjY2OGJmMGMiLCJhY3IiOiJzaW1wbGVfcGFzc3dvcmRfYXV0aCIsInN1YiI6Il9Fa3p5aXlRdVBzUm1mYjh3WHlmTTB4U0xDckxwTDJGNnA3RWhEeWRBUHciLCJjb2RlIjoiNDY4MzQ2NjktOGQ1Yy00NmQxLTkwNWEtNmMzNDg3YzZlMDg3IiwiYW1yIjpbXSwiaXNzIjoiaHR0cHM6Ly9qYW5zLmxvY2FsaG9zdCIsImV4cCI6MTY1NjUxNTAwNiwiZ3JhbnQiOiJwYXNzd29yZCIsImlhdCI6MTY1NjUxMTQwNiwic2lkIjoiMTg0ZTllOTktNjFmNi00ZWNhLWE0ZmUtMTMwZmFmZDk1MjE1Iiwib3hPcGVuSURDb25uZWN0VmVyc2lvbiI6Im9wZW5pZGNvbm5lY3QtMS4wIn0.hW0vReGYLzC2RyBHztSFbDYoaYHcCYxatX1lpzWqyW5U2S9eNp58mKKmvdZmMc229Sz5VxqfYflpWuI_6aXsLFR_KT9FY3exSRIRtPiD_fUETdhsVuKWavumVnjvwdAM6ytu5ORJx06DCxEgaG1uXmRiE9GoT8F1uqeo4NxURhVNXmMd2fiiUmgm1lt3-kNhlSg6vMDJS1Aq1idm-XhiSVy895BY-JdpLEGJEycPKr1lpsBTcmasbFNBJv6_orKWlvvgFCVxo7XmbH7Xnmqi6UUo30L6sULqmCsTLa6DaWYfGokHz_0xRflw_Ihv9wlVq8gSdOZGoMaVGzDdKlddZw\",\"token_type\":\"Bearer\",\"expires_in\":299}", "title": "BcAuthToken request:"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#authorize-request", "text": "Once you have gotten the bcAuthnToken from the previous /token call, you must call authorize attaching the bcAuthnToken as a parameter and in the acr_values param send the name of the backchannel-authentication registered in previous steps. This script will generate cookies and session associated with the browser if the BcAuthToken is valid. Example: https://jans.localhost/jans-auth/restv1/authorize?response_type=code&client_id=3170cbc5-0018-49ef-8ba6-2680b668bf0c&scope=openid+profile+address+email&redirect_uri=https://jans.localhost/jans-auth-rp/home.htm&state=2f78eaf1-d73e-49f2-8f50-e5faef80808a&nonce=92c3a631-db54-4ae9-bd53-caf92a4adbcf&prompt=&ui_locales=&claims_locales=&acr_values=backchannel-authentication&request_session_id=false&bcAuthnToken={your bcAuthnToken} This call will redirect to the redirect_uri that you sent as a parameter in the call and will receive a code as well, after that the process is more or less the same than the regular flow.", "title": "Authorize request:"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#request-token", "text": "With the code obtained previously, you must call /token again, adding the parameter code Request: curl --location --request POST 'https://jans.localhost/jans-auth/restv1/token' \\ --header 'Authorization: Basic MzlhNjlmYzAtNzNmYy00MWJhLWFiMGYtNDJhNWFmYWI2MjllOmJmMDRlZTM4LTM0MTktNGEzNS05YTI5LTcyODlmY2JkNzc2Zg==' \\ --header 'Content-Type: application/x-www-form-urlencoded' \\ --data-urlencode 'grant_type=authorization_code' \\ --data-urlencode 'code=d449a7b9-10f6-4320-b257-05fee91d3c16' \\ --data-urlencode 'redirect_uri=https://jans.localhost/jans-auth-rp/home.htm' Response: HTTP/1.1 200 OK Date: Wed, 29 Jun 2022 15:20:50 GMT Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 1291 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive {\"access_token\":\"896b04a2-fcbe-4466-89b9-184930b8675b\",\"refresh_token\":\"843995ef-cd0e-4b2c-9b91-7c68081325ab\",\"id_token\":\"eyJraWQiOiJmZGJhY2Q2Yi05YTY0LTQ2MWQtOWJlYy1jOTAyMjc5ZGI2ODZfc2lnX3JzMjU2IiwidHlwIjoiand0IiwiYWxnIjoiUlMyNTYifQ.eyJhdF9oYXNoIjoiMmx5OXh5emthMmc2T09HcVRPTmhqdyIsInN1YiI6Il9Fa3p5aXlRdVBzUm1mYjh3WHlmTTB4U0xDckxwTDJGNnA3RWhEeWRBUHciLCJjb2RlIjoiMjdiNjM0NTItMTE1My00ZDk5LTlkYzQtYzMyNGRmNjIwYWE0IiwiYW1yIjpbIjEwIl0sImlzcyI6Imh0dHBzOi8vamFucy5sb2NhbGhvc3QiLCJub25jZSI6IjkyYzNhNjMxLWRiNTQtNGFlOS1iZDUzLWNhZjkyYTRhZGJjZiIsInNpZCI6ImQzZDFlOWY2LWE1NTMtNDI2ZC04MWQ1LTE0YTFiZjg0MDJhNCIsIm94T3BlbklEQ29ubmVjdFZlcnNpb24iOiJvcGVuaWRjb25uZWN0LTEuMCIsImF1ZCI6IjMxNzBjYmM1LTAwMTgtNDllZi04YmE2LTI2ODBiNjY4YmYwYyIsImFjciI6InJvcGMtYmFja2NoYW5uZWwiLCJjX2hhc2giOiJzZVkxTldwNmN6ZGppUEdTWktqQlZRIiwiYXV0aF90aW1lIjoxNjU2NTE2MDM4LCJleHAiOjE2NTY1MTk2NTAsImdyYW50IjoiYXV0aG9yaXphdGlvbl9jb2RlIiwiaWF0IjoxNjU2NTE2MDUwfQ.giFYGuN-VUNSVMMT4bBkoGsZ-rKlByqe6qv24jzp7pk2eCY4FawiaLHJqH9MzBN7uEauRXYNR2pa_0oGoYnNNg4zbFiSARSKVsajcrPeDUgNs71MjMOYCH5dukXB7X5SEP3Drz5njxuXswI_EjM2Cd0OtJMoHQ0_IP_C3rzwmaQQsgWk81yAXl-eM4zABYV1e9OObGFqPtVjoHmpbFbg-teoRTr_LxYgKPwB1XnRqD4G9No7oV-9q1Bv1ED9AU6zxLWf9aGE2gQIC-jgkr7LZ5pB4zYgU_DwgmpaAuW_AT8ApfnQPqgNy7YouIPWZ8pyoncLjF0SdStVPEoreRx7GA\",\"token_type\":\"Bearer\",\"expires_in\":299} With info, you could do whatever you want using browser session. NOTE: I added some custom params in case you need to validate something else, for instance browser IP.", "title": "Request /token:"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#script-templates", "text": "These scripts are examples of how it worked, but you could customize them based on your needs, for instance browser validations.", "title": "Script templates"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#backchannel-authentication-script", "text": "from io.jans.service.cdi.util import CdiUtil from io.jans.as.server.security import Identity from io.jans.model.custom.script.type.auth import PersonAuthenticationType from io.jans.as.server.service import AuthenticationService from io.jans.util import StringHelper from io.jans.as.server.util import ServerUtil from io.jans.service.cache import CacheProvider from io.jans.as.server.service import SessionIdService from io.jans.as.server.service import CookieService from io.jans.as.server.security import Identity from io.jans.service.cache import CacheProvider import java class PersonAuthentication(PersonAuthenticationType): def __init__(self, currentTimeMillis): self.currentTimeMillis = currentTimeMillis def init(self, customScript, configurationAttributes): print \"Backchannel Authentication. Initialization\" print \"Backchannel Authentication. Initialized successfully\" return True def destroy(self, configurationAttributes): print \"Backchannel Authentication. Destroy\" print \"Backchannel Authentication. Destroyed successfully\" return True def getAuthenticationMethodClaims(self, requestParameters): return None def getApiVersion(self): return 11 def isValidAuthenticationMethod(self, usageType, configurationAttributes): return True def getAlternativeAuthenticationMethod(self, usageType, configurationAttributes): return None def authenticate(self, configurationAttributes, requestParameters, step): print \"Backchannel Authentication. Authenticate\" # Get bcAuthnToken from params bcAuthnToken = ServerUtil.getFirstValue(requestParameters, \"bcAuthnToken\") print \"Backchannel Authentication. Get bcAuthnToken from params: '%s'\" % (bcAuthnToken) if (bcAuthnToken == None): return False # Get sessionDn from cacheProvider cacheProvider = CdiUtil.bean(CacheProvider) sessionCacheDn = cacheProvider.get(bcAuthnToken) print \"Backchannel Authentication. Get sessionCacheDn from cacheProvider: '%s'\" % (sessionCacheDn) if (sessionCacheDn == None): return False # Get sessionId by sessionDn sessionId = CdiUtil.bean(SessionIdService).getSessionByDn(sessionCacheDn) print \"Backchannel Authentication. Get sessionId from sessionIdService: '%s'\" % ('None' if sessionId == None else sessionId.getId()) if (sessionId == None): return False # Write sessionId in cookies CdiUtil.bean(CookieService).createSessionIdCookie(sessionId, False) print \"Backchannel Authentication. Set session in Cookie\" # Set sessionId in Identity identity = CdiUtil.bean(Identity) identity.setSessionId(sessionId) print \"Backchannel Authentication. Set session in Identity\" # Remove bcAuthnToken from cacheProvider cacheProvider.remove(bcAuthnToken) print \"Backchannel Authentication. Removed cacheProvider bcAuthnToken: '%s'\" % bcAuthnToken return True def prepareForStep(self, configurationAttributes, requestParameters, step): if (step == 1): return True else: return False def getExtraParametersForStep(self, configurationAttributes, step): return None def getCountAuthenticationSteps(self, configurationAttributes): return 1 def getPageForStep(self, configurationAttributes, step): return \"postlogin.xhtml\" def getNextStep(self, configurationAttributes, requestParameters, step): return -1 def getLogoutExternalUrl(self, configurationAttributes, requestParameters): return None def logout(self, configurationAttributes, requestParameters): return True", "title": "Backchannel authentication script"}, {"location": "janssen-server/auth-server/endpoints/backchannel-authentication/#ropc-backchannel-script", "text": "from io.jans.model.custom.script.type.owner import ResourceOwnerPasswordCredentialsType from io.jans.as.server.service import AuthenticationService, SessionIdService from io.jans.as.server.security import Identity from io.jans.service.cdi.util import CdiUtil from io.jans.as.model.authorize import AuthorizeRequestParam from io.jans.as.server.model.config import Constants from io.jans.util import StringHelper from java.lang import String from java.util import Date, HashMap from io.jans.service.cache import CacheProvider import uuid class ResourceOwnerPasswordCredentials(ResourceOwnerPasswordCredentialsType): def __init__(self, currentTimeMillis): self.currentTimeMillis = currentTimeMillis def init(self, customScript, configurationAttributes): print \"ROPC Backchannel. Initializing ...\" print \"ROPC Backchannel. Initialized successfully\" return True def destroy(self, configurationAttributes): print \"ROPC Backchannel. Destroying ...\" print \"ROPC Backchannel. Destroyed successfully\" return True def getApiVersion(self): return 11 def authenticate(self, context): print \"ROPC Backchannel. Authenticate\" # Do generic authentication authenticationService = CdiUtil.bean(AuthenticationService) username = context.getHttpRequest().getParameter(\"username\") password = context.getHttpRequest().getParameter(\"password\") # Add credential validation result = authenticationService.authenticate(username, password) if not result: print \"ROPC Backchannel. Authenticate. Could not authenticate user '%s' \" % username return False context.setUser(authenticationService.getAuthenticatedUser()) print \"ROPC Backchannel. Authenticate. User '%s' authenticated successfully\" % username # Get custom parameters from request customParam1Value = context.getHttpRequest().getParameter(\"custom1\") customParam2Value = context.getHttpRequest().getParameter(\"custom2\") customParameters = {} customParameters[\"custom1\"] = customParam1Value customParameters[\"custom2\"] = customParam2Value print \"ROPC Backchannel. Authenticate. User '%s'. Creating authenticated session with custom attributes: '%s'\" % (username, customParameters) session = self.createNewAuthenticatedSession(context, customParameters) # This is needed to allow store in token entry sessionId authenticationService.configureEventUser(session) print \"ROPC Backchannel. Authenticate. User '%s'. Created authenticated session: '%s'\" % (username, customParameters) return True def createNewAuthenticatedSession(self, context, customParameters={}): sessionIdService = CdiUtil.bean(SessionIdService) user = context.getUser() client = CdiUtil.bean(Identity).getSessionClient().getClient() # Add mandatory session parameters sessionAttributes = HashMap() sessionAttributes.put(Constants.AUTHENTICATED_USER, user.getUserId()) sessionAttributes.put(AuthorizeRequestParam.CLIENT_ID, client.getClientId()) # Add custom session parameters for key, value in customParameters.iteritems(): if StringHelper.isNotEmpty(value): sessionAttributes.put(key, value) # Generate authenticated session sessionId = sessionIdService.generateAuthenticatedSessionId(context.getHttpRequest(), user.getDn(), sessionAttributes) print \"ROPC Backchannel. Generated session id. DN: '%s'\" % sessionId.getDn() # Add state uuid in cache manager and response header bcAuthnToken = str(uuid.uuid4()) cacheProvider = CdiUtil.bean(CacheProvider) cacheProvider.put(300, bcAuthnToken, sessionId.getDn()) print \"ROPC Backchannel. Added cacheProvider id: '%s'\" % bcAuthnToken # Add response header Bc-Authn-Token context.getHttpResponse().setHeader(\"Bc-Authn-Token\", bcAuthnToken) print \"ROPC Backchannel. Added header Bc-Authn-Token\" return sessionId", "title": "ROPC backchannel script"}, {"location": "janssen-server/auth-server/endpoints/client-registration/", "tags": ["administration", "auth-server", "endpoint", "DCR", "dynamic client registration"], "text": "Dynamic Client Registration (DCR) # Dynamic client registration refers to the process by which a client submits a registration request to the Authorization server and how that request is served by the Authorization server. It is explained in the following specifications: For OpenID Connect relying parties For OAuth 2.0 client (without OpenID Connect features) Client management (CRUD) operations OpenBanking OpenID Dynamic Client Registration Client Registration endpoint # The URI to dynamically register a client to a Janssen Auth Server can be found by checking the registration_endpoint claim of the OpenID Connect configuration reponse, typically deployed at https:///.well-known/openid-configuration Configuring Janssen AS to allow clients to dynamically register # The Janssen Authorization server will serve a DCR request if the following configuration parameters are set: dynamicRegistrationEnabled : true or false dynamicRegistrationExpirationTime : Expiration time in seconds for clients created with dynamic registration, 0 or -1 means never expire dcrForbidExpirationTimeInRequest : Boolean value specifying whether to allow to set client's expiration time in seconds during dynamic registration.. Default value is false . Client expiration Client expiration is set based on dynamicRegistrationExpirationTime AS configuration property or otherwise if dcrForbidExpirationTimeInRequest is false then it can be requested in Dynamic Client Registration Request via lifetime parameter which expected value in seconds. Configure the Janssen AS using steps explained in the link Client registration Requests # Client registration request primarily does two things: Communicate client metadata to the authorization server, and optionally authenticate. There are different ways in which the client metadata is communicated to the authorization server using dynamic client registration requests. Using request body Using signed request object (JWT) Using software statement Using request body # A minimal DCR request with only mandatory parameters, looks like the one below. curl -X POST -k -H 'Content-Type: application/json' -i 'https://my.jans.server/jans-auth/restv1/register' \\ --data '{\"redirect_uris\": [\"https://my.jans.client/page\"]}' If the registration is successful, Janssen Server will respond with http response code 201 with JSON body as shown in example below: { \"allow_spontaneous_scopes\" : false , \"application_type\" : \"web\" , \"rpt_as_jwt\" : false , \"registration_client_uri\" : \"https://my.jans.server/jans-auth/restv1/register?client_id=85192707-a38c-496c-806c-ef01a6a3ae4a\" , \"tls_client_auth_subject_dn\" : \"\" , \"run_introspection_script_before_jwt_creation\" : false , \"registration_access_token\" : \"eaee20de-54ce-4217-b960-6b72b55e6cab\" , \"client_id\" : \"85192707-a38c-496c-806c-ef01a6a3ae4a\" , \"token_endpoint_auth_method\" : \"client_secret_basic\" , \"scope\" : \"profile work_phone phone user_name device_sso openid permission uma_protection address email clientinfo org_name offline_access https://jans.io/auth/ssa.portal test https://jans.io/auth/ssa.admin https://jans.io/auth/ssa.developer\" , \"client_secret\" : \"4148f812-92d6-4245-80e0-243524b3b6a4\" , \"client_id_issued_at\" : 1678700818 , \"backchannel_logout_uri\" : \"\" , \"backchannel_logout_session_required\" : false , \"client_name\" : \"my.jans.client\" , \"par_lifetime\" : 600 , \"lifetime\" : 3600 , \"spontaneous_scopes\" : [], \"id_token_signed_response_alg\" : \"RS256\" , \"access_token_as_jwt\" : false , \"grant_types\" : [ \"authorization_code\" , \"refresh_token\" ], \"subject_type\" : \"pairwise\" , \"keep_client_authorization_after_expiration\" : false , \"require_par\" : false , \"redirect_uris\" : [ \"https://my.jans.client/page\" ], \"redirect_uris_regex\" : \"\" , \"additional_audience\" : [], \"frontchannel_logout_session_required\" : false , \"client_secret_expires_at\" : 1678787218 , \"access_token_signing_alg\" : \"RS256\" , \"response_types\" : [ \"code\" ] } In a typical DCR request the client or developer calls the client registration endpoint with a set of client metadata as specified in RFC7591 curl -X POST -k -i 'https://my.jans.server/jans-auth/restv1/register' \\ --data '{ \\ \"redirect_uris\": [\"https://client.example.org/cb\"] \\ \"client_id\": \"c3BhdRkqfX\", \\ \"client_secret\": \"bd136123eeffeef234235805d\", \\ \"grant_types\": [\"authorization_code\", \"refresh_token\"], \\ \"token_endpoint_auth_method\": \"client_secret_basic\", \\ \"jwks_uri\": \"https://client.example.org/my_public_keys.jwks\", \\ \"client_name\": \"My Example\", \\ \"client_name#fr\": \"Mon Exemple\" \\ }' Using signed request object (JWT) # In some use-cases like FAPI implementation, DCR request payload is a JWT. Example: curl -X POST -k -H 'Content-Type: application/jwt' \\ -H 'Accept: application/json' \\ -i 'https://my-jans-server/jans-auth/restv1/register' \\ --data 'eyJraWQiOiJrWTIyZXBUT......ueOg2HkjpggwAEP84jq9Q' When such will be the nature of client registration requests, the following configuration properties should be set in the authorization server: dcrSignatureValidationEnabled - enables DCR signature validation dcrSignatureValidationJwksUri - specifies JWKS URI for all DCR's validations. dcrSignatureValidationJwks - specifies JWKS for all DCR's validations. Configure the Janssen AS using steps explained in the link Using software statement # A signed assertion from a trusted party, a Software statement or Software Statement Assertion (SSA), is used to dynamically register clients to an Authorization server. Example: curl -X POST https://my.jans.server/jans-auth/restv1/register \\ -H \"Content-Type: application/json\" \\ --data-binary @- </jans-auth/restv1/token \\ -d \"grant_type=client_credentials&scope=https://jans.io/oauth/jans-auth-server/config/properties.write\" Patch jans-auth server configurations # Patch jans-auth server configurations to reflect anExampleConfigField with the value anExampleConfigField_value curl -X PATCH -k -H 'Content-Type: application/json-patch+json' \\ -i 'https:///jans-config-api/api/v1/jans-auth-server/config' \\ -H \"Authorization: Bearer put_access_token_here\" --data '[ { \"op\": \"add\", \"path\": \"anExampleConfigField\", \"value\": \"anExampleConfigField_value\" } ]' For example, to patch the jans-auth server configurations to reflect dynamicRegistrationEnabled with value as true curl -X PATCH -k -H 'Content-Type: application/json-patch+json' \\ -i 'https:///jans-config-api/api/v1/jans-auth-server/config' \\ -H \"Authorization: Bearer put_access_token_here\" --data '[ { \"op\": \"add\", \"path\": \"dynamicRegistrationEnabled\", \"value\": \"true\" } ]' Client metadata # Command to obtain metadata schema jans cli --schema /components/schemas/Client Output: { \"dn\" : \"string\" , \"inum\" : \"string\" , \"displayName\" : \"string\" , \"clientSecret\" : \"string\" , \"frontChannelLogoutUri\" : \"string\" , \"frontChannelLogoutSessionRequired\" : true , \"registrationAccessToken\" : \"string\" , \"clientIdIssuedAt\" : \"2022-08-31T10:39:31.385Z\" , \"clientSecretExpiresAt\" : \"2022-08-31T10:39:31.385Z\" , \"redirectUris\" : [ \"https://client.example.org/cb\" ], \"claimRedirectUris\" : [ \"string\" ], \"responseTypes\" : [ \"code\" ], \"grantTypes\" : [ \"authorization_code\" ], \"applicationType\" : \"web\" , \"contacts\" : [ \"string\" ], \"idTokenTokenBindingCnf\" : \"string\" , \"logoUri\" : \"string\" , \"clientUri\" : \"string\" , \"policyUri\" : \"string\" , \"tosUri\" : \"string\" , \"jwksUri\" : \"string\" , \"jwks\" : \"{ \\\"keys\\\" : [ { \\\"e\\\" : \\\"AQAB\\\", \\\"n\\\" : \\\"gmlDX_mgMcHX..\\\" ] }\" , \"sectorIdentifierUri\" : \"string\" , \"subjectType\" : \"pairwise\" , \"idTokenSignedResponseAlg\" : \"HS256\" , \"idTokenEncryptedResponseAlg\" : \"RSA1_5\" , \"idTokenEncryptedResponseEnc\" : \"A128CBC+HS256\" , \"userInfoSignedResponseAlg\" : \"HS256\" , \"userInfoEncryptedResponseAlg\" : \"RSA1_5\" , \"userInfoEncryptedResponseEnc\" : \"A128CBC+HS256\" , \"requestObjectSigningAlg\" : \"HS256\" , \"requestObjectEncryptionAlg\" : \"RSA1_5\" , \"requestObjectEncryptionEnc\" : \"A128CBC+HS256\" , \"tokenEndpointAuthMethod\" : \"client_secret_basic\" , \"tokenEndpointAuthSigningAlg\" : \"HS256\" , \"defaultMaxAge\" : 1000000 , \"requireAuthTime\" : true , \"defaultAcrValues\" : [ \"string\" ], \"initiateLoginUri\" : \"string\" , \"postLogoutRedirectUris\" : [ \"https://client.example.org/logout/page1\" , \"https://client.example.org/logout/page2\" , \"https://client.example.org/logout/page3\" ], \"requestUris\" : [ \"string\" ], \"scopes\" : [ \"read write dolphin\" ], \"claims\" : [ \"string\" ], \"trustedClient\" : false , \"lastAccessTime\" : \"2022-08-31T10:39:31.385Z\" , \"lastLogonTime\" : \"2022-08-31T10:39:31.385Z\" , \"persistClientAuthorizations\" : true , \"includeClaimsInIdToken\" : false , \"refreshTokenLifetime\" : 100000000 , \"accessTokenLifetime\" : 100000000 , \"customAttributes\" : [ { \"name\" : \"name, displayName, birthdate, email\" , \"multiValued\" : true , \"values\" : [ \"string\" ] } ], \"customObjectClasses\" : [ \"string\" ], \"rptAsJwt\" : true , \"accessTokenAsJwt\" : true , \"accessTokenSigningAlg\" : \"HS256\" , \"disabled\" : false , \"authorizedOrigins\" : [ \"string\" ], \"softwareId\" : \"4NRB1-0XZABZI9E6-5SM3R\" , \"softwareVersion\" : \"2.1\" , \"softwareStatement\" : \"string\" , \"attributes\" : { \"tlsClientAuthSubjectDn\" : \"string\" , \"runIntrospectionScriptBeforeAccessTokenAsJwtCreationAndIncludeClaims\" : true , \"keepClientAuthorizationAfterExpiration\" : true , \"allowSpontaneousScopes\" : true , \"spontaneousScopes\" : [ \"string\" ], \"spontaneousScopeScriptDns\" : [ \"string\" ], \"updateTokenScriptDns\" : [ \"string\" ], \"backchannelLogoutUri\" : [ \"string\" ], \"backchannelLogoutSessionRequired\" : true , \"additionalAudience\" : [ \"string\" ], \"postAuthnScripts\" : [ \"string\" ], \"consentGatheringScripts\" : [ \"string\" ], \"introspectionScripts\" : [ \"string\" ], \"rptClaimsScripts\" : [ \"string\" ], \"ropcScripts\" : [ \"string\" ], \"parLifetime\" : 0 , \"requirePar\" : true , \"jansAuthSignedRespAlg\" : \"string\" , \"jansAuthEncRespAlg\" : \"string\" , \"jansAuthEncRespEnc\" : \"string\" , \"jansSubAttr\" : \"string\" , \"redirectUrisRegex\" : \"string\" , \"jansAuthorizedAcr\" : [ \"string\" ], \"jansDefaultPromptLogin\" : true }, \"backchannelTokenDeliveryMode\" : \"poll\" , \"backchannelClientNotificationEndpoint\" : \"string\" , \"backchannelAuthenticationRequestSigningAlg\" : \"RS256\" , \"backchannelUserCodeParameter\" : true , \"expirationDate\" : \"2022-08-31T10:39:31.385Z\" , \"deletable\" : false , \"jansId\" : \"string\" , \"description\" : \"string\" } Signed DCR and SSA validation # In OpenBanking case DCR (Dynamic Client Request) is signed and must contain SSA (Software Statement Assertion) inside it. Non-Normative Example: POST /register HTTP/1.1 Content-Type: application/jwt Accept: application/json Host: auth.bankone.com eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJJREFtYX... Decoded DCR Example: { \"typ\" : \"JWT\" , \"alg\" : \"ES256\" , \"kid\" : \"ABCD1234\" } { \"iss\" : \"Amazon TPPID\" , \"iat\" : 1492760444 , \"exp\" : 1524296444 , \"aud\" : \"https://authn.gluu.org\" , \"scope\" : \"openid makepayment\" , \"token_endpoint_auth_method\" : \"private_key_jwt\" , \"grant_types\" : [ \"authorization_code\" , \"refresh_token\" , \"client_credentials\" ], \"response_types\" : [ \"code\" ], \"id_token_signed_response_alg\" : \"ES256\" , \"request_object_signing_alg\" : \"ES256\" , \"software_id\" : \"65d1f27c-4aea-4549-9c21-60e495a7a86f\" , \"software_statement\" : \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlbXB0eSIsInN1YiI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZSwic2NvcGUiOiJzY29wZTEgc2NvcGUyIiwiY2xhaW1zIjoiY2xhaW0xIGNsYWltMiIsImlhdCI6MTY2OTgwNjc2MywiZXhwIjoxNjY5ODEwMzYzfQ.db0WQh2lmHkNYCWT8tSW684hqWTPJDTElppy42XM_lc\" } { Sig nature } AS has dcrSsaValidationConfigs configuration value which holds json array. It can be used to validated both DCR and SSA. Single item of this array has following properties: id - REQUIRED primary key for the entity type - REQUIRED either ssa or dcr displayName - Human friendly name in case we build an admin GUI for this description - Human friendly details scope - For SSA only -- list of allowed scopes the issuer can enable the client to request automatically. If not present, all scopes are allowed. allowed_claims - Any claims not listed in this list will be dropped. If not present, all claims are allowed. jwks - Public key jwks_uri - URI of public key issuers - For MTLS, list of issuers trusted configuration_endpoint - points to discovery page, e.g. https://examle.com/.well-known/openid-configuration configuration_endpoint_claim - e.g. ssa_jwks_endpoint shared_secret - for MTLS HMAC One of jwks , jwks_uri or issuers or configuration_endpoint is required. Non-normative example of dcrSsaValidationConfigs [ { \"id\" : \"735ee1c0-895d-4398-9c1b-9ad852257cc0\" , \"type\" : \"DCR\" , \"scopes\" : [ \"read\" , \"write\" ], \"allowedClaims\" : [ \"exp\" , \"iat\" ], \"jwks\" : \"{jwks here}\" , \"issuers\" : [ \"Acme\" ], \"sharedSecret\" : \"secret\" }, { \"id\" : \"7907cd0b-0f9f-4b4f-aaa2-0d0614546246\" , \"type\" : \"SSA\" , \"scopes\" : [ \"my_read\" , \"my_write\" ], \"allowedClaims\" : [ \"test_exp\" , \"test_iat\" ], \"jwks\" : \"{jwks here}\" , \"issuers\" : [ \"jans-auth\" ], \"sharedSecret\" : \"secret\" }, { \"id\" : \"1e95c9b1-04d0-4440-9362-88f4e1e62d76\" , \"type\" : \"SSA\" , \"jwks\" : \"{jwks here}\" , \"issuers\" : [ \"empty\" ], \"sharedSecret\" : \"secret\" } ] Signed DCR validation # DCR can be validated with two approaches. Via dcrSsaValidationConfigs configuration property - RECOMMENDED When create entry in dcrSsaValidationConfigs configuration property : - type MUST be equal to DCR value - issuers MUST have value which equals to iss claim in DCR. Via other configuration properties trustedSsaIssuers - map of trusted SSA issuers with configuration (e.g. automatically granted scopes). When empty - no issuers validation is performed. When not empty - AS forces validation and each SSA must match at least one entry from list. automaticallyGrantedScopes - automatically granted scopes for trusted issuer { \"https://trusted.as.com\" : { \"automaticallyGrantedScopes\" : [ \"a\" , \"b\" ] }, \"https://another-trusted.as.com\" : { \"automaticallyGrantedScopes\" : [ \"d\" ] } } dcrSignatureValidationJwks - specifies JWKS for DCR's validations dcrSignatureValidationJwksUri - specifies JWKS URI for DCR's validations dcrSignatureValidationSharedSecret - if HMAC is used, this is the shared secret dcrSignatureValidationEnabled - boolean value enables DCR signature validation. Default is false dcrSignatureValidationSoftwareStatementJwksURIClaim - specifies claim name inside software statement. Value of claim should point to JWKS URI dcrSignatureValidationSoftwareStatementJwksClaim - specifies claim name inside software statement. Value of claim should point to inlined JWKS dcrAuthorizationWithClientCredentials - boolean value indicating if DCR authorization to be performed using client credentials SSA Validation # SSA is validated based on softwareStatementValidationType which is enum. softwareStatementValidationType = builtin - validation is performed against dcrSsaValidationConfigs configuration property, where type MUST be equal to SSA value issuers MUST have value which equals to iss claim in DCR. softwareStatementValidationType = script - jwks and hmac secret are returned by dynamic client registration script softwareStatementValidationType = jwks_uri , allows to specify jwks_uri claim name from software_statement. Claim name specified by softwareStatementValidationClaimName configuration property. softwareStatementValidationType = jwks , allows to specify jwks claim name from software_statement. Claim name specified by softwareStatementValidationClaimName configuration property. softwareStatementValidationType = none , no validation. Customizing the behavior of the AS using Interception script # Janssen's allows developers to register a client with the Authorization Server (AS) without any intervention by the administrator. By default, all clients are given the same default scopes and attributes. Through the use of an interception script, this behavior can be modified. These scripts can be used to analyze the registration request and apply customizations to the registered client. For example, a client can be given specific scopes by analyzing the Software Statement that is sent with the registration request. Further reading here The Use of Attestation in Dynamic Client Registration # AS supports \"The Use of Attestation in OAuth 2.0 Dynamic Client Registration\" specification draft . Specification draft does not define exact attestation request/response formats. Thus AS supports Attestation calls to Verifier via ClientRegistrationType custom script type. Use createClient method of ClientRegistrationType to prevent client creation if attestation result does not satisfy expectation. def createClient ( self , context ): print \"Client registration. CreateClient method\" registerRequest = context . getRegisterRequest () configurationAttributes = context . getConfigurationAttibutes () client = context . getClient () # getting evidence as string or as JWT evidenceAsString = registerRequest . getEvidence () evidenceAsJwt = context . getEvidence () # following code depends on attestation client used to make calls to Verifier attestationResult = attestationClient . attestation ( evidence ) if attestationResult . isFail : print \"Attestation result forbids client creation\" return False print \"Attestation result is OK\" return True Configuration options - dcrAttestationEvidenceRequired - Boolean value indicating if DCR attestation evidence is required. Default value is false . If evidence request parameter is not present and dcrAttestationEvidenceRequired is true AS returns stale_evidence error: HTTP/1.1 400 Bad Request Content-Type: application/json Cache-Control: no-store Pragma: no-cache { \"error\": \"stale_evidence\", \"error_description\": \"The provided evidence is not current.\", \"nonce\": \"lBjvTtuPbpzIaqyiAOOkrIol3WmflPUUepzUXNDFuUgMKUL\" } It is common to get nonce value from Attestation Server. In this case set dcrAttestationEvidenceRequired=false and throw error from custom script. def createClient ( self , context ): evidenceAsString = registerRequest . getEvidence () if StringHelper . isEmpty ( evidenceAsString ) nonceFromVerifier = attestationClient . requestNonce () context . createStaleEvidenceWebApplicationException ( nonceFromVerifier ) return False ... print \"Attestation result is OK\" return True context.createStaleEvidenceWebApplicationException(nonceFromVerifier) leads to stale_evidence error creation, see example above ( nonceFromVerifier must be string value). In case goal is to create own custom error, please use standard context.createWebApplicationException methods and return False from script to prevent client creation. Example entity = < construct error message > context . createWebApplicationException ( 400 , entity ) Dynamic registration custom attributes # CRUD Operations # Janssen Server allows client management through client configuration endpoint (RFC 7592) . JSON response to client registration request contains registration_client_uri and registration_access_token data elements. The URI mentioned using registration_client_uri provides functionality to read, update and delete the client. This endpoint is a protected endpoint where request has to be authenticated using access token registration_access_token . Read client metadata # A read request to the same client that got created in earlier section should be as shown in the example below. HTTP method GET is used to send the request which signifies that it is a request to read client metadata. curl -k -H 'Authorization: Bearer eaee20de-54ce-4217-b960-6b72b55e6cab' \\ -i 'https://my.jans.server/jans-auth/restv1/register?client_id=85192707-a38c-496c-806c-ef01a6a3ae4a' JSON response from Janssen Server will contain the current state of client metadata. Update client metadata # Client metadata can be updated by sending request with PUT HTTP method to registration_client_uri . Janssen Server replaces current metadata with the one sent with update request as outlined in the specification Delete Client # Client can be deleted by sending a request using DELETE method to registration_client_uri . A successful delete action will invalidate the \"client_id\", \"client_secret\", and \"registration_access_token\" for this client, thereby preventing the \"client_id\" from being used at either the authorization endpoint or token endpoint of the authorization server. Internationalization for Client metadata #", "title": "Client Registration"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#dynamic-client-registration-dcr", "text": "Dynamic client registration refers to the process by which a client submits a registration request to the Authorization server and how that request is served by the Authorization server. It is explained in the following specifications: For OpenID Connect relying parties For OAuth 2.0 client (without OpenID Connect features) Client management (CRUD) operations OpenBanking OpenID Dynamic Client Registration", "title": "Dynamic Client Registration (DCR)"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#client-registration-endpoint", "text": "The URI to dynamically register a client to a Janssen Auth Server can be found by checking the registration_endpoint claim of the OpenID Connect configuration reponse, typically deployed at https:///.well-known/openid-configuration", "title": "Client Registration endpoint"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#configuring-janssen-as-to-allow-clients-to-dynamically-register", "text": "The Janssen Authorization server will serve a DCR request if the following configuration parameters are set: dynamicRegistrationEnabled : true or false dynamicRegistrationExpirationTime : Expiration time in seconds for clients created with dynamic registration, 0 or -1 means never expire dcrForbidExpirationTimeInRequest : Boolean value specifying whether to allow to set client's expiration time in seconds during dynamic registration.. Default value is false . Client expiration Client expiration is set based on dynamicRegistrationExpirationTime AS configuration property or otherwise if dcrForbidExpirationTimeInRequest is false then it can be requested in Dynamic Client Registration Request via lifetime parameter which expected value in seconds. Configure the Janssen AS using steps explained in the link", "title": "Configuring Janssen AS to allow clients to dynamically register"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#client-registration-requests", "text": "Client registration request primarily does two things: Communicate client metadata to the authorization server, and optionally authenticate. There are different ways in which the client metadata is communicated to the authorization server using dynamic client registration requests. Using request body Using signed request object (JWT) Using software statement", "title": "Client registration Requests"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#using-request-body", "text": "A minimal DCR request with only mandatory parameters, looks like the one below. curl -X POST -k -H 'Content-Type: application/json' -i 'https://my.jans.server/jans-auth/restv1/register' \\ --data '{\"redirect_uris\": [\"https://my.jans.client/page\"]}' If the registration is successful, Janssen Server will respond with http response code 201 with JSON body as shown in example below: { \"allow_spontaneous_scopes\" : false , \"application_type\" : \"web\" , \"rpt_as_jwt\" : false , \"registration_client_uri\" : \"https://my.jans.server/jans-auth/restv1/register?client_id=85192707-a38c-496c-806c-ef01a6a3ae4a\" , \"tls_client_auth_subject_dn\" : \"\" , \"run_introspection_script_before_jwt_creation\" : false , \"registration_access_token\" : \"eaee20de-54ce-4217-b960-6b72b55e6cab\" , \"client_id\" : \"85192707-a38c-496c-806c-ef01a6a3ae4a\" , \"token_endpoint_auth_method\" : \"client_secret_basic\" , \"scope\" : \"profile work_phone phone user_name device_sso openid permission uma_protection address email clientinfo org_name offline_access https://jans.io/auth/ssa.portal test https://jans.io/auth/ssa.admin https://jans.io/auth/ssa.developer\" , \"client_secret\" : \"4148f812-92d6-4245-80e0-243524b3b6a4\" , \"client_id_issued_at\" : 1678700818 , \"backchannel_logout_uri\" : \"\" , \"backchannel_logout_session_required\" : false , \"client_name\" : \"my.jans.client\" , \"par_lifetime\" : 600 , \"lifetime\" : 3600 , \"spontaneous_scopes\" : [], \"id_token_signed_response_alg\" : \"RS256\" , \"access_token_as_jwt\" : false , \"grant_types\" : [ \"authorization_code\" , \"refresh_token\" ], \"subject_type\" : \"pairwise\" , \"keep_client_authorization_after_expiration\" : false , \"require_par\" : false , \"redirect_uris\" : [ \"https://my.jans.client/page\" ], \"redirect_uris_regex\" : \"\" , \"additional_audience\" : [], \"frontchannel_logout_session_required\" : false , \"client_secret_expires_at\" : 1678787218 , \"access_token_signing_alg\" : \"RS256\" , \"response_types\" : [ \"code\" ] } In a typical DCR request the client or developer calls the client registration endpoint with a set of client metadata as specified in RFC7591 curl -X POST -k -i 'https://my.jans.server/jans-auth/restv1/register' \\ --data '{ \\ \"redirect_uris\": [\"https://client.example.org/cb\"] \\ \"client_id\": \"c3BhdRkqfX\", \\ \"client_secret\": \"bd136123eeffeef234235805d\", \\ \"grant_types\": [\"authorization_code\", \"refresh_token\"], \\ \"token_endpoint_auth_method\": \"client_secret_basic\", \\ \"jwks_uri\": \"https://client.example.org/my_public_keys.jwks\", \\ \"client_name\": \"My Example\", \\ \"client_name#fr\": \"Mon Exemple\" \\ }'", "title": "Using request body"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#using-signed-request-object-jwt", "text": "In some use-cases like FAPI implementation, DCR request payload is a JWT. Example: curl -X POST -k -H 'Content-Type: application/jwt' \\ -H 'Accept: application/json' \\ -i 'https://my-jans-server/jans-auth/restv1/register' \\ --data 'eyJraWQiOiJrWTIyZXBUT......ueOg2HkjpggwAEP84jq9Q' When such will be the nature of client registration requests, the following configuration properties should be set in the authorization server: dcrSignatureValidationEnabled - enables DCR signature validation dcrSignatureValidationJwksUri - specifies JWKS URI for all DCR's validations. dcrSignatureValidationJwks - specifies JWKS for all DCR's validations. Configure the Janssen AS using steps explained in the link", "title": "Using signed request object (JWT)"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#using-software-statement", "text": "A signed assertion from a trusted party, a Software statement or Software Statement Assertion (SSA), is used to dynamically register clients to an Authorization server. Example: curl -X POST https://my.jans.server/jans-auth/restv1/register \\ -H \"Content-Type: application/json\" \\ --data-binary @- </jans-auth/restv1/token \\ -d \"grant_type=client_credentials&scope=https://jans.io/oauth/jans-auth-server/config/properties.write\"", "title": "Obtain the access token"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#patch-jans-auth-server-configurations", "text": "Patch jans-auth server configurations to reflect anExampleConfigField with the value anExampleConfigField_value curl -X PATCH -k -H 'Content-Type: application/json-patch+json' \\ -i 'https:///jans-config-api/api/v1/jans-auth-server/config' \\ -H \"Authorization: Bearer put_access_token_here\" --data '[ { \"op\": \"add\", \"path\": \"anExampleConfigField\", \"value\": \"anExampleConfigField_value\" } ]' For example, to patch the jans-auth server configurations to reflect dynamicRegistrationEnabled with value as true curl -X PATCH -k -H 'Content-Type: application/json-patch+json' \\ -i 'https:///jans-config-api/api/v1/jans-auth-server/config' \\ -H \"Authorization: Bearer put_access_token_here\" --data '[ { \"op\": \"add\", \"path\": \"dynamicRegistrationEnabled\", \"value\": \"true\" } ]'", "title": "Patch jans-auth server configurations"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#client-metadata", "text": "Command to obtain metadata schema jans cli --schema /components/schemas/Client Output: { \"dn\" : \"string\" , \"inum\" : \"string\" , \"displayName\" : \"string\" , \"clientSecret\" : \"string\" , \"frontChannelLogoutUri\" : \"string\" , \"frontChannelLogoutSessionRequired\" : true , \"registrationAccessToken\" : \"string\" , \"clientIdIssuedAt\" : \"2022-08-31T10:39:31.385Z\" , \"clientSecretExpiresAt\" : \"2022-08-31T10:39:31.385Z\" , \"redirectUris\" : [ \"https://client.example.org/cb\" ], \"claimRedirectUris\" : [ \"string\" ], \"responseTypes\" : [ \"code\" ], \"grantTypes\" : [ \"authorization_code\" ], \"applicationType\" : \"web\" , \"contacts\" : [ \"string\" ], \"idTokenTokenBindingCnf\" : \"string\" , \"logoUri\" : \"string\" , \"clientUri\" : \"string\" , \"policyUri\" : \"string\" , \"tosUri\" : \"string\" , \"jwksUri\" : \"string\" , \"jwks\" : \"{ \\\"keys\\\" : [ { \\\"e\\\" : \\\"AQAB\\\", \\\"n\\\" : \\\"gmlDX_mgMcHX..\\\" ] }\" , \"sectorIdentifierUri\" : \"string\" , \"subjectType\" : \"pairwise\" , \"idTokenSignedResponseAlg\" : \"HS256\" , \"idTokenEncryptedResponseAlg\" : \"RSA1_5\" , \"idTokenEncryptedResponseEnc\" : \"A128CBC+HS256\" , \"userInfoSignedResponseAlg\" : \"HS256\" , \"userInfoEncryptedResponseAlg\" : \"RSA1_5\" , \"userInfoEncryptedResponseEnc\" : \"A128CBC+HS256\" , \"requestObjectSigningAlg\" : \"HS256\" , \"requestObjectEncryptionAlg\" : \"RSA1_5\" , \"requestObjectEncryptionEnc\" : \"A128CBC+HS256\" , \"tokenEndpointAuthMethod\" : \"client_secret_basic\" , \"tokenEndpointAuthSigningAlg\" : \"HS256\" , \"defaultMaxAge\" : 1000000 , \"requireAuthTime\" : true , \"defaultAcrValues\" : [ \"string\" ], \"initiateLoginUri\" : \"string\" , \"postLogoutRedirectUris\" : [ \"https://client.example.org/logout/page1\" , \"https://client.example.org/logout/page2\" , \"https://client.example.org/logout/page3\" ], \"requestUris\" : [ \"string\" ], \"scopes\" : [ \"read write dolphin\" ], \"claims\" : [ \"string\" ], \"trustedClient\" : false , \"lastAccessTime\" : \"2022-08-31T10:39:31.385Z\" , \"lastLogonTime\" : \"2022-08-31T10:39:31.385Z\" , \"persistClientAuthorizations\" : true , \"includeClaimsInIdToken\" : false , \"refreshTokenLifetime\" : 100000000 , \"accessTokenLifetime\" : 100000000 , \"customAttributes\" : [ { \"name\" : \"name, displayName, birthdate, email\" , \"multiValued\" : true , \"values\" : [ \"string\" ] } ], \"customObjectClasses\" : [ \"string\" ], \"rptAsJwt\" : true , \"accessTokenAsJwt\" : true , \"accessTokenSigningAlg\" : \"HS256\" , \"disabled\" : false , \"authorizedOrigins\" : [ \"string\" ], \"softwareId\" : \"4NRB1-0XZABZI9E6-5SM3R\" , \"softwareVersion\" : \"2.1\" , \"softwareStatement\" : \"string\" , \"attributes\" : { \"tlsClientAuthSubjectDn\" : \"string\" , \"runIntrospectionScriptBeforeAccessTokenAsJwtCreationAndIncludeClaims\" : true , \"keepClientAuthorizationAfterExpiration\" : true , \"allowSpontaneousScopes\" : true , \"spontaneousScopes\" : [ \"string\" ], \"spontaneousScopeScriptDns\" : [ \"string\" ], \"updateTokenScriptDns\" : [ \"string\" ], \"backchannelLogoutUri\" : [ \"string\" ], \"backchannelLogoutSessionRequired\" : true , \"additionalAudience\" : [ \"string\" ], \"postAuthnScripts\" : [ \"string\" ], \"consentGatheringScripts\" : [ \"string\" ], \"introspectionScripts\" : [ \"string\" ], \"rptClaimsScripts\" : [ \"string\" ], \"ropcScripts\" : [ \"string\" ], \"parLifetime\" : 0 , \"requirePar\" : true , \"jansAuthSignedRespAlg\" : \"string\" , \"jansAuthEncRespAlg\" : \"string\" , \"jansAuthEncRespEnc\" : \"string\" , \"jansSubAttr\" : \"string\" , \"redirectUrisRegex\" : \"string\" , \"jansAuthorizedAcr\" : [ \"string\" ], \"jansDefaultPromptLogin\" : true }, \"backchannelTokenDeliveryMode\" : \"poll\" , \"backchannelClientNotificationEndpoint\" : \"string\" , \"backchannelAuthenticationRequestSigningAlg\" : \"RS256\" , \"backchannelUserCodeParameter\" : true , \"expirationDate\" : \"2022-08-31T10:39:31.385Z\" , \"deletable\" : false , \"jansId\" : \"string\" , \"description\" : \"string\" }", "title": "Client metadata"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#signed-dcr-and-ssa-validation", "text": "In OpenBanking case DCR (Dynamic Client Request) is signed and must contain SSA (Software Statement Assertion) inside it. Non-Normative Example: POST /register HTTP/1.1 Content-Type: application/jwt Accept: application/json Host: auth.bankone.com eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJJREFtYX... Decoded DCR Example: { \"typ\" : \"JWT\" , \"alg\" : \"ES256\" , \"kid\" : \"ABCD1234\" } { \"iss\" : \"Amazon TPPID\" , \"iat\" : 1492760444 , \"exp\" : 1524296444 , \"aud\" : \"https://authn.gluu.org\" , \"scope\" : \"openid makepayment\" , \"token_endpoint_auth_method\" : \"private_key_jwt\" , \"grant_types\" : [ \"authorization_code\" , \"refresh_token\" , \"client_credentials\" ], \"response_types\" : [ \"code\" ], \"id_token_signed_response_alg\" : \"ES256\" , \"request_object_signing_alg\" : \"ES256\" , \"software_id\" : \"65d1f27c-4aea-4549-9c21-60e495a7a86f\" , \"software_statement\" : \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlbXB0eSIsInN1YiI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZSwic2NvcGUiOiJzY29wZTEgc2NvcGUyIiwiY2xhaW1zIjoiY2xhaW0xIGNsYWltMiIsImlhdCI6MTY2OTgwNjc2MywiZXhwIjoxNjY5ODEwMzYzfQ.db0WQh2lmHkNYCWT8tSW684hqWTPJDTElppy42XM_lc\" } { Sig nature } AS has dcrSsaValidationConfigs configuration value which holds json array. It can be used to validated both DCR and SSA. Single item of this array has following properties: id - REQUIRED primary key for the entity type - REQUIRED either ssa or dcr displayName - Human friendly name in case we build an admin GUI for this description - Human friendly details scope - For SSA only -- list of allowed scopes the issuer can enable the client to request automatically. If not present, all scopes are allowed. allowed_claims - Any claims not listed in this list will be dropped. If not present, all claims are allowed. jwks - Public key jwks_uri - URI of public key issuers - For MTLS, list of issuers trusted configuration_endpoint - points to discovery page, e.g. https://examle.com/.well-known/openid-configuration configuration_endpoint_claim - e.g. ssa_jwks_endpoint shared_secret - for MTLS HMAC One of jwks , jwks_uri or issuers or configuration_endpoint is required. Non-normative example of dcrSsaValidationConfigs [ { \"id\" : \"735ee1c0-895d-4398-9c1b-9ad852257cc0\" , \"type\" : \"DCR\" , \"scopes\" : [ \"read\" , \"write\" ], \"allowedClaims\" : [ \"exp\" , \"iat\" ], \"jwks\" : \"{jwks here}\" , \"issuers\" : [ \"Acme\" ], \"sharedSecret\" : \"secret\" }, { \"id\" : \"7907cd0b-0f9f-4b4f-aaa2-0d0614546246\" , \"type\" : \"SSA\" , \"scopes\" : [ \"my_read\" , \"my_write\" ], \"allowedClaims\" : [ \"test_exp\" , \"test_iat\" ], \"jwks\" : \"{jwks here}\" , \"issuers\" : [ \"jans-auth\" ], \"sharedSecret\" : \"secret\" }, { \"id\" : \"1e95c9b1-04d0-4440-9362-88f4e1e62d76\" , \"type\" : \"SSA\" , \"jwks\" : \"{jwks here}\" , \"issuers\" : [ \"empty\" ], \"sharedSecret\" : \"secret\" } ]", "title": "Signed DCR and SSA validation"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#signed-dcr-validation", "text": "DCR can be validated with two approaches. Via dcrSsaValidationConfigs configuration property - RECOMMENDED When create entry in dcrSsaValidationConfigs configuration property : - type MUST be equal to DCR value - issuers MUST have value which equals to iss claim in DCR. Via other configuration properties trustedSsaIssuers - map of trusted SSA issuers with configuration (e.g. automatically granted scopes). When empty - no issuers validation is performed. When not empty - AS forces validation and each SSA must match at least one entry from list. automaticallyGrantedScopes - automatically granted scopes for trusted issuer { \"https://trusted.as.com\" : { \"automaticallyGrantedScopes\" : [ \"a\" , \"b\" ] }, \"https://another-trusted.as.com\" : { \"automaticallyGrantedScopes\" : [ \"d\" ] } } dcrSignatureValidationJwks - specifies JWKS for DCR's validations dcrSignatureValidationJwksUri - specifies JWKS URI for DCR's validations dcrSignatureValidationSharedSecret - if HMAC is used, this is the shared secret dcrSignatureValidationEnabled - boolean value enables DCR signature validation. Default is false dcrSignatureValidationSoftwareStatementJwksURIClaim - specifies claim name inside software statement. Value of claim should point to JWKS URI dcrSignatureValidationSoftwareStatementJwksClaim - specifies claim name inside software statement. Value of claim should point to inlined JWKS dcrAuthorizationWithClientCredentials - boolean value indicating if DCR authorization to be performed using client credentials", "title": "Signed DCR validation"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#ssa-validation", "text": "SSA is validated based on softwareStatementValidationType which is enum. softwareStatementValidationType = builtin - validation is performed against dcrSsaValidationConfigs configuration property, where type MUST be equal to SSA value issuers MUST have value which equals to iss claim in DCR. softwareStatementValidationType = script - jwks and hmac secret are returned by dynamic client registration script softwareStatementValidationType = jwks_uri , allows to specify jwks_uri claim name from software_statement. Claim name specified by softwareStatementValidationClaimName configuration property. softwareStatementValidationType = jwks , allows to specify jwks claim name from software_statement. Claim name specified by softwareStatementValidationClaimName configuration property. softwareStatementValidationType = none , no validation.", "title": "SSA Validation"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#customizing-the-behavior-of-the-as-using-interception-script", "text": "Janssen's allows developers to register a client with the Authorization Server (AS) without any intervention by the administrator. By default, all clients are given the same default scopes and attributes. Through the use of an interception script, this behavior can be modified. These scripts can be used to analyze the registration request and apply customizations to the registered client. For example, a client can be given specific scopes by analyzing the Software Statement that is sent with the registration request. Further reading here", "title": "Customizing the behavior of the AS using Interception script"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#the-use-of-attestation-in-dynamic-client-registration", "text": "AS supports \"The Use of Attestation in OAuth 2.0 Dynamic Client Registration\" specification draft . Specification draft does not define exact attestation request/response formats. Thus AS supports Attestation calls to Verifier via ClientRegistrationType custom script type. Use createClient method of ClientRegistrationType to prevent client creation if attestation result does not satisfy expectation. def createClient ( self , context ): print \"Client registration. CreateClient method\" registerRequest = context . getRegisterRequest () configurationAttributes = context . getConfigurationAttibutes () client = context . getClient () # getting evidence as string or as JWT evidenceAsString = registerRequest . getEvidence () evidenceAsJwt = context . getEvidence () # following code depends on attestation client used to make calls to Verifier attestationResult = attestationClient . attestation ( evidence ) if attestationResult . isFail : print \"Attestation result forbids client creation\" return False print \"Attestation result is OK\" return True Configuration options - dcrAttestationEvidenceRequired - Boolean value indicating if DCR attestation evidence is required. Default value is false . If evidence request parameter is not present and dcrAttestationEvidenceRequired is true AS returns stale_evidence error: HTTP/1.1 400 Bad Request Content-Type: application/json Cache-Control: no-store Pragma: no-cache { \"error\": \"stale_evidence\", \"error_description\": \"The provided evidence is not current.\", \"nonce\": \"lBjvTtuPbpzIaqyiAOOkrIol3WmflPUUepzUXNDFuUgMKUL\" } It is common to get nonce value from Attestation Server. In this case set dcrAttestationEvidenceRequired=false and throw error from custom script. def createClient ( self , context ): evidenceAsString = registerRequest . getEvidence () if StringHelper . isEmpty ( evidenceAsString ) nonceFromVerifier = attestationClient . requestNonce () context . createStaleEvidenceWebApplicationException ( nonceFromVerifier ) return False ... print \"Attestation result is OK\" return True context.createStaleEvidenceWebApplicationException(nonceFromVerifier) leads to stale_evidence error creation, see example above ( nonceFromVerifier must be string value). In case goal is to create own custom error, please use standard context.createWebApplicationException methods and return False from script to prevent client creation. Example entity = < construct error message > context . createWebApplicationException ( 400 , entity )", "title": "The Use of Attestation in Dynamic Client Registration"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#dynamic-registration-custom-attributes", "text": "", "title": "Dynamic registration custom attributes"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#crud-operations", "text": "Janssen Server allows client management through client configuration endpoint (RFC 7592) . JSON response to client registration request contains registration_client_uri and registration_access_token data elements. The URI mentioned using registration_client_uri provides functionality to read, update and delete the client. This endpoint is a protected endpoint where request has to be authenticated using access token registration_access_token .", "title": "CRUD Operations"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#read-client-metadata", "text": "A read request to the same client that got created in earlier section should be as shown in the example below. HTTP method GET is used to send the request which signifies that it is a request to read client metadata. curl -k -H 'Authorization: Bearer eaee20de-54ce-4217-b960-6b72b55e6cab' \\ -i 'https://my.jans.server/jans-auth/restv1/register?client_id=85192707-a38c-496c-806c-ef01a6a3ae4a' JSON response from Janssen Server will contain the current state of client metadata.", "title": "Read client metadata"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#update-client-metadata", "text": "Client metadata can be updated by sending request with PUT HTTP method to registration_client_uri . Janssen Server replaces current metadata with the one sent with update request as outlined in the specification", "title": "Update client metadata"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#delete-client", "text": "Client can be deleted by sending a request using DELETE method to registration_client_uri . A successful delete action will invalidate the \"client_id\", \"client_secret\", and \"registration_access_token\" for this client, thereby preventing the \"client_id\" from being used at either the authorization endpoint or token endpoint of the authorization server.", "title": "Delete Client"}, {"location": "janssen-server/auth-server/endpoints/client-registration/#internationalization-for-client-metadata", "text": "", "title": "Internationalization for Client metadata"}, {"location": "janssen-server/auth-server/endpoints/clientinfo/", "tags": ["administration", "auth-server", "clientinfo", "endpoint"], "text": "Overview # /clientinfo endpoint is an OAuth2 protected endpoint that is used to retrieve claims about registered client. URL to access clientinfo endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration clientinfo_endpoint claim in the response specifies the URL for clientinfo endpoint. By default, clientinfo endpoint looks like below: https://janssen.server.host/jans-auth/restv1/clientinfo Since clientinfo endpoint is an OAuth2 protected resource, a valid access token with appropriate scope is required to access the endpoint. More information about request and response of the clientinfo endpoint can be found in the OpenAPI specification of jans-auth-server module . Disabling The Endpoint Using Feature Flag # /clientinfo endpoint can be enabled or disable using clientinfo feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable clientinfo flag as required. Configuration Properties # Clientinfo endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . clientInfoEndpoint mtlsClientInfoEndpoint Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Clientinfo"}, {"location": "janssen-server/auth-server/endpoints/clientinfo/#overview", "text": "/clientinfo endpoint is an OAuth2 protected endpoint that is used to retrieve claims about registered client. URL to access clientinfo endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration clientinfo_endpoint claim in the response specifies the URL for clientinfo endpoint. By default, clientinfo endpoint looks like below: https://janssen.server.host/jans-auth/restv1/clientinfo Since clientinfo endpoint is an OAuth2 protected resource, a valid access token with appropriate scope is required to access the endpoint. More information about request and response of the clientinfo endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/clientinfo/#disabling-the-endpoint-using-feature-flag", "text": "/clientinfo endpoint can be enabled or disable using clientinfo feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable clientinfo flag as required.", "title": "Disabling The Endpoint Using Feature Flag"}, {"location": "janssen-server/auth-server/endpoints/clientinfo/#configuration-properties", "text": "Clientinfo endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . clientInfoEndpoint mtlsClientInfoEndpoint", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/clientinfo/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/endpoints/configuration/", "tags": ["administration", "auth-server", "well-known", "configuration", "endpoint"], "text": "OpenID Configuration Endpoint aka .well-known/openid-configuration # The Configuration Endpoint returns both the OP server metadata, and OAuth AS metdata, most of which is defined in the OpenID Discovery Spec , although other configuration metadata is defined in other OpenID specifications, or in OAuth specifications. If you want to customize the configuration response, you can use the OpenID Config Interception Script , which enables you to filter the results, modify claim values, or add claims. If you want to explicitly allow only certain OpenID Metadata claims, you can supply a list of the claims in the opConfigMetadataAllowList Auth Server Property. Below is a list of all the current available claims, and where they are specified. Claim Origin access_token_signing_alg_values_supported ? acr_values_supported OpenID authorization_encryption_alg_values_supported ? authorization_encryption_enc_values_supported ? authorization_endpoint OpenID authorization_signing_alg_values_supported ? backchannel_authentication_endpoint ? backchannel_logout_session_supported ? backchannel_logout_supported ? backchannel_token_delivery_modes_supported ? backchannel_user_code_parameter_supported ? check_session_iframe ? claim_types_supported ? claims_locales_supported ? claims_parameter_supported ? claims_supported OpenID clientinfo_endpoint ? device_authorization_endpoint ? display_values_supported ? dpop_signing_alg_values_supported ? end_session_endpoint ? frontchannel_logout_session_supported ? frontchannel_logout_supported ? grant_types_supported ? id_token_encryption_alg_values_supported ? id_token_encryption_enc_values_supported ? id_token_signing_alg_values_supported ? id_token_token_binding_cnf_values_supported ? introspection_endpoint ? issuer OpenID jwks_uri OpenID op_tos_uri OpenID pushed_authorization_request_endpoint ? registration_endpoint OpenID request_object_encryption_alg_values_supported OpenID request_object_encryption_enc_values_supported OpenID request_object_signing_alg_values_supported OpenID request_parameter_supported OpenID request_uri_parameter_supported OpenID require_pushed_authorization_requests ? require_request_uri_registration ? response_modes_supported OpenID response_types_supported OpenID revocation_endpoint ? scopes_supported ? service_documentation ? session_revocation_endpoint ? ssa_endpoint Janssen subject_types_supported OpenID tls_client_certificate_bound_access_tokens ? token_endpoint OpenID token_endpoint_auth_methods_supported OpenID token_endpoint_auth_signing_alg_values_supported OpenID ui_locales_supported OpenID userinfo_encryption_alg_values_supported OpenID userinfo_encryption_enc_values_supported OpenID userinfo_endpoint OpenID userinfo_signing_alg_values_supported OpenID Notes on specific OP Server Metadata claims # claims_supported Each user claim (in Jans jargon, \"Attribute\") has a property called jansHideOnDiscovery --if you don't want a claim to appear in .well-known/openid-configuration , set this to true for the Attribute entity. ssa_endpoint This is the endpoint which issues Software Statement Assertions JWT's. It is an OAuth protected endpoint.", "title": "OpenID Configuration"}, {"location": "janssen-server/auth-server/endpoints/configuration/#openid-configuration-endpoint-aka-well-knownopenid-configuration", "text": "The Configuration Endpoint returns both the OP server metadata, and OAuth AS metdata, most of which is defined in the OpenID Discovery Spec , although other configuration metadata is defined in other OpenID specifications, or in OAuth specifications. If you want to customize the configuration response, you can use the OpenID Config Interception Script , which enables you to filter the results, modify claim values, or add claims. If you want to explicitly allow only certain OpenID Metadata claims, you can supply a list of the claims in the opConfigMetadataAllowList Auth Server Property. Below is a list of all the current available claims, and where they are specified. Claim Origin access_token_signing_alg_values_supported ? acr_values_supported OpenID authorization_encryption_alg_values_supported ? authorization_encryption_enc_values_supported ? authorization_endpoint OpenID authorization_signing_alg_values_supported ? backchannel_authentication_endpoint ? backchannel_logout_session_supported ? backchannel_logout_supported ? backchannel_token_delivery_modes_supported ? backchannel_user_code_parameter_supported ? check_session_iframe ? claim_types_supported ? claims_locales_supported ? claims_parameter_supported ? claims_supported OpenID clientinfo_endpoint ? device_authorization_endpoint ? display_values_supported ? dpop_signing_alg_values_supported ? end_session_endpoint ? frontchannel_logout_session_supported ? frontchannel_logout_supported ? grant_types_supported ? id_token_encryption_alg_values_supported ? id_token_encryption_enc_values_supported ? id_token_signing_alg_values_supported ? id_token_token_binding_cnf_values_supported ? introspection_endpoint ? issuer OpenID jwks_uri OpenID op_tos_uri OpenID pushed_authorization_request_endpoint ? registration_endpoint OpenID request_object_encryption_alg_values_supported OpenID request_object_encryption_enc_values_supported OpenID request_object_signing_alg_values_supported OpenID request_parameter_supported OpenID request_uri_parameter_supported OpenID require_pushed_authorization_requests ? require_request_uri_registration ? response_modes_supported OpenID response_types_supported OpenID revocation_endpoint ? scopes_supported ? service_documentation ? session_revocation_endpoint ? ssa_endpoint Janssen subject_types_supported OpenID tls_client_certificate_bound_access_tokens ? token_endpoint OpenID token_endpoint_auth_methods_supported OpenID token_endpoint_auth_signing_alg_values_supported OpenID ui_locales_supported OpenID userinfo_encryption_alg_values_supported OpenID userinfo_encryption_enc_values_supported OpenID userinfo_endpoint OpenID userinfo_signing_alg_values_supported OpenID", "title": "OpenID Configuration Endpoint aka .well-known/openid-configuration"}, {"location": "janssen-server/auth-server/endpoints/configuration/#notes-on-specific-op-server-metadata-claims", "text": "claims_supported Each user claim (in Jans jargon, \"Attribute\") has a property called jansHideOnDiscovery --if you don't want a claim to appear in .well-known/openid-configuration , set this to true for the Attribute entity. ssa_endpoint This is the endpoint which issues Software Statement Assertions JWT's. It is an OAuth protected endpoint.", "title": "Notes on specific OP Server Metadata claims"}, {"location": "janssen-server/auth-server/endpoints/device-authorization/", "tags": ["administration", "auth-server", "endpoint", "device authorization", "RFC 8628"], "text": "Device Authorization endpoint # The URI to invoke the Device Authorization Endpoint in Janssen Auth Server can be found by checking the introspection_endpoint claim of the OpenID Connect configuration response, typically deployed at https:///.well-known/openid-configuration \"device_authorization_endpoint\" : \"https:///jans-auth/restv1/device_authorization\" Invoking the endpoint in Device Authorization Flow # The Device Authorization Grant defined by RFC 8628 contains a call to the Device Authorization endpoint in Step 2 of the diagram below. The details of the entire flow can be found in this article sequenceDiagram autonumber 1 title Oauth2.0 Device Authorization flow participant User participant Browser on Computer / Smartphone participant Device App participant Jans AS participant Third Party App User->>Device App:Opens an app on device Device App->>Jans AS:Sends authorization request \\n\"jans-server.com/jans-auth/restv1/device_authorization\" Jans AS->>Device App:Response - \\nuser_code, device_code, verification_url, interval, expiration Device App ->>User: Instructs the user to access Verification URL \\nand enter user_code note over Device App:Device App will keep polling AS for Access Token \\nuntil device authorization is completed loop till Device App recieves Access Token: Device App->>Jans AS:request Access Token Jans AS->>Device App:Response - \\naccess_denied \\nOR expired_token \\nOR authorization_pending \\nOR Access token end User->>Browser on Computer / Smartphone:Opens a browser \\nand access verification URL Browser on Computer / Smartphone->>Jans AS:send user_code to verification URL Jans AS -->> Browser on Computer / Smartphone :Login and authorization prompt Browser on Computer / Smartphone->>Jans AS:Authentication and consent Jans AS->>Jans AS: Mark device as Authorized note over Jans AS:Subsequent polling by the Device App \\nwill return an Access Token as indicated \\nby the loop above Device App->>Third Party App:Invoke API with Access Token Third Party App->>Device App: return Response Request: POST /restv1/device_authorization HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: test.jans.org Authorization: Basic MTIzLTEyMy0xMjM6WkE1aWxpTFFDYUR4 client_id=123-123-123&scope=openid+profile+address+email+phone Response: HTTP/1.1 200 Content-Length: 307 Content-Type: application/json Server: Jetty(9.4.19.v20190610) { \"user_code\": \"SJFP-DTPL\", \"device_code\": \"aeb28bdc90d806ac58d4b0f832f06c3ac9c4bd03292f0c09\", \"interval\": 5, \"verification_uri_complete\": \"https://test.jans.io:8443/device-code?user_code=SJFP-DTPL\", \"verification_uri\": \"https://test.jans.io:8443/device-code\", \"expires_in\": 1800 }", "title": "Device Authorization"}, {"location": "janssen-server/auth-server/endpoints/device-authorization/#device-authorization-endpoint", "text": "The URI to invoke the Device Authorization Endpoint in Janssen Auth Server can be found by checking the introspection_endpoint claim of the OpenID Connect configuration response, typically deployed at https:///.well-known/openid-configuration \"device_authorization_endpoint\" : \"https:///jans-auth/restv1/device_authorization\"", "title": "Device Authorization endpoint"}, {"location": "janssen-server/auth-server/endpoints/device-authorization/#invoking-the-endpoint-in-device-authorization-flow", "text": "The Device Authorization Grant defined by RFC 8628 contains a call to the Device Authorization endpoint in Step 2 of the diagram below. The details of the entire flow can be found in this article sequenceDiagram autonumber 1 title Oauth2.0 Device Authorization flow participant User participant Browser on Computer / Smartphone participant Device App participant Jans AS participant Third Party App User->>Device App:Opens an app on device Device App->>Jans AS:Sends authorization request \\n\"jans-server.com/jans-auth/restv1/device_authorization\" Jans AS->>Device App:Response - \\nuser_code, device_code, verification_url, interval, expiration Device App ->>User: Instructs the user to access Verification URL \\nand enter user_code note over Device App:Device App will keep polling AS for Access Token \\nuntil device authorization is completed loop till Device App recieves Access Token: Device App->>Jans AS:request Access Token Jans AS->>Device App:Response - \\naccess_denied \\nOR expired_token \\nOR authorization_pending \\nOR Access token end User->>Browser on Computer / Smartphone:Opens a browser \\nand access verification URL Browser on Computer / Smartphone->>Jans AS:send user_code to verification URL Jans AS -->> Browser on Computer / Smartphone :Login and authorization prompt Browser on Computer / Smartphone->>Jans AS:Authentication and consent Jans AS->>Jans AS: Mark device as Authorized note over Jans AS:Subsequent polling by the Device App \\nwill return an Access Token as indicated \\nby the loop above Device App->>Third Party App:Invoke API with Access Token Third Party App->>Device App: return Response Request: POST /restv1/device_authorization HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: test.jans.org Authorization: Basic MTIzLTEyMy0xMjM6WkE1aWxpTFFDYUR4 client_id=123-123-123&scope=openid+profile+address+email+phone Response: HTTP/1.1 200 Content-Length: 307 Content-Type: application/json Server: Jetty(9.4.19.v20190610) { \"user_code\": \"SJFP-DTPL\", \"device_code\": \"aeb28bdc90d806ac58d4b0f832f06c3ac9c4bd03292f0c09\", \"interval\": 5, \"verification_uri_complete\": \"https://test.jans.io:8443/device-code?user_code=SJFP-DTPL\", \"verification_uri\": \"https://test.jans.io:8443/device-code\", \"expires_in\": 1800 }", "title": "Invoking the endpoint in Device Authorization Flow"}, {"location": "janssen-server/auth-server/endpoints/end-session/", "tags": ["administration", "auth-server", "end-session", "endpoint"], "text": "Overview # Janssen Server's /end_session endpoint supports logout using OpenId Connect RP-initiated Logout mechanism. When using OpenID Connect Logout, it is recommended to use Front-Channel Logout. In Front-Channel Logout the browser receives a page with a list of application logout urls within an iframe. This prompts the browser to call each application logout individually and the OpenID Connect end-session endpoint via Javascript. URL to access end session endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration end_session_endpoint claim in the response specifies the URL for end session endpoint. By default, end session ndpoint looks like below: https://janssen.server.host/jans-auth/restv1/end_session Refer to this article from Gluu Server documentation to understand how end session endpoint works in Janssen Server. More information about request and response of the end session endpoint can be found in the OpenAPI specification of jans-auth-server module . Disabling The Endpoint Using Feature Flag # /end_session endpoint can be enabled or disable using END_SESSION feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable END_SESSION flag as required. Configuration Properties # End session endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . allowEndSessionWithUnmatchedSid endSessionEndpoint endSessionWithAccessToken mtlsEndSessionEndpoint rejectEndSessionIfIdTokenExpired allowPostLogoutRedirectWithoutValidation forceIdTokenHintPresence Apart from the above-mentioned server properties, the properties relevant to individual clients can be configured during client registration or can be edited later. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Clients -> logout as show in image below: Interception Scripts # Response from end session endpoint can be further customized using end session interception script. This script can be used to customize the HTML response generated from end session endpoint. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "End Session"}, {"location": "janssen-server/auth-server/endpoints/end-session/#overview", "text": "Janssen Server's /end_session endpoint supports logout using OpenId Connect RP-initiated Logout mechanism. When using OpenID Connect Logout, it is recommended to use Front-Channel Logout. In Front-Channel Logout the browser receives a page with a list of application logout urls within an iframe. This prompts the browser to call each application logout individually and the OpenID Connect end-session endpoint via Javascript. URL to access end session endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration end_session_endpoint claim in the response specifies the URL for end session endpoint. By default, end session ndpoint looks like below: https://janssen.server.host/jans-auth/restv1/end_session Refer to this article from Gluu Server documentation to understand how end session endpoint works in Janssen Server. More information about request and response of the end session endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/end-session/#disabling-the-endpoint-using-feature-flag", "text": "/end_session endpoint can be enabled or disable using END_SESSION feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable END_SESSION flag as required.", "title": "Disabling The Endpoint Using Feature Flag"}, {"location": "janssen-server/auth-server/endpoints/end-session/#configuration-properties", "text": "End session endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . allowEndSessionWithUnmatchedSid endSessionEndpoint endSessionWithAccessToken mtlsEndSessionEndpoint rejectEndSessionIfIdTokenExpired allowPostLogoutRedirectWithoutValidation forceIdTokenHintPresence Apart from the above-mentioned server properties, the properties relevant to individual clients can be configured during client registration or can be edited later. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Clients -> logout as show in image below:", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/end-session/#interception-scripts", "text": "Response from end session endpoint can be further customized using end session interception script. This script can be used to customize the HTML response generated from end session endpoint.", "title": "Interception Scripts"}, {"location": "janssen-server/auth-server/endpoints/end-session/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/endpoints/global-token-revocation/", "tags": ["administration", "auth-server", "session-revocation", "endpoint"], "text": "Overview # Janssen Server provides global token revocation endpoint to enable the client to revoke all tokens and sessions of a user. Janssen Server provides this endpoint to allow greater control and better management of sessions on OP. URL to access revocation endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration global_token_revocation_endpoint claim in the response specifies the URL for global token revocation endpoint. By default, global token revocation endpoint looks like below: https://janssen.server.host/jans-auth/restv1/global-token-revocation More information about request and response of the global token revocation endpoint can be found in the OpenAPI specification of jans-auth-server module . Usage # A request to this endpoint can revoke all tokens and sessions of one particular user. Use the request parameters to specify criteria to select the user. If there are multiple users matching the given criteria, the first found user will be affected. View full sample execution log here Disabling The Endpoint Using Feature Flag # Global Token Revocation endpoint can be enabled or disable using GLOBAL_TOKEN_REVOCATION feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable GLOBAL_TOKEN_REVOCATION flag as required. Required Scopes # A client must have the following scope in order to use this endpoint: global_token_revocation", "title": "Global Token Revocation"}, {"location": "janssen-server/auth-server/endpoints/global-token-revocation/#overview", "text": "Janssen Server provides global token revocation endpoint to enable the client to revoke all tokens and sessions of a user. Janssen Server provides this endpoint to allow greater control and better management of sessions on OP. URL to access revocation endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration global_token_revocation_endpoint claim in the response specifies the URL for global token revocation endpoint. By default, global token revocation endpoint looks like below: https://janssen.server.host/jans-auth/restv1/global-token-revocation More information about request and response of the global token revocation endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/global-token-revocation/#usage", "text": "A request to this endpoint can revoke all tokens and sessions of one particular user. Use the request parameters to specify criteria to select the user. If there are multiple users matching the given criteria, the first found user will be affected. View full sample execution log here", "title": "Usage"}, {"location": "janssen-server/auth-server/endpoints/global-token-revocation/#disabling-the-endpoint-using-feature-flag", "text": "Global Token Revocation endpoint can be enabled or disable using GLOBAL_TOKEN_REVOCATION feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable GLOBAL_TOKEN_REVOCATION flag as required.", "title": "Disabling The Endpoint Using Feature Flag"}, {"location": "janssen-server/auth-server/endpoints/global-token-revocation/#required-scopes", "text": "A client must have the following scope in order to use this endpoint: global_token_revocation", "title": "Required Scopes"}, {"location": "janssen-server/auth-server/endpoints/introspection/", "tags": ["administration", "auth-server", "endpoint", "introspection", "accessTokenAsJwt", "introspectionScriptBackwardCompatibility"], "text": "Introspection Endpoint # Introspection endpoint allows a protected resource to determine the active state of an OAuth 2.0 token and to determine meta-information about this token. This endpoint can be used to introspect both opaque token (i.e. reference tokens) and structured tokens(i.e. value tokens). This endpoint conforms to OAuth2 token introspection specifications. The URI to invoke the introspection endpoint in Janssen Server can be found by checking the introspection_endpoint claim of the OpenID Connect configuration response, typically deployed at https://janssen.server.host/.well-known/openid-configuration \"introspection_endpoint\" : \"https://janssen.server.host/jans-auth/restv1/introspection\" ` More information about request and response of the Introspection endpoint can be found in the OpenAPI specification of jans-auth-server module . Request parameters token - REQUIRED. The string value of the token. For access tokens, this is the \"access_token\" value returned from the token endpoint token_type_hint - OPTIONAL. A hint about the type of the token submitted for introspection. Not used in current implementation of the AS. response_as_jwt - OPTIONAL. Boolean value with default value false. If true, returns introspection response as JWT (signed based on client configuration used for authentication to Introspection Endpoint). Sample GET Request # Request # curl -X 'GET' 'https://janssen.server.host/jans-auth/restv1/introspection?token=368fea2b-be14-4d30-bd57-bcc4cde2033c&response_as_jwt=false' -H 'accept: application/json' -H \"Authorization: Bearer 111d51a4-2828-4b47-abce-77034cddcfb5\" Response # { \"sub\" : \"\" , \"iss\" : \"https://janssen.server.host\" , \"active\" : true , \"token_type\" : \"Bearer\" , \"client_id\" : \"1800.df1bb233-10b8-40ed-bbb9-07da50892a35\" , \"aud\" : \"1800.df1bb233-10b8-40ed-bbb9-07da50892a35\" , \"nbf\" : null , \"scope\" : \"https://jans.io/oauth/config/scripts.write\" , \"acr_values\" : null , \"cnf\" : null , \"exp\" : 1668705523 , \"iat\" : 1668705223 , \"jti\" : null , \"username\" : null } Sample POST Request # Request # curl -X 'POST' \\ 'https://janssen.server.host/jans-auth/restv1/introspection' \\ -H 'accept: application/json' \\ -H 'Content-Type: application/x-www-form-urlencoded' \\ -d 'token=eyJra....3ZkB-Ajwg' -H \"Authorization: Bearer eyJra...BpKo7g\" Response # { \"sub\" : \"\" , \"iss\" : \"https://janssen.server.host\" , \"active\" : true , \"token_type\" : \"Bearer\" , \"client_id\" : \"3000.5829c1f8-7554-41ab-a7d6-3513a5e9c4ad\" , \"aud\" : \"3000.5829c1f8-7554-41ab-a7d6-3513a5e9c4ad\" , \"nbf\" : null , \"scope\" : \"\" , \"acr_values\" : null , \"cnf\" : null , \"exp\" : 1668941216 , \"iat\" : 1668781885 , \"jti\" : null , \"username\" : null } Response as JWT # Response is returned as JWT if Accept header has value application/token-introspection+jwt or otherwise if explicit endpoint parameter response_as_jwt is set to true . POST /introspect HTTP/1.1 Host: as.example.com Accept: application/token-introspection+jwt Sample decoded JWT payload { \"iss\" : \"https://as.example.com/\" , \"aud\" : \"https://rs.example.com/resource\" , \"iat\" : 1514797892 , \"token_introspection\" : { \"active\" : true , \"iss\" : \"https://as.example.com/\" , \"aud\" : \"https://rs.example.com/resource\" , \"iat\" : 1514797822 , \"exp\" : 1514797942 , \"client_id\" : \"paiB2goo0a\" , \"scope\" : \"read write dolphin\" , \"sub\" : \"Z5O3upPC88QrAjx00dis\" , \"birthdate\" : \"1982-02-01\" , \"given_name\" : \"John\" , \"family_name\" : \"Doe\" , \"jti\" : \"t1FoCCaZd4Xv4ORJUWVUeTZfsKhW30CQCrWDDjwXy6w\" } } Sample response (line breaks in payload is for convenience) HTTP/1.1 200 OK Content-Type: application/token-introspection+jwt eyJraWQiOiJ3RzZEIiwidHlwIjoidG9rZW4taW50cm9zcGVjdGlvbitqd3QiLCJhbGc iOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FzLmV4YW1wbGUuY29tLyIsImF1ZCI6I mh0dHBzOi8vcnMuZXhhbXBsZS5jb20vcmVzb3VyY2UiLCJpYXQiOjE1MTQ3OTc4OTIs InRva2VuX2ludHJvc3BlY3Rpb24iOnsiYWN0aXZlIjp0cnVlLCJpc3MiOiJodHRwczo vL2FzLmV4YW1wbGUuY29tLyIsImF1ZCI6Imh0dHBzOi8vcnMuZXhhbXBsZS5jb20vcm Vzb3VyY2UiLCJpYXQiOjE1MTQ3OTc4MjIsImV4cCI6MTUxNDc5Nzk0MiwiY2xpZW50X 2lkIjoicGFpQjJnb28wYSIsInNjb3BlIjoicmVhZCB3cml0ZSBkb2xwaGluIiwic3Vi IjoiWjVPM3VwUEM4OFFyQWp4MDBkaXMiLCJiaXJ0aGRhdGUiOiIxOTgyLTAyLTAxIiw iZ2l2ZW5fbmFtZSI6IkpvaG4iLCJmYW1pbHlfbmFtZSI6IkRvZSIsImp0aSI6InQxRm 9DQ2FaZDRYdjRPUkpVV1ZVZVRaZnNLaFczMENRQ3JXRERqd1h5NncifX0.przJMU5Gh mNzvwtt1Sr-xa9xTkpiAg5IshbQsRiRVP_7eGR1GHYrNwQh84kxOkHCyje2g5WSRcYo sGEVIiC-eoPJJ-qBwqwSlgx9JEeCDw2W5DjrblOI_N0Jvsq_dUeOyoWVMqlOydOBhKN Y0smBrI4NZvEExucOm9WUJXMuJtvq1gBes-0go5j4TEv9sOP9uu81gqWTr_LOo6pgT0 tFFyZfWC4kbXPXiQ2YT6mxCiQRRNM-l9cBdF6Jx6IOrsfFhBuYdYQ_mlL19HgDDOFal eyqmru6lKlASOsaE8dmLSeKcX91FbG79FKN8un24iwIDCbKT9xlUFl54xWVShNDFA Disabling The Endpoint Using Feature Flag # /introspection endpoint can be enabled or disable using END_SESSION feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable INTROSPECTION flag as required. Configuration Properties # Introspection endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . introspectionEndpoint mtlsIntrospectionEndpoint introspectionSkipAuthorization introspectionScriptBackwardCompatibility introspectionAccessTokenMustHaveUmaProtectionScope introspectionAccessTokenMustHaveIntrospectionScope introspectionResponseScopesBackwardCompatibility There difference between introspectionAccessTokenMustHaveUmaProtectionScope and introspectionAccessTokenMustHaveIntrospectionScope is that uma_protection scope is enabled for Dynamic Client Registration while introspection scope is not. Thus if set introspectionAccessTokenMustHaveIntrospectionScope to true value allows disable access to Introspection Endpoint to all clients which does not have explicitly granted introspection scope. Customising Introspection Endpoint Behaviour using Custom script: # Customizing certain aspects of endpoint behaviour, for example, one can modify claims of an access token as JWT, using introspection scripts . Use update token introspection script for transformation of claims and values in id-token and access-token. Configure below-mentioned client properties to enable usage of introspection scripts. When using Janssen Text-based UI(TUI) to configure these client properties, navigate to accessTokenAsJwt : Auth Server -> Clients ->select the client-> Tokens -> Access Token Type ->Select JWT runIntrospectionScriptBeforeJwtCreation : Auth Server -> Clients ->select the client-> Tokens ->enable Run Introspection Script before JWT access token creation References for custom scripts # Interface - IntrospectionType Introspection scripts Introspection script vs Update Token Script", "title": "Introspection"}, {"location": "janssen-server/auth-server/endpoints/introspection/#introspection-endpoint", "text": "Introspection endpoint allows a protected resource to determine the active state of an OAuth 2.0 token and to determine meta-information about this token. This endpoint can be used to introspect both opaque token (i.e. reference tokens) and structured tokens(i.e. value tokens). This endpoint conforms to OAuth2 token introspection specifications. The URI to invoke the introspection endpoint in Janssen Server can be found by checking the introspection_endpoint claim of the OpenID Connect configuration response, typically deployed at https://janssen.server.host/.well-known/openid-configuration \"introspection_endpoint\" : \"https://janssen.server.host/jans-auth/restv1/introspection\" ` More information about request and response of the Introspection endpoint can be found in the OpenAPI specification of jans-auth-server module . Request parameters token - REQUIRED. The string value of the token. For access tokens, this is the \"access_token\" value returned from the token endpoint token_type_hint - OPTIONAL. A hint about the type of the token submitted for introspection. Not used in current implementation of the AS. response_as_jwt - OPTIONAL. Boolean value with default value false. If true, returns introspection response as JWT (signed based on client configuration used for authentication to Introspection Endpoint).", "title": "Introspection Endpoint"}, {"location": "janssen-server/auth-server/endpoints/introspection/#sample-get-request", "text": "", "title": "Sample GET Request"}, {"location": "janssen-server/auth-server/endpoints/introspection/#request", "text": "curl -X 'GET' 'https://janssen.server.host/jans-auth/restv1/introspection?token=368fea2b-be14-4d30-bd57-bcc4cde2033c&response_as_jwt=false' -H 'accept: application/json' -H \"Authorization: Bearer 111d51a4-2828-4b47-abce-77034cddcfb5\"", "title": "Request"}, {"location": "janssen-server/auth-server/endpoints/introspection/#response", "text": "{ \"sub\" : \"\" , \"iss\" : \"https://janssen.server.host\" , \"active\" : true , \"token_type\" : \"Bearer\" , \"client_id\" : \"1800.df1bb233-10b8-40ed-bbb9-07da50892a35\" , \"aud\" : \"1800.df1bb233-10b8-40ed-bbb9-07da50892a35\" , \"nbf\" : null , \"scope\" : \"https://jans.io/oauth/config/scripts.write\" , \"acr_values\" : null , \"cnf\" : null , \"exp\" : 1668705523 , \"iat\" : 1668705223 , \"jti\" : null , \"username\" : null }", "title": "Response"}, {"location": "janssen-server/auth-server/endpoints/introspection/#sample-post-request", "text": "", "title": "Sample POST Request"}, {"location": "janssen-server/auth-server/endpoints/introspection/#request_1", "text": "curl -X 'POST' \\ 'https://janssen.server.host/jans-auth/restv1/introspection' \\ -H 'accept: application/json' \\ -H 'Content-Type: application/x-www-form-urlencoded' \\ -d 'token=eyJra....3ZkB-Ajwg' -H \"Authorization: Bearer eyJra...BpKo7g\"", "title": "Request"}, {"location": "janssen-server/auth-server/endpoints/introspection/#response_1", "text": "{ \"sub\" : \"\" , \"iss\" : \"https://janssen.server.host\" , \"active\" : true , \"token_type\" : \"Bearer\" , \"client_id\" : \"3000.5829c1f8-7554-41ab-a7d6-3513a5e9c4ad\" , \"aud\" : \"3000.5829c1f8-7554-41ab-a7d6-3513a5e9c4ad\" , \"nbf\" : null , \"scope\" : \"\" , \"acr_values\" : null , \"cnf\" : null , \"exp\" : 1668941216 , \"iat\" : 1668781885 , \"jti\" : null , \"username\" : null }", "title": "Response"}, {"location": "janssen-server/auth-server/endpoints/introspection/#response-as-jwt", "text": "Response is returned as JWT if Accept header has value application/token-introspection+jwt or otherwise if explicit endpoint parameter response_as_jwt is set to true . POST /introspect HTTP/1.1 Host: as.example.com Accept: application/token-introspection+jwt Sample decoded JWT payload { \"iss\" : \"https://as.example.com/\" , \"aud\" : \"https://rs.example.com/resource\" , \"iat\" : 1514797892 , \"token_introspection\" : { \"active\" : true , \"iss\" : \"https://as.example.com/\" , \"aud\" : \"https://rs.example.com/resource\" , \"iat\" : 1514797822 , \"exp\" : 1514797942 , \"client_id\" : \"paiB2goo0a\" , \"scope\" : \"read write dolphin\" , \"sub\" : \"Z5O3upPC88QrAjx00dis\" , \"birthdate\" : \"1982-02-01\" , \"given_name\" : \"John\" , \"family_name\" : \"Doe\" , \"jti\" : \"t1FoCCaZd4Xv4ORJUWVUeTZfsKhW30CQCrWDDjwXy6w\" } } Sample response (line breaks in payload is for convenience) HTTP/1.1 200 OK Content-Type: application/token-introspection+jwt eyJraWQiOiJ3RzZEIiwidHlwIjoidG9rZW4taW50cm9zcGVjdGlvbitqd3QiLCJhbGc iOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FzLmV4YW1wbGUuY29tLyIsImF1ZCI6I mh0dHBzOi8vcnMuZXhhbXBsZS5jb20vcmVzb3VyY2UiLCJpYXQiOjE1MTQ3OTc4OTIs InRva2VuX2ludHJvc3BlY3Rpb24iOnsiYWN0aXZlIjp0cnVlLCJpc3MiOiJodHRwczo vL2FzLmV4YW1wbGUuY29tLyIsImF1ZCI6Imh0dHBzOi8vcnMuZXhhbXBsZS5jb20vcm Vzb3VyY2UiLCJpYXQiOjE1MTQ3OTc4MjIsImV4cCI6MTUxNDc5Nzk0MiwiY2xpZW50X 2lkIjoicGFpQjJnb28wYSIsInNjb3BlIjoicmVhZCB3cml0ZSBkb2xwaGluIiwic3Vi IjoiWjVPM3VwUEM4OFFyQWp4MDBkaXMiLCJiaXJ0aGRhdGUiOiIxOTgyLTAyLTAxIiw iZ2l2ZW5fbmFtZSI6IkpvaG4iLCJmYW1pbHlfbmFtZSI6IkRvZSIsImp0aSI6InQxRm 9DQ2FaZDRYdjRPUkpVV1ZVZVRaZnNLaFczMENRQ3JXRERqd1h5NncifX0.przJMU5Gh mNzvwtt1Sr-xa9xTkpiAg5IshbQsRiRVP_7eGR1GHYrNwQh84kxOkHCyje2g5WSRcYo sGEVIiC-eoPJJ-qBwqwSlgx9JEeCDw2W5DjrblOI_N0Jvsq_dUeOyoWVMqlOydOBhKN Y0smBrI4NZvEExucOm9WUJXMuJtvq1gBes-0go5j4TEv9sOP9uu81gqWTr_LOo6pgT0 tFFyZfWC4kbXPXiQ2YT6mxCiQRRNM-l9cBdF6Jx6IOrsfFhBuYdYQ_mlL19HgDDOFal eyqmru6lKlASOsaE8dmLSeKcX91FbG79FKN8un24iwIDCbKT9xlUFl54xWVShNDFA", "title": "Response as JWT"}, {"location": "janssen-server/auth-server/endpoints/introspection/#disabling-the-endpoint-using-feature-flag", "text": "/introspection endpoint can be enabled or disable using END_SESSION feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable INTROSPECTION flag as required.", "title": "Disabling The Endpoint Using Feature Flag"}, {"location": "janssen-server/auth-server/endpoints/introspection/#configuration-properties", "text": "Introspection endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . introspectionEndpoint mtlsIntrospectionEndpoint introspectionSkipAuthorization introspectionScriptBackwardCompatibility introspectionAccessTokenMustHaveUmaProtectionScope introspectionAccessTokenMustHaveIntrospectionScope introspectionResponseScopesBackwardCompatibility There difference between introspectionAccessTokenMustHaveUmaProtectionScope and introspectionAccessTokenMustHaveIntrospectionScope is that uma_protection scope is enabled for Dynamic Client Registration while introspection scope is not. Thus if set introspectionAccessTokenMustHaveIntrospectionScope to true value allows disable access to Introspection Endpoint to all clients which does not have explicitly granted introspection scope.", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/introspection/#customising-introspection-endpoint-behaviour-using-custom-script", "text": "Customizing certain aspects of endpoint behaviour, for example, one can modify claims of an access token as JWT, using introspection scripts . Use update token introspection script for transformation of claims and values in id-token and access-token. Configure below-mentioned client properties to enable usage of introspection scripts. When using Janssen Text-based UI(TUI) to configure these client properties, navigate to accessTokenAsJwt : Auth Server -> Clients ->select the client-> Tokens -> Access Token Type ->Select JWT runIntrospectionScriptBeforeJwtCreation : Auth Server -> Clients ->select the client-> Tokens ->enable Run Introspection Script before JWT access token creation", "title": "Customising Introspection Endpoint Behaviour using Custom script:"}, {"location": "janssen-server/auth-server/endpoints/introspection/#references-for-custom-scripts", "text": "Interface - IntrospectionType Introspection scripts Introspection script vs Update Token Script", "title": "References for custom scripts"}, {"location": "janssen-server/auth-server/endpoints/jwks-uri/", "tags": ["administration", "auth-server", "jwks", "json-web-key-set", "endpoint"], "text": "Overview # Janssen Server supports /jwks metadata endpoint and publishes its JSON Web Key Set (JWKS) at this endpoint. This endpoint publishes signing keys as well as encryption keys used by Janssen Server. RP can use these keys to validate signatures from Janssen Server, and also to perform encryption and decryption. Like other metadata endpoints, this is not a secure endpoint. Further details on this endpoint and JWKs can be found in OpenID Connect Discovery specification. URL to access jwks endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration jwks_uri claim in the response specifies the URL for jwks endpoint. By default, the jwks endpoint looks like below: https://janssen.server.host/jans-auth/restv1/jwks This endpoint is always enabled and can not be disabled using feature flags. Configuration Properties # End session endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . jwksUri jwksAlgorithmsSupported mtlsJwksUri Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "JWKS URI"}, {"location": "janssen-server/auth-server/endpoints/jwks-uri/#overview", "text": "Janssen Server supports /jwks metadata endpoint and publishes its JSON Web Key Set (JWKS) at this endpoint. This endpoint publishes signing keys as well as encryption keys used by Janssen Server. RP can use these keys to validate signatures from Janssen Server, and also to perform encryption and decryption. Like other metadata endpoints, this is not a secure endpoint. Further details on this endpoint and JWKs can be found in OpenID Connect Discovery specification. URL to access jwks endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration jwks_uri claim in the response specifies the URL for jwks endpoint. By default, the jwks endpoint looks like below: https://janssen.server.host/jans-auth/restv1/jwks This endpoint is always enabled and can not be disabled using feature flags.", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/jwks-uri/#configuration-properties", "text": "End session endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . jwksUri jwksAlgorithmsSupported mtlsJwksUri", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/jwks-uri/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/endpoints/par/", "tags": ["administration", "auth-server", "par", "pushed authorization requests", "endpoint"], "text": "Pushed Authorization Request (PAR) Endpoint # PAR endpoint is used by client to send authorization request directly to the Janssen Server without using the usual redirection mechanism via user agent. When PAR endpoint receives a valid request, it responds with a request URI. The request URI is a reference created and stored by Janssen Server. It is a reference to authorization request and the metadata sent with it by the client. Client can send this request uri to the Janssen Server in a authorization request using user agent redirect mechanism. There are multiple benefits of using this flow which are described along with other details in PAR specification . Janssen Server PAR implementation conforms to PAR specification. URL to access PAR endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration pushed_authorization_request_endpoint claim in the response specifies the URL for the PAR endpoint. By default, PAR endpoint looks like below: https://jans-dynamic-mysql/jans-auth/restv1/par In response to a valid request, the PAR endpoint returns request_uri in response similar to below: HTTP/1.1 201 Created Content-Type: application/json Cache-Control: no-cache, no-store { \"request_uri\": \"urn:ietf:params:oauth:request_uri:6esc_11ACC5bwc014ltc14eY22c\", \"expires_in\": 60 } Since PAR endpoint is a protected resource. The client has to authenticate itself to the endpoint. Authentication methods used are same as the once used for client authentication at token endpoint . More information about request and response of the PAR endpoint can be found in the OpenAPI specification of jans-auth-server module . Disabling The Endpoint Using Feature Flag # PAR endpoint can be enabled or disabled using PAR feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable PAR flag as required. Configuration Properties # Global Janssen Server configuration properties # PAR endpoint can be further configured using Janssen Server configuration properties listed below. It can be configured via Janssen Text-based UI(TUI) (navigate to Auth Server -> Properties ), admin UI or directly in persistence layer. mtlsParEndpoint - Mutual TLS (mTLS) Pushed Authorization Requests (PAR) endpoint URL parEndpoint - Pushed Authorization Requests (PAR) Endpoint location requirePar - Boolean value to indicate whether Pushed Authorisation Request (PAR) endpoint is required requestUriParameterSupported - Boolean value specifying whether the OP supports use of the request_uri parameter Client specific PAR related configuration properties # Some configuration properties are configured on client level to allow more granular configuration which depends on client. par_lifetime - PAR object lifetime in seconds. If value is not specified then defaults to 600 value. require_par - specified whether all authorization requests made by this client to Authorization Endpoint must be PAR. If true and authorization request is not PAR then error is returned back by Authorization Server. Have questions in the meantime? # You can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "PAR"}, {"location": "janssen-server/auth-server/endpoints/par/#pushed-authorization-request-par-endpoint", "text": "PAR endpoint is used by client to send authorization request directly to the Janssen Server without using the usual redirection mechanism via user agent. When PAR endpoint receives a valid request, it responds with a request URI. The request URI is a reference created and stored by Janssen Server. It is a reference to authorization request and the metadata sent with it by the client. Client can send this request uri to the Janssen Server in a authorization request using user agent redirect mechanism. There are multiple benefits of using this flow which are described along with other details in PAR specification . Janssen Server PAR implementation conforms to PAR specification. URL to access PAR endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration pushed_authorization_request_endpoint claim in the response specifies the URL for the PAR endpoint. By default, PAR endpoint looks like below: https://jans-dynamic-mysql/jans-auth/restv1/par In response to a valid request, the PAR endpoint returns request_uri in response similar to below: HTTP/1.1 201 Created Content-Type: application/json Cache-Control: no-cache, no-store { \"request_uri\": \"urn:ietf:params:oauth:request_uri:6esc_11ACC5bwc014ltc14eY22c\", \"expires_in\": 60 } Since PAR endpoint is a protected resource. The client has to authenticate itself to the endpoint. Authentication methods used are same as the once used for client authentication at token endpoint . More information about request and response of the PAR endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Pushed Authorization Request (PAR) Endpoint"}, {"location": "janssen-server/auth-server/endpoints/par/#disabling-the-endpoint-using-feature-flag", "text": "PAR endpoint can be enabled or disabled using PAR feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable PAR flag as required.", "title": "Disabling The Endpoint Using Feature Flag"}, {"location": "janssen-server/auth-server/endpoints/par/#configuration-properties", "text": "", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/par/#global-janssen-server-configuration-properties", "text": "PAR endpoint can be further configured using Janssen Server configuration properties listed below. It can be configured via Janssen Text-based UI(TUI) (navigate to Auth Server -> Properties ), admin UI or directly in persistence layer. mtlsParEndpoint - Mutual TLS (mTLS) Pushed Authorization Requests (PAR) endpoint URL parEndpoint - Pushed Authorization Requests (PAR) Endpoint location requirePar - Boolean value to indicate whether Pushed Authorisation Request (PAR) endpoint is required requestUriParameterSupported - Boolean value specifying whether the OP supports use of the request_uri parameter", "title": "Global Janssen Server configuration properties"}, {"location": "janssen-server/auth-server/endpoints/par/#client-specific-par-related-configuration-properties", "text": "Some configuration properties are configured on client level to allow more granular configuration which depends on client. par_lifetime - PAR object lifetime in seconds. If value is not specified then defaults to 600 value. require_par - specified whether all authorization requests made by this client to Authorization Endpoint must be PAR. If true and authorization request is not PAR then error is returned back by Authorization Server.", "title": "Client specific PAR related configuration properties"}, {"location": "janssen-server/auth-server/endpoints/par/#have-questions-in-the-meantime", "text": "You can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "janssen-server/auth-server/endpoints/par/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/endpoints/session-revocation/", "tags": ["administration", "auth-server", "session-revocation", "endpoint"], "text": "Overview # Janssen Server provides session revocation endpoint to enable the client to revoke all sessions of a users. Though not being part of any industry standard/specification, Janssen Server provides this endpoint to allow greater control and better management of sessions on OP. URL to access revocation endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration session_revocation_endpoint claim in the response specifies the URL for revocation endpoint. By default, revocation endpoint looks like below: https://janssen.server.host/jans-auth/restv1/revoke_session More information about request and response of the revocation endpoint can be found in the OpenAPI specification of jans-auth-server module . Usage # A request to this endpoint can revoke all sessions of one particular user. Use the request parameters to specify criteria to select the user. If there are multiple users matching the given criteria, the first found user will be affected. Disabling The Endpoint Using Feature Flag # Session revocation endpoint can be enabled or disable using REVOKE_SESSION feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable REVOKE_SESSION flag as required. Required Scopes # A client must have the following scope in order to use this endpoint: revoke_session", "title": "Session Revocation"}, {"location": "janssen-server/auth-server/endpoints/session-revocation/#overview", "text": "Janssen Server provides session revocation endpoint to enable the client to revoke all sessions of a users. Though not being part of any industry standard/specification, Janssen Server provides this endpoint to allow greater control and better management of sessions on OP. URL to access revocation endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration session_revocation_endpoint claim in the response specifies the URL for revocation endpoint. By default, revocation endpoint looks like below: https://janssen.server.host/jans-auth/restv1/revoke_session More information about request and response of the revocation endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/session-revocation/#usage", "text": "A request to this endpoint can revoke all sessions of one particular user. Use the request parameters to specify criteria to select the user. If there are multiple users matching the given criteria, the first found user will be affected.", "title": "Usage"}, {"location": "janssen-server/auth-server/endpoints/session-revocation/#disabling-the-endpoint-using-feature-flag", "text": "Session revocation endpoint can be enabled or disable using REVOKE_SESSION feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable REVOKE_SESSION flag as required.", "title": "Disabling The Endpoint Using Feature Flag"}, {"location": "janssen-server/auth-server/endpoints/session-revocation/#required-scopes", "text": "A client must have the following scope in order to use this endpoint: revoke_session", "title": "Required Scopes"}, {"location": "janssen-server/auth-server/endpoints/ssa/", "tags": ["administration", "auth-server", "SSA", "endpoint"], "text": "Software Statement Assertion (SSA) # Janssen Server provides SSA endpoint that enables management of SSAs. The SSA is a JSON Web Token (JWT) containing client metadata and some custom attributes. Specification for SSAs has been outlined as part of Dynamic Client Registration Protocol . URL to access revocation endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration ssa_endpoint claim in the response specifies the URL for revocation endpoint. By default, revocation endpoint looks like below: https://janssen.server.host/jans-auth/restv1/ssa More information about request and response of the revocation endpoint can be found in the OpenAPI specification of jans-auth-server module . Disabling The Endpoint Using Feature Flag # /ssa endpoint can be enabled or disable using SSA feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable SSA flag as required. Configuration Properties # SSA endpoint can be further configured using Janssen Server configuration property ssaConfiguration . When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties to update value for this property. This property take JSON configuration with parameters as described below: \"ssaConfiguration\": { \"ssaEndpoint\": \"{{your-url}}/ssa\", \"ssaCustomAttributes\": [ \"myCustomAttr1\", \"myCustomAttr2\", ... ], \"ssaSigningAlg\": \"RS512\", \"ssaExpirationInDays\": 30 } ssaEndpoint \u2014 Base endpoint for SSA. ssaCustomAttributes \u2014 List of custom attributes, which are received in the request when creating an SSA. ssaSigningAlg \u2014 Algorithm to sign the JWT that is returned after creating an SSA. ssaExpirationInDays \u2014 Expiration expressed in days, when an SSA is created and the expiration is not sent. SSA Security # To call SSA services, a token of type client_credentials must be generated with the following scopes enabled: https://jans.io/auth/ssa.admin \u2014 Allows calling all SSA services. https://jans.io/auth/ssa.portal \u2014 Allows only call Get SSA service. https://jans.io/auth/ssa.developer \u2014 Allows only call Get SSA , but you can only filter ssa that have been created by the same client. Create a new SSA # Create SSA for the organization with expiration (optional). Request body description # Field Detail Optional org_id The \"org_id\" is used for organization identification. false description Describe SSA false software_id The \"software_id\" is used for software identification. false software_roles List of string values, fixed value [\"password\", \"notify\"] . false grant_types Fixed value Fixed value [\"client_credentials\"] . false expiration Expiration date. (Default value: calculated based on global SSA settings) true one_time_use Defined whether the SSA will be used only once or can be used multiple times. (Default value: true) true rotate_ssa TODO - Will be used to rotate expiration of the SSA, currently is only saved as part of the SSA. (Default value: true) true lifetime SSA Lifetime in seconds true Note: You can add more custom attributes in the request, (you must have previously configured in the SSA global configuration). It should be clarified that these values are persisted in the database and are not returned in the SSA JWT. Example: { \"org_id\": \"your-org-id\", \"description\": \"your description\", ..., \"myCustomAttr1\": \"Your value custom attr 1\", \"myCustomAttr2\": \"Your value custom attr 2\" } Response description # Returned SSA is a JWT, containing the following structure: { \"ssa\": \"eyJraWQiOiI1NTk3MGFkZS00M2MwLTQ4YWMtODEyZi0yZTY1MzhjMTEyN2Zfc2lnX3JzNTEyIiwidHlwIjoiand0IiwiYWxnIjoiUlM1MTIifQ.eyJzb2Z0d2FyZV9pZCI6ImdsdXUtc2Nhbi1hcGkiLCJncmFudF90eXBlcyI6WyJjbGllbnRfY3JlZGVudGlhbHMiXSwib3JnX2lkIjoxLCJpc3MiOiJodHRwczovL2phbnMubG9jYWxob3N0Iiwic29mdHdhcmVfcm9sZXMiOlsicGFzc3d1cmQiXSwiZXhwIjoxNjY4NjA5MDA1LCJpYXQiOjE2Njg2NDE5NjcsImp0aSI6ImU4OWVjYTQxLTM0ODUtNDUxNi1hMTYyLWZiODYyNjJhYmFjMyJ9.jRgh8_aiwMTJxeT9cwfup9QP9LBc6gQstvabCzUOJvELnzosxiNJHeU2mrvavaNK6BGvs_lbNjODVDeetGCD48_F2ay9r8qmo-f3GPzdzcJozKgfzonSkAE5Ran9LKcQQJpVc1rDYcV2xYiJLJ6FSuvnoClkDEE1tXysxshLPs-GXOZE7rD8XUXzezuxZWUE1jXwA-EFajoat8CP6QulHGxlcn_sKIhawhGODxJPz4Pf3jgeZVLG_7HfRJgxNiKcdzQIxnkbdpuS-0Q4-oc5yntsXhFhn31Pa3vGsiPPH9f3ndL2ZZKk3xCgyImLDJuGaxXg-qEVoIG4zNWNHMUNUQ\" } Header alg \u2014 The signature algorithm which used RS256 . typ \u2014 The type which used. kid \u2014 The key identification gluu-scan-api-rs256-ssa-signature-key . Payload iat \u2014 The time the JWT was created. iss \u2014 The \"iss\" (issuer) claim identifies the principal that issued the JWT. jti \u2014 The \"jti\" (JWT ID) claim provides a unique identifier for the JWT. software_id \u2014 The \"software_id\" is used for software identification. org_id \u2014 The \"org_id\" is used for organization identification. software_roles \u2014 List of string values, fixed value [\"password\", \"notify\"] . grant_types \u2014 Fixed value [\"client_credentials\"] . lifetime \u2014 SSA lifetime in seconds. exp \u2014 Expiration Time. myCustom1, myCustom2, ... : if you have custom attributes, they will be displayed here. Example: # Request: POST {{your-url}}/ssa Content-Type: application/json Authorization: Bearer {{your-token}} { \"org_id\": \"your-org-id\", \"description\": \"This is test description\", \"software_id\": \"gluu-scan-api\", \"software_roles\": [ \"passwurd\" ], \"grant_types\": [ \"client_credentials\" ], \"expiration\": \"1696799089\", \"one_time_use\": false, \"rotate_ssa\": false, \"lifetime\": 86400 } Response: HTTP/1.1 201 Created Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 757 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive { \"ssa\": \"eyJraWQiOiJzc2FfNjY1MTQ5ODMtNzI0YS00OGQ2LWIzYzItODEyMGM1OTgyOGU2X3NpZ19yczI1NiIsInR5cCI6Imp3dCIsImFsZyI6IlJTMjU2In0.eyJzb2Z0d2FyZV9pZCI6ImdsdXUtc2Nhbi1hcGkiLCJncmFudF90eXBlcyI6WyJjbGllbnRfY3JlZGVudGlhbHMiXSwib3JnX2lkIjoieW91ci1vcmctaWQiLCJpc3MiOiJodHRwczovL2phbnMubG9jYWwuaW8iLCJsaWZldGltZSI6ODY0MDAsInNvZnR3YXJlX3JvbGVzIjpbInBhc3N3dXJkIl0sImV4cCI6MTY5Njc5OTA4OSwiaWF0IjoxNjk2NzEyNjg5LCJqdGkiOiJmNTRiYWFmZC02M2JmLTQ2NGEtYmJkZS00OTM3MDQ3NTBiMzUifQ.XTHzRrvrzQ5S_zEXjAWkXLegVIGK47zOa3eZuECO8xXQ2kOh0KXYGQ4TT3tPTFX19XQv30CLKqH97UPm-hkAMVL10NGUw_ernfoX1Z9-lTEdECPaqZ6UCiG1X8WRgJ0s4nUgE_PP9Isoyxnfk5bYlQwotf50KreTwDYUbwHRJZGdVPRjnLGeJpWhFblF4J5HNj_vU7wk7bdkaIDRArqK753mlCejXlkqTF97NzaL0bhP0yaoNK5jlscVPALQr2-FcoUl9rTfArSYXF1GuP3fhDN2BLrnB51M_8v7r0YkPF5B73ag82Aa8HSgYE6bmAB6D_M8W4v85idcyp0xQRPcIg\" } Get SSA # Get existing active SSA based on jti or org_id . Query Parameters # jti \u2014 Unique identifier org_id \u2014 Organization ID Response description # [ { \"ssa\": { \"jti\": \"c3eb1c16-be9b-4e96-974e-aea5e3cf95b0\", \"org_id\": 1, \"software_id\": \"gluu-scan-api\", \"software_roles\": [ \"password\" ], \"grant_types\": [ \"client_credentials\" ], \"iss\": \"https://jans.localhost\", \"exp\": 1668608852, \"iat\": 1668608851, \"description: \"test description\", \"one_time_use\": true, \"rotate_ssa\": false, \"lifetime\": 86400 }, \"iss\": \"ed4d5f74-ce41-4180-aed4-54cffa974630\", \"created_at\": 1668608851, \"expiration\": 1668608852, \"status\": \"ACTIVE\" } ] SSA jti \u2014 The \"jti\" (JWT ID) claim provides a unique identifier for the JWT. org_id \u2014 The \"org_id\" is used for organization identification. software_id \u2014 The \"software_id\" is used for software identification. software_roles \u2014 List of string values, fixed value [\"password\", \"notify\"] . grant_types \u2014 Fixed value [\"client_credentials\"] . iss \u2014 The \"iss\" (issuer) claim identifies the principal that issued the JWT. exp \u2014 Expiration time. iat \u2014 Creation time. description \u2014 Describe SSA. one_time_use \u2014 Defined whether the SSA will be used only once or can be used multiple times. rotate_ssa \u2014 TODO - Will be used to rotate expiration of the SSA, currently is only saved as part of the SSA. lifetime \u2014 SSA lifetime in seconds. myCustom1, myCustom2, ... \u2014 if you have custom attributes, they will be displayed here. iss \u2014 The \"iss\" is related to the client that created this SSA. created_at \u2014 Creation time. expiration \u2014 Expiration time. status \u2014 SSA status ( ACTIVE , USED , EXPIRED or REVOKED ). Example: # Request: Get SSA using jti . GET {{your-url}}/ssa?jti={{your-jti}} Content-Type: application/json Authorization: Bearer {{your-token}} Get SSA using org_id . GET {{your-url}}/ssa?org_id={{your-org_id}} Content-Type: application/json Authorization: Bearer {{your-token}} Response: HTTP/1.1 200 OK Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 432 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive [ { \"ssa\": { \"software_id\": \"gluu-scan-api\", \"grant_types\": [ \"client_credentials\" ], \"org_id\": 1, \"iss\": \"https://jans.localhost\", \"software_roles\": [ \"passwurd\" ], \"exp\": 1668608852, \"iat\": 1668608851, \"jti\": \"c3eb1c16-be9b-4e96-974e-aea5e3cf95b0\", \"description: \"test description\", \"one_time_use\": true, \"rotate_ssa\": false }, \"iss\": \"ed4d5f74-ce41-4180-aed4-54cffa974630\", \"created_at\": 1668608851, \"expiration\": 1668608852, \"status\": \"ACTIVE\" } ] Get JWT SSA # Get existing active SSA based on jti . Query Parameters # jti \u2014 Unique identifier Response description # Returned SSA is a JWT, containing the following structure: { \"ssa\": \"eyJraWQiOiJzc2FfNjY1MTQ5ODMtNzI0YS00OGQ2LWIzYzItODEyMGM1OTgyOGU2X3NpZ19yczI1NiIsInR5cCI6Imp3dCIsImFsZyI6IlJTMjU2In0.eyJzb2Z0d2FyZV9pZCI6ImdsdXUtc2Nhbi1hcGkiLCJncmFudF90eXBlcyI6WyJjbGllbnRfY3JlZGVudGlhbHMiXSwib3JnX2lkIjoieW91ci1vcmctaWQiLCJpc3MiOiJodHRwczovL2phbnMubG9jYWwuaW8iLCJsaWZldGltZSI6ODY0MDAsInNvZnR3YXJlX3JvbGVzIjpbInBhc3N3dXJkIl0sImV4cCI6MTY5Njc5OTA4OSwiaWF0IjoxNjk2NzEyNjg5LCJqdGkiOiJmNTRiYWFmZC02M2JmLTQ2NGEtYmJkZS00OTM3MDQ3NTBiMzUifQ.XTHzRrvrzQ5S_zEXjAWkXLegVIGK47zOa3eZuECO8xXQ2kOh0KXYGQ4TT3tPTFX19XQv30CLKqH97UPm-hkAMVL10NGUw_ernfoX1Z9-lTEdECPaqZ6UCiG1X8WRgJ0s4nUgE_PP9Isoyxnfk5bYlQwotf50KreTwDYUbwHRJZGdVPRjnLGeJpWhFblF4J5HNj_vU7wk7bdkaIDRArqK753mlCejXlkqTF97NzaL0bhP0yaoNK5jlscVPALQr2-FcoUl9rTfArSYXF1GuP3fhDN2BLrnB51M_8v7r0YkPF5B73ag82Aa8HSgYE6bmAB6D_M8W4v85idcyp0xQRPcIg\" } Header alg \u2014 The signature algorithm which used RS256 . typ \u2014 The type which used. kid \u2014 The key identification gluu-scan-api-rs256-ssa-signature-key . Payload iat \u2014 The time the JWT was created. iss \u2014 The \"iss\" (issuer) claim identifies the principal that issued the JWT. jti \u2014 The \"jti\" (JWT ID) claim provides a unique identifier for the JWT. software_id \u2014 The \"software_id\" is used for software identification. org_id \u2014 The \"org_id\" is used for organization identification. software_roles \u2014 List of string values, fixed value [\"password\", \"notify\"] . grant_types \u2014 Fixed value [\"client_credentials\"] . exp \u2014 Expiration Time. myCustom1, myCustom2, ... : if you have custom attributes, they will be displayed here. Example: # Request: GET {{your-url}}/ssa/jwt?jti={{your-jti}} Content-Type: application/json Authorization: Bearer {{your-token}} Response: HTTP/1.1 201 Created Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 757 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive { \"ssa\": \"eyJraWQiOiJzc2FfNjY1MTQ5ODMtNzI0YS00OGQ2LWIzYzItODEyMGM1OTgyOGU2X3NpZ19yczI1NiIsInR5cCI6Imp3dCIsImFsZyI6IlJTMjU2In0.eyJzb2Z0d2FyZV9pZCI6ImdsdXUtc2Nhbi1hcGkiLCJncmFudF90eXBlcyI6WyJjbGllbnRfY3JlZGVudGlhbHMiXSwib3JnX2lkIjoieW91ci1vcmctaWQiLCJpc3MiOiJodHRwczovL2phbnMubG9jYWwuaW8iLCJsaWZldGltZSI6ODY0MDAsInNvZnR3YXJlX3JvbGVzIjpbInBhc3N3dXJkIl0sImV4cCI6MTY5Njc5OTA4OSwiaWF0IjoxNjk2NzEyNjg5LCJqdGkiOiJmNTRiYWFmZC02M2JmLTQ2NGEtYmJkZS00OTM3MDQ3NTBiMzUifQ.XTHzRrvrzQ5S_zEXjAWkXLegVIGK47zOa3eZuECO8xXQ2kOh0KXYGQ4TT3tPTFX19XQv30CLKqH97UPm-hkAMVL10NGUw_ernfoX1Z9-lTEdECPaqZ6UCiG1X8WRgJ0s4nUgE_PP9Isoyxnfk5bYlQwotf50KreTwDYUbwHRJZGdVPRjnLGeJpWhFblF4J5HNj_vU7wk7bdkaIDRArqK753mlCejXlkqTF97NzaL0bhP0yaoNK5jlscVPALQr2-FcoUl9rTfArSYXF1GuP3fhDN2BLrnB51M_8v7r0YkPF5B73ag82Aa8HSgYE6bmAB6D_M8W4v85idcyp0xQRPcIg\" } Validate SSA # Validate existing active SSA based on jti Header Parameters # jti \u2014 Unique identifier Response description # Method returns status 200 with an empty body if the corresponding SSA exists and is active. Example: # POST {{your-url}}/ssa/validation jti: {{your-jti}} HTTP/1.1 200 OK Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Revoke SSA # Revoke existing active SSA based on jti or org_id . Query Parameters # jti \u2014 for revoke only one SSA, the specified by jti org_id \u2014 for revoke all SSA of the specified organization. Response description # Method returns status 200 with an empty body if all required SSAs were revoked correctly. Example: # Request: Revoke using jti . DELETE {{your-url}}/ssa?jti={{your-jti}} Authorization: Bearer {{your-token}} Revoke using org_id . DELETE {{your-url}}/ssa?org_id={{your-org_id}} Authorization: Bearer {{your-token}} Response: HTTP/1.1 200 OK Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 0 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive SSA Custom Script # The custom script will allow us to modify the SSA process. SSA Custom Script Modify the JWT returned by the creation SSA web service. Modify the list returned by the get SSA web service. Run a process after revoking an SSA. Create method # This method is executed after having generated the jwt that the service will return. In the following example, new fields is added to the header and payload of the JWT. def create(self, jsonWebResponse, context): print \"Modify ssa response script. Modify idToken: %s\" % jsonWebResponse jsonWebResponse.getHeader().setClaim(\"custom_header_name\", \"custom_header_value\") jsonWebResponse.getClaims().setClaim(\"custom_claim_name\", \"custom_claim_value\") print \"Modify ssa response script. After modify idToken: %s\" % jsonWebResponse return True Parameters # jsonWebResponse \u2014 JWT with SSA structure using io.jans.as.model.jwt.Jwt class context \u2014 Contains, SSA global configuration class, client, execution context, etc. Get method # This method is executed after having generated the SSA list that will be returned by the service. def get(self, jsonArray, context): print \"Modify ssa response script. Modify get ssa list: %s\" % jsonArray return True Parameters # jsonArray \u2014 Contains SSA list using org.json.JSONArray class context \u2014 Contains, SSA global configuration class, client, execution context, etc. Revoke method # This method is executed after the SSA list has been revoked. def revoke(self, ssaList, context): print \"Modify ssa response script. Modify revoke ssaList: %s\" % ssaList return True Parameters # ssaList \u2014 SSA revoked list. context \u2014 Contains, SSA global configuration class, client, execution context, etc. SSA Class structure # The SSA entity contains the following fields: id type String \u2014 Unique class identifier, and is used as the jti identifier for the JWT . orgId type String \u2014 Organization ID. description type String \u2014 SSA Description. state type enum SsaState \u2014 Contains the following SSA status values ( ACTIVE , EXPIRED , REVOKED , USED ). creationDate type Date \u2014 SSA Creation date. creatorId type String \u2014 Client that created SSA. creatorType type enum CreatorType \u2014 Contains the following CreatorType values ( NONE , CLIENT , USER , AUTO ). ttl type Integer \u2014 SSA lifetime in seconds. atributes type class SsaAtributes oneTimeUse type Boolean \u2014 Whether the SSA will be single use. lifetime type Integer \u2014 SSA lifetime in seconds. rotateSsa type Boolean \u2014 TODO - Will be used to rotate expiration of the SSA, currently is only saved as part of the SSA. clientDn type String \u2014 Client's DN. customAttributes type Map \u2014 Contain additional fields, previously configured in the SSA global configuration. softwareId type String \u2014 Is used for software identification. softwareRoles type List \u2014 List of string values, fixed value [\"password\", \"notify\"] . grantTypes type List \u2014 Fixed value [\"client_credentials\"] .", "title": "SSA"}, {"location": "janssen-server/auth-server/endpoints/ssa/#software-statement-assertion-ssa", "text": "Janssen Server provides SSA endpoint that enables management of SSAs. The SSA is a JSON Web Token (JWT) containing client metadata and some custom attributes. Specification for SSAs has been outlined as part of Dynamic Client Registration Protocol . URL to access revocation endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration ssa_endpoint claim in the response specifies the URL for revocation endpoint. By default, revocation endpoint looks like below: https://janssen.server.host/jans-auth/restv1/ssa More information about request and response of the revocation endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Software Statement Assertion (SSA)"}, {"location": "janssen-server/auth-server/endpoints/ssa/#disabling-the-endpoint-using-feature-flag", "text": "/ssa endpoint can be enabled or disable using SSA feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable SSA flag as required.", "title": "Disabling The Endpoint Using Feature Flag"}, {"location": "janssen-server/auth-server/endpoints/ssa/#configuration-properties", "text": "SSA endpoint can be further configured using Janssen Server configuration property ssaConfiguration . When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties to update value for this property. This property take JSON configuration with parameters as described below: \"ssaConfiguration\": { \"ssaEndpoint\": \"{{your-url}}/ssa\", \"ssaCustomAttributes\": [ \"myCustomAttr1\", \"myCustomAttr2\", ... ], \"ssaSigningAlg\": \"RS512\", \"ssaExpirationInDays\": 30 } ssaEndpoint \u2014 Base endpoint for SSA. ssaCustomAttributes \u2014 List of custom attributes, which are received in the request when creating an SSA. ssaSigningAlg \u2014 Algorithm to sign the JWT that is returned after creating an SSA. ssaExpirationInDays \u2014 Expiration expressed in days, when an SSA is created and the expiration is not sent.", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/ssa/#ssa-security", "text": "To call SSA services, a token of type client_credentials must be generated with the following scopes enabled: https://jans.io/auth/ssa.admin \u2014 Allows calling all SSA services. https://jans.io/auth/ssa.portal \u2014 Allows only call Get SSA service. https://jans.io/auth/ssa.developer \u2014 Allows only call Get SSA , but you can only filter ssa that have been created by the same client.", "title": "SSA Security"}, {"location": "janssen-server/auth-server/endpoints/ssa/#create-a-new-ssa", "text": "Create SSA for the organization with expiration (optional).", "title": "Create a new SSA"}, {"location": "janssen-server/auth-server/endpoints/ssa/#request-body-description", "text": "Field Detail Optional org_id The \"org_id\" is used for organization identification. false description Describe SSA false software_id The \"software_id\" is used for software identification. false software_roles List of string values, fixed value [\"password\", \"notify\"] . false grant_types Fixed value Fixed value [\"client_credentials\"] . false expiration Expiration date. (Default value: calculated based on global SSA settings) true one_time_use Defined whether the SSA will be used only once or can be used multiple times. (Default value: true) true rotate_ssa TODO - Will be used to rotate expiration of the SSA, currently is only saved as part of the SSA. (Default value: true) true lifetime SSA Lifetime in seconds true Note: You can add more custom attributes in the request, (you must have previously configured in the SSA global configuration). It should be clarified that these values are persisted in the database and are not returned in the SSA JWT. Example: { \"org_id\": \"your-org-id\", \"description\": \"your description\", ..., \"myCustomAttr1\": \"Your value custom attr 1\", \"myCustomAttr2\": \"Your value custom attr 2\" }", "title": "Request body description"}, {"location": "janssen-server/auth-server/endpoints/ssa/#response-description", "text": "Returned SSA is a JWT, containing the following structure: { \"ssa\": \"eyJraWQiOiI1NTk3MGFkZS00M2MwLTQ4YWMtODEyZi0yZTY1MzhjMTEyN2Zfc2lnX3JzNTEyIiwidHlwIjoiand0IiwiYWxnIjoiUlM1MTIifQ.eyJzb2Z0d2FyZV9pZCI6ImdsdXUtc2Nhbi1hcGkiLCJncmFudF90eXBlcyI6WyJjbGllbnRfY3JlZGVudGlhbHMiXSwib3JnX2lkIjoxLCJpc3MiOiJodHRwczovL2phbnMubG9jYWxob3N0Iiwic29mdHdhcmVfcm9sZXMiOlsicGFzc3d1cmQiXSwiZXhwIjoxNjY4NjA5MDA1LCJpYXQiOjE2Njg2NDE5NjcsImp0aSI6ImU4OWVjYTQxLTM0ODUtNDUxNi1hMTYyLWZiODYyNjJhYmFjMyJ9.jRgh8_aiwMTJxeT9cwfup9QP9LBc6gQstvabCzUOJvELnzosxiNJHeU2mrvavaNK6BGvs_lbNjODVDeetGCD48_F2ay9r8qmo-f3GPzdzcJozKgfzonSkAE5Ran9LKcQQJpVc1rDYcV2xYiJLJ6FSuvnoClkDEE1tXysxshLPs-GXOZE7rD8XUXzezuxZWUE1jXwA-EFajoat8CP6QulHGxlcn_sKIhawhGODxJPz4Pf3jgeZVLG_7HfRJgxNiKcdzQIxnkbdpuS-0Q4-oc5yntsXhFhn31Pa3vGsiPPH9f3ndL2ZZKk3xCgyImLDJuGaxXg-qEVoIG4zNWNHMUNUQ\" } Header alg \u2014 The signature algorithm which used RS256 . typ \u2014 The type which used. kid \u2014 The key identification gluu-scan-api-rs256-ssa-signature-key . Payload iat \u2014 The time the JWT was created. iss \u2014 The \"iss\" (issuer) claim identifies the principal that issued the JWT. jti \u2014 The \"jti\" (JWT ID) claim provides a unique identifier for the JWT. software_id \u2014 The \"software_id\" is used for software identification. org_id \u2014 The \"org_id\" is used for organization identification. software_roles \u2014 List of string values, fixed value [\"password\", \"notify\"] . grant_types \u2014 Fixed value [\"client_credentials\"] . lifetime \u2014 SSA lifetime in seconds. exp \u2014 Expiration Time. myCustom1, myCustom2, ... : if you have custom attributes, they will be displayed here.", "title": "Response description"}, {"location": "janssen-server/auth-server/endpoints/ssa/#example", "text": "Request: POST {{your-url}}/ssa Content-Type: application/json Authorization: Bearer {{your-token}} { \"org_id\": \"your-org-id\", \"description\": \"This is test description\", \"software_id\": \"gluu-scan-api\", \"software_roles\": [ \"passwurd\" ], \"grant_types\": [ \"client_credentials\" ], \"expiration\": \"1696799089\", \"one_time_use\": false, \"rotate_ssa\": false, \"lifetime\": 86400 } Response: HTTP/1.1 201 Created Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 757 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive { \"ssa\": \"eyJraWQiOiJzc2FfNjY1MTQ5ODMtNzI0YS00OGQ2LWIzYzItODEyMGM1OTgyOGU2X3NpZ19yczI1NiIsInR5cCI6Imp3dCIsImFsZyI6IlJTMjU2In0.eyJzb2Z0d2FyZV9pZCI6ImdsdXUtc2Nhbi1hcGkiLCJncmFudF90eXBlcyI6WyJjbGllbnRfY3JlZGVudGlhbHMiXSwib3JnX2lkIjoieW91ci1vcmctaWQiLCJpc3MiOiJodHRwczovL2phbnMubG9jYWwuaW8iLCJsaWZldGltZSI6ODY0MDAsInNvZnR3YXJlX3JvbGVzIjpbInBhc3N3dXJkIl0sImV4cCI6MTY5Njc5OTA4OSwiaWF0IjoxNjk2NzEyNjg5LCJqdGkiOiJmNTRiYWFmZC02M2JmLTQ2NGEtYmJkZS00OTM3MDQ3NTBiMzUifQ.XTHzRrvrzQ5S_zEXjAWkXLegVIGK47zOa3eZuECO8xXQ2kOh0KXYGQ4TT3tPTFX19XQv30CLKqH97UPm-hkAMVL10NGUw_ernfoX1Z9-lTEdECPaqZ6UCiG1X8WRgJ0s4nUgE_PP9Isoyxnfk5bYlQwotf50KreTwDYUbwHRJZGdVPRjnLGeJpWhFblF4J5HNj_vU7wk7bdkaIDRArqK753mlCejXlkqTF97NzaL0bhP0yaoNK5jlscVPALQr2-FcoUl9rTfArSYXF1GuP3fhDN2BLrnB51M_8v7r0YkPF5B73ag82Aa8HSgYE6bmAB6D_M8W4v85idcyp0xQRPcIg\" }", "title": "Example:"}, {"location": "janssen-server/auth-server/endpoints/ssa/#get-ssa", "text": "Get existing active SSA based on jti or org_id .", "title": "Get SSA"}, {"location": "janssen-server/auth-server/endpoints/ssa/#query-parameters", "text": "jti \u2014 Unique identifier org_id \u2014 Organization ID", "title": "Query Parameters"}, {"location": "janssen-server/auth-server/endpoints/ssa/#response-description_1", "text": "[ { \"ssa\": { \"jti\": \"c3eb1c16-be9b-4e96-974e-aea5e3cf95b0\", \"org_id\": 1, \"software_id\": \"gluu-scan-api\", \"software_roles\": [ \"password\" ], \"grant_types\": [ \"client_credentials\" ], \"iss\": \"https://jans.localhost\", \"exp\": 1668608852, \"iat\": 1668608851, \"description: \"test description\", \"one_time_use\": true, \"rotate_ssa\": false, \"lifetime\": 86400 }, \"iss\": \"ed4d5f74-ce41-4180-aed4-54cffa974630\", \"created_at\": 1668608851, \"expiration\": 1668608852, \"status\": \"ACTIVE\" } ] SSA jti \u2014 The \"jti\" (JWT ID) claim provides a unique identifier for the JWT. org_id \u2014 The \"org_id\" is used for organization identification. software_id \u2014 The \"software_id\" is used for software identification. software_roles \u2014 List of string values, fixed value [\"password\", \"notify\"] . grant_types \u2014 Fixed value [\"client_credentials\"] . iss \u2014 The \"iss\" (issuer) claim identifies the principal that issued the JWT. exp \u2014 Expiration time. iat \u2014 Creation time. description \u2014 Describe SSA. one_time_use \u2014 Defined whether the SSA will be used only once or can be used multiple times. rotate_ssa \u2014 TODO - Will be used to rotate expiration of the SSA, currently is only saved as part of the SSA. lifetime \u2014 SSA lifetime in seconds. myCustom1, myCustom2, ... \u2014 if you have custom attributes, they will be displayed here. iss \u2014 The \"iss\" is related to the client that created this SSA. created_at \u2014 Creation time. expiration \u2014 Expiration time. status \u2014 SSA status ( ACTIVE , USED , EXPIRED or REVOKED ).", "title": "Response description"}, {"location": "janssen-server/auth-server/endpoints/ssa/#example_1", "text": "Request: Get SSA using jti . GET {{your-url}}/ssa?jti={{your-jti}} Content-Type: application/json Authorization: Bearer {{your-token}} Get SSA using org_id . GET {{your-url}}/ssa?org_id={{your-org_id}} Content-Type: application/json Authorization: Bearer {{your-token}} Response: HTTP/1.1 200 OK Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 432 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive [ { \"ssa\": { \"software_id\": \"gluu-scan-api\", \"grant_types\": [ \"client_credentials\" ], \"org_id\": 1, \"iss\": \"https://jans.localhost\", \"software_roles\": [ \"passwurd\" ], \"exp\": 1668608852, \"iat\": 1668608851, \"jti\": \"c3eb1c16-be9b-4e96-974e-aea5e3cf95b0\", \"description: \"test description\", \"one_time_use\": true, \"rotate_ssa\": false }, \"iss\": \"ed4d5f74-ce41-4180-aed4-54cffa974630\", \"created_at\": 1668608851, \"expiration\": 1668608852, \"status\": \"ACTIVE\" } ]", "title": "Example:"}, {"location": "janssen-server/auth-server/endpoints/ssa/#get-jwt-ssa", "text": "Get existing active SSA based on jti .", "title": "Get JWT SSA"}, {"location": "janssen-server/auth-server/endpoints/ssa/#query-parameters_1", "text": "jti \u2014 Unique identifier", "title": "Query Parameters"}, {"location": "janssen-server/auth-server/endpoints/ssa/#response-description_2", "text": "Returned SSA is a JWT, containing the following structure: { \"ssa\": \"eyJraWQiOiJzc2FfNjY1MTQ5ODMtNzI0YS00OGQ2LWIzYzItODEyMGM1OTgyOGU2X3NpZ19yczI1NiIsInR5cCI6Imp3dCIsImFsZyI6IlJTMjU2In0.eyJzb2Z0d2FyZV9pZCI6ImdsdXUtc2Nhbi1hcGkiLCJncmFudF90eXBlcyI6WyJjbGllbnRfY3JlZGVudGlhbHMiXSwib3JnX2lkIjoieW91ci1vcmctaWQiLCJpc3MiOiJodHRwczovL2phbnMubG9jYWwuaW8iLCJsaWZldGltZSI6ODY0MDAsInNvZnR3YXJlX3JvbGVzIjpbInBhc3N3dXJkIl0sImV4cCI6MTY5Njc5OTA4OSwiaWF0IjoxNjk2NzEyNjg5LCJqdGkiOiJmNTRiYWFmZC02M2JmLTQ2NGEtYmJkZS00OTM3MDQ3NTBiMzUifQ.XTHzRrvrzQ5S_zEXjAWkXLegVIGK47zOa3eZuECO8xXQ2kOh0KXYGQ4TT3tPTFX19XQv30CLKqH97UPm-hkAMVL10NGUw_ernfoX1Z9-lTEdECPaqZ6UCiG1X8WRgJ0s4nUgE_PP9Isoyxnfk5bYlQwotf50KreTwDYUbwHRJZGdVPRjnLGeJpWhFblF4J5HNj_vU7wk7bdkaIDRArqK753mlCejXlkqTF97NzaL0bhP0yaoNK5jlscVPALQr2-FcoUl9rTfArSYXF1GuP3fhDN2BLrnB51M_8v7r0YkPF5B73ag82Aa8HSgYE6bmAB6D_M8W4v85idcyp0xQRPcIg\" } Header alg \u2014 The signature algorithm which used RS256 . typ \u2014 The type which used. kid \u2014 The key identification gluu-scan-api-rs256-ssa-signature-key . Payload iat \u2014 The time the JWT was created. iss \u2014 The \"iss\" (issuer) claim identifies the principal that issued the JWT. jti \u2014 The \"jti\" (JWT ID) claim provides a unique identifier for the JWT. software_id \u2014 The \"software_id\" is used for software identification. org_id \u2014 The \"org_id\" is used for organization identification. software_roles \u2014 List of string values, fixed value [\"password\", \"notify\"] . grant_types \u2014 Fixed value [\"client_credentials\"] . exp \u2014 Expiration Time. myCustom1, myCustom2, ... : if you have custom attributes, they will be displayed here.", "title": "Response description"}, {"location": "janssen-server/auth-server/endpoints/ssa/#example_2", "text": "Request: GET {{your-url}}/ssa/jwt?jti={{your-jti}} Content-Type: application/json Authorization: Bearer {{your-token}} Response: HTTP/1.1 201 Created Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 757 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive { \"ssa\": \"eyJraWQiOiJzc2FfNjY1MTQ5ODMtNzI0YS00OGQ2LWIzYzItODEyMGM1OTgyOGU2X3NpZ19yczI1NiIsInR5cCI6Imp3dCIsImFsZyI6IlJTMjU2In0.eyJzb2Z0d2FyZV9pZCI6ImdsdXUtc2Nhbi1hcGkiLCJncmFudF90eXBlcyI6WyJjbGllbnRfY3JlZGVudGlhbHMiXSwib3JnX2lkIjoieW91ci1vcmctaWQiLCJpc3MiOiJodHRwczovL2phbnMubG9jYWwuaW8iLCJsaWZldGltZSI6ODY0MDAsInNvZnR3YXJlX3JvbGVzIjpbInBhc3N3dXJkIl0sImV4cCI6MTY5Njc5OTA4OSwiaWF0IjoxNjk2NzEyNjg5LCJqdGkiOiJmNTRiYWFmZC02M2JmLTQ2NGEtYmJkZS00OTM3MDQ3NTBiMzUifQ.XTHzRrvrzQ5S_zEXjAWkXLegVIGK47zOa3eZuECO8xXQ2kOh0KXYGQ4TT3tPTFX19XQv30CLKqH97UPm-hkAMVL10NGUw_ernfoX1Z9-lTEdECPaqZ6UCiG1X8WRgJ0s4nUgE_PP9Isoyxnfk5bYlQwotf50KreTwDYUbwHRJZGdVPRjnLGeJpWhFblF4J5HNj_vU7wk7bdkaIDRArqK753mlCejXlkqTF97NzaL0bhP0yaoNK5jlscVPALQr2-FcoUl9rTfArSYXF1GuP3fhDN2BLrnB51M_8v7r0YkPF5B73ag82Aa8HSgYE6bmAB6D_M8W4v85idcyp0xQRPcIg\" }", "title": "Example:"}, {"location": "janssen-server/auth-server/endpoints/ssa/#validate-ssa", "text": "Validate existing active SSA based on jti", "title": "Validate SSA"}, {"location": "janssen-server/auth-server/endpoints/ssa/#header-parameters", "text": "jti \u2014 Unique identifier", "title": "Header Parameters"}, {"location": "janssen-server/auth-server/endpoints/ssa/#response-description_3", "text": "Method returns status 200 with an empty body if the corresponding SSA exists and is active.", "title": "Response description"}, {"location": "janssen-server/auth-server/endpoints/ssa/#example_3", "text": "POST {{your-url}}/ssa/validation jti: {{your-jti}} HTTP/1.1 200 OK Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Keep-Alive: timeout=5, max=100 Connection: Keep-Alive ", "title": "Example:"}, {"location": "janssen-server/auth-server/endpoints/ssa/#revoke-ssa", "text": "Revoke existing active SSA based on jti or org_id .", "title": "Revoke SSA"}, {"location": "janssen-server/auth-server/endpoints/ssa/#query-parameters_2", "text": "jti \u2014 for revoke only one SSA, the specified by jti org_id \u2014 for revoke all SSA of the specified organization.", "title": "Query Parameters"}, {"location": "janssen-server/auth-server/endpoints/ssa/#response-description_4", "text": "Method returns status 200 with an empty body if all required SSAs were revoked correctly.", "title": "Response description"}, {"location": "janssen-server/auth-server/endpoints/ssa/#example_4", "text": "Request: Revoke using jti . DELETE {{your-url}}/ssa?jti={{your-jti}} Authorization: Bearer {{your-token}} Revoke using org_id . DELETE {{your-url}}/ssa?org_id={{your-org_id}} Authorization: Bearer {{your-token}} Response: HTTP/1.1 200 OK Server: Apache/2.4.52 (Ubuntu) X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000; includeSubDomains Cache-Control: no-store Content-Type: application/json Pragma: no-cache Content-Length: 0 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive ", "title": "Example:"}, {"location": "janssen-server/auth-server/endpoints/ssa/#ssa-custom-script", "text": "The custom script will allow us to modify the SSA process. SSA Custom Script Modify the JWT returned by the creation SSA web service. Modify the list returned by the get SSA web service. Run a process after revoking an SSA.", "title": "SSA Custom Script"}, {"location": "janssen-server/auth-server/endpoints/ssa/#create-method", "text": "This method is executed after having generated the jwt that the service will return. In the following example, new fields is added to the header and payload of the JWT. def create(self, jsonWebResponse, context): print \"Modify ssa response script. Modify idToken: %s\" % jsonWebResponse jsonWebResponse.getHeader().setClaim(\"custom_header_name\", \"custom_header_value\") jsonWebResponse.getClaims().setClaim(\"custom_claim_name\", \"custom_claim_value\") print \"Modify ssa response script. After modify idToken: %s\" % jsonWebResponse return True", "title": "Create method"}, {"location": "janssen-server/auth-server/endpoints/ssa/#parameters", "text": "jsonWebResponse \u2014 JWT with SSA structure using io.jans.as.model.jwt.Jwt class context \u2014 Contains, SSA global configuration class, client, execution context, etc.", "title": "Parameters"}, {"location": "janssen-server/auth-server/endpoints/ssa/#get-method", "text": "This method is executed after having generated the SSA list that will be returned by the service. def get(self, jsonArray, context): print \"Modify ssa response script. Modify get ssa list: %s\" % jsonArray return True", "title": "Get method"}, {"location": "janssen-server/auth-server/endpoints/ssa/#parameters_1", "text": "jsonArray \u2014 Contains SSA list using org.json.JSONArray class context \u2014 Contains, SSA global configuration class, client, execution context, etc.", "title": "Parameters"}, {"location": "janssen-server/auth-server/endpoints/ssa/#revoke-method", "text": "This method is executed after the SSA list has been revoked. def revoke(self, ssaList, context): print \"Modify ssa response script. Modify revoke ssaList: %s\" % ssaList return True", "title": "Revoke method"}, {"location": "janssen-server/auth-server/endpoints/ssa/#parameters_2", "text": "ssaList \u2014 SSA revoked list. context \u2014 Contains, SSA global configuration class, client, execution context, etc.", "title": "Parameters"}, {"location": "janssen-server/auth-server/endpoints/ssa/#ssa-class-structure", "text": "The SSA entity contains the following fields: id type String \u2014 Unique class identifier, and is used as the jti identifier for the JWT . orgId type String \u2014 Organization ID. description type String \u2014 SSA Description. state type enum SsaState \u2014 Contains the following SSA status values ( ACTIVE , EXPIRED , REVOKED , USED ). creationDate type Date \u2014 SSA Creation date. creatorId type String \u2014 Client that created SSA. creatorType type enum CreatorType \u2014 Contains the following CreatorType values ( NONE , CLIENT , USER , AUTO ). ttl type Integer \u2014 SSA lifetime in seconds. atributes type class SsaAtributes oneTimeUse type Boolean \u2014 Whether the SSA will be single use. lifetime type Integer \u2014 SSA lifetime in seconds. rotateSsa type Boolean \u2014 TODO - Will be used to rotate expiration of the SSA, currently is only saved as part of the SSA. clientDn type String \u2014 Client's DN. customAttributes type Map \u2014 Contain additional fields, previously configured in the SSA global configuration. softwareId type String \u2014 Is used for software identification. softwareRoles type List \u2014 List of string values, fixed value [\"password\", \"notify\"] . grantTypes type List \u2014 Fixed value [\"client_credentials\"] .", "title": "SSA Class structure"}, {"location": "janssen-server/auth-server/endpoints/token-revocation/", "tags": ["administration", "auth-server", "token-revocation", "endpoint"], "text": "Overview # Janssen Server supports token revocation endpoint enables a client to notify the server that previously obtained refresh or access token is no longer needed, allowing the server to clean up security credentials. Implementation conforms with token revocation specification . Since a token is part of a grant, when the token is invalidated, all other token within the same grant are also revoked. i.e when a refresh token related to a grant is invalidated, all access tokens from the same grant are also invalidated and vice-versa. URL to access revocation endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https:///jans-auth/.well-known/openid-configuration revocation_endpoint claim in the response specifies the URL for revocation endpoint. By default, revocation endpoint looks like below: https://jans-dynamic-mysql/jans-auth/restv1/revoke More information about request and response of the revocation endpoint can be found in the OpenAPI specification of jans-auth-server module . Disabling The Endpoint Using Feature Flag # Token revocation endpoint can be enabled or disable using REVOKE_TOKEN feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable REVOKE_TOKEN flag as required. Configuration Properties # Token revocation endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . mtlstokenrevocationendpoint tokenRevocationEndpoint allowRevokeForOtherClients Revoke all tokens by client_id # To remove all tokens for given client_id it's required: - set allowAllValueForRevokeEndpoint AS configuration property to true - pass in request parameter token_type_hint=all client is identified by Client Authentication performed by AS to grant access to /revoke endpoint. Revoke tokens of other clients # By default Revoke Endpoint allows revoke only own client's tokens. However it is possible to allow revoking of any token (which is issued with other client). For this it is required: - set global AS configuration property allowRevokeForOtherClients to true - add revoke_any_token scope to client which performs revoke call Revoke Interception Script # Endpoint can provide custom behavior via implementing Revoke Token interception script .", "title": "Token Revocation"}, {"location": "janssen-server/auth-server/endpoints/token-revocation/#overview", "text": "Janssen Server supports token revocation endpoint enables a client to notify the server that previously obtained refresh or access token is no longer needed, allowing the server to clean up security credentials. Implementation conforms with token revocation specification . Since a token is part of a grant, when the token is invalidated, all other token within the same grant are also revoked. i.e when a refresh token related to a grant is invalidated, all access tokens from the same grant are also invalidated and vice-versa. URL to access revocation endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https:///jans-auth/.well-known/openid-configuration revocation_endpoint claim in the response specifies the URL for revocation endpoint. By default, revocation endpoint looks like below: https://jans-dynamic-mysql/jans-auth/restv1/revoke More information about request and response of the revocation endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/token-revocation/#disabling-the-endpoint-using-feature-flag", "text": "Token revocation endpoint can be enabled or disable using REVOKE_TOKEN feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable REVOKE_TOKEN flag as required.", "title": "Disabling The Endpoint Using Feature Flag"}, {"location": "janssen-server/auth-server/endpoints/token-revocation/#configuration-properties", "text": "Token revocation endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . mtlstokenrevocationendpoint tokenRevocationEndpoint allowRevokeForOtherClients", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/token-revocation/#revoke-all-tokens-by-client_id", "text": "To remove all tokens for given client_id it's required: - set allowAllValueForRevokeEndpoint AS configuration property to true - pass in request parameter token_type_hint=all client is identified by Client Authentication performed by AS to grant access to /revoke endpoint.", "title": "Revoke all tokens by client_id"}, {"location": "janssen-server/auth-server/endpoints/token-revocation/#revoke-tokens-of-other-clients", "text": "By default Revoke Endpoint allows revoke only own client's tokens. However it is possible to allow revoking of any token (which is issued with other client). For this it is required: - set global AS configuration property allowRevokeForOtherClients to true - add revoke_any_token scope to client which performs revoke call", "title": "Revoke tokens of other clients"}, {"location": "janssen-server/auth-server/endpoints/token-revocation/#revoke-interception-script", "text": "Endpoint can provide custom behavior via implementing Revoke Token interception script .", "title": "Revoke Interception Script"}, {"location": "janssen-server/auth-server/endpoints/token/", "tags": ["administration", "auth-server", "token", "endpoint"], "text": "Overview # Token endpoint is an OAuth2 protected endpoint that is used to grant tokens to client in response to valid request. Token endpoint is defined in the OAuth 2.0 framework , OpenID Connect specification and other specifications relevant to them. Tokens granted by this endpoint depends on grant type and scopes that are specified in the token request. The token endpoint is used with every authorization grant type except for the implicit grant type (since an access token is issued directly). Based on request, this endpoint can grant following types of tokens: Access Token Refresh Token ID Token URL to access token endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration token_endpoint claim in the response specifies the URL for userinfo endpoint. By default, userinfo endpoint looks like below: https://janssen.server.host/jans-auth/restv1/token In response to a valid request, the token endpoint returns token/s in JSON format similar to below. This is just a sample response. Actual response can greatly vary in its contents based on request: HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Pragma: no-cache { \"access_token\": \"SlAV32hkKG\", \"token_type\": \"Bearer\", \"refresh_token\": \"8xLOxBtZp8\", \"expires_in\": 3600, \"id_token\": \"eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5 NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4 XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg\" } More information about request and response of the token endpoint can be found in the OpenAPI specification of jans-auth-server module . Configuration Properties # Token endpoint and tokens issued by token endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . tokenEndpoint tokenEndpointAuthMethodsSupported tokenEndpointAuthSigningAlgValuesSupported accessTokenLifetime checkUserPresenceOnRefreshToken defaultSignatureAlgorithm forceOfflineAccessScopeToEnableRefreshToken grantTypesSupported accessTokenSigningAlgValuesSupported idTokenEncryptionAlgValuesSupported idTokenEncryptionEncValuesSupported idTokenFilterClaimsBasedOnAccessToken idTokenLifetime idTokenSigningAlgValuesSupported accessTokenSigningAlgValuesSupported legacyIdTokenClaims mtlsTokenEndpoint openidScopeBackwardCompatibility persistIdToken persistRefreshToken refreshTokenExtendLifetimeOnRotation refreshTokenLifetime responseTypesSupported skipRefreshTokenDuringRefreshing refreshTokenLifetime Client Authentication # Janssen Server Token Endpoint requires confidential clients to authenticate using one of the supported client authentication method listed below: client_secret_basic client_secret_post client_secret_jwt private_key_jwt Refer to Client Authentication section of OpenID Connect core specification for more details on these authentication methods. AS provides ability to customer Client Authentication behavior via Client Authentication custom script Client can specify the default authentication method. To set default authentication method using Janssen Text-based UI(TUI) , navigate via Auth Server -> Clients -> Add Client -> Basic -> Authn Method Token Endpoint . Supported Grant Types # Token endpoint supports below mentioned grant types. Authorization Code Implicit Refresh Token Client Credentials Password Token Exchange Transaction Tokens Device Grant CIBA Client can configure all the possible grant types it can request from token endpoint during client configuration. To select the available grant types using Janssen Text-based UI(TUI) , navigate via Auth Server -> Clients -> Add Client / search client -> Basic -> Grant . Interception Scripts # Token endpoint response can be further customized using interception scripts . Following interception scripts are relevant to token endpoint: Update Token Client can configure a particular script to be executed using client configuration. To update configuration using Janssen Text-based UI(TUI) navigate via Auth Server -> Clients -> Add Client / search -> Client Scripts", "title": "Token"}, {"location": "janssen-server/auth-server/endpoints/token/#overview", "text": "Token endpoint is an OAuth2 protected endpoint that is used to grant tokens to client in response to valid request. Token endpoint is defined in the OAuth 2.0 framework , OpenID Connect specification and other specifications relevant to them. Tokens granted by this endpoint depends on grant type and scopes that are specified in the token request. The token endpoint is used with every authorization grant type except for the implicit grant type (since an access token is issued directly). Based on request, this endpoint can grant following types of tokens: Access Token Refresh Token ID Token URL to access token endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration token_endpoint claim in the response specifies the URL for userinfo endpoint. By default, userinfo endpoint looks like below: https://janssen.server.host/jans-auth/restv1/token In response to a valid request, the token endpoint returns token/s in JSON format similar to below. This is just a sample response. Actual response can greatly vary in its contents based on request: HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Pragma: no-cache { \"access_token\": \"SlAV32hkKG\", \"token_type\": \"Bearer\", \"refresh_token\": \"8xLOxBtZp8\", \"expires_in\": 3600, \"id_token\": \"eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5 NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4 XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg\" } More information about request and response of the token endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/token/#configuration-properties", "text": "Token endpoint and tokens issued by token endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . tokenEndpoint tokenEndpointAuthMethodsSupported tokenEndpointAuthSigningAlgValuesSupported accessTokenLifetime checkUserPresenceOnRefreshToken defaultSignatureAlgorithm forceOfflineAccessScopeToEnableRefreshToken grantTypesSupported accessTokenSigningAlgValuesSupported idTokenEncryptionAlgValuesSupported idTokenEncryptionEncValuesSupported idTokenFilterClaimsBasedOnAccessToken idTokenLifetime idTokenSigningAlgValuesSupported accessTokenSigningAlgValuesSupported legacyIdTokenClaims mtlsTokenEndpoint openidScopeBackwardCompatibility persistIdToken persistRefreshToken refreshTokenExtendLifetimeOnRotation refreshTokenLifetime responseTypesSupported skipRefreshTokenDuringRefreshing refreshTokenLifetime", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/token/#client-authentication", "text": "Janssen Server Token Endpoint requires confidential clients to authenticate using one of the supported client authentication method listed below: client_secret_basic client_secret_post client_secret_jwt private_key_jwt Refer to Client Authentication section of OpenID Connect core specification for more details on these authentication methods. AS provides ability to customer Client Authentication behavior via Client Authentication custom script Client can specify the default authentication method. To set default authentication method using Janssen Text-based UI(TUI) , navigate via Auth Server -> Clients -> Add Client -> Basic -> Authn Method Token Endpoint .", "title": "Client Authentication"}, {"location": "janssen-server/auth-server/endpoints/token/#supported-grant-types", "text": "Token endpoint supports below mentioned grant types. Authorization Code Implicit Refresh Token Client Credentials Password Token Exchange Transaction Tokens Device Grant CIBA Client can configure all the possible grant types it can request from token endpoint during client configuration. To select the available grant types using Janssen Text-based UI(TUI) , navigate via Auth Server -> Clients -> Add Client / search client -> Basic -> Grant .", "title": "Supported Grant Types"}, {"location": "janssen-server/auth-server/endpoints/token/#interception-scripts", "text": "Token endpoint response can be further customized using interception scripts . Following interception scripts are relevant to token endpoint: Update Token Client can configure a particular script to be executed using client configuration. To update configuration using Janssen Text-based UI(TUI) navigate via Auth Server -> Clients -> Add Client / search -> Client Scripts", "title": "Interception Scripts"}, {"location": "janssen-server/auth-server/endpoints/userinfo/", "tags": ["administration", "auth-server", "userinfo", "endpoint"], "text": "Overview # Userinfo endpoint is an OAuth2 protected endpoint that is used to retrieve claims about an authenticated end-user. Userinfo endpoint is defined in the OpenID Connect specification . URL to access userinfo endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration userinfo_endpoint claim in the response specifies the URL for userinfo endpoint. By default, userinfo endpoint looks like below: https://janssen.server.host/jans-auth/restv1/userinfo In response to a valid request, the userinfo endpoint returns user information in JSON format similar to below: HTTP/1.1 200 OK Content-Type: application/json { \"sub\": \"3482897610054\", \"jti\": \"sdu28g9c761g0y0g5\", \"client_id\": \"db6daf8c-ab1b-4010-9fb0\", \"name\": \"Chad Wick\", \"given_name\": \"Chad\", \"family_name\": \"Wick\", \"preferred_username\": \"c.wick\", \"email\": \"cwick@jans.com\", \"picture\": \"http://mysite.com/mypic.jpg\" } User Info response should contain: sub , jti and client_id claims. Since userinfo endpoint is an OAuth2 protected resource, a valid access token with appropriate scope is required to access the endpoint. More information about request and response of the userinfo endpoint can be found in the OpenAPI specification of jans-auth-server module . Disabling The Endpoint Using Feature Flag # userinfo endpoint can be enabled or disable using USERINFO feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable USERINFO flag as required. Configuration Properties # Userinfo endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . mtlsUserInfoEndpoint userInfoEncryptionAlgValuesSupported userInfoEncryptionEncValuesSupported userInfoEndpoint userInfoSigningAlgValuesSupported Using Scopes To Control Claim Release # Standard Scopes # In context of OpenID Connect specification, claim information released by userinfo endpoint can be controlled using scopes. Janssen Server supports all standard scopes and releases corresponding claims as per OpenID Connect specification. Administrator can customise standard scopes and define claims to be linked to each standard scope. When using Janssen Text-based UI(TUI) to configure the scopes, navigate via Auth Server -> Scopes -> Add Scopes -> Scope Type as OpenID ->search for a standard scope like address Dynamic Scopes # In addition to standard scopes, Janssen server allows defining custom scopes which can be associated to user-defined list of claims. This allows administrators to create custom groupings of claims. When using Janssen Text-based UI(TUI) , navigate via Auth Server -> Scopes -> Add Scopes -> Scope Type as Dynamic Interception Scripts # Response from userinfo can be further customized using dynamic scope interception script. Administrator can attach a dynamic scope script to a dynamic scope using Janssen Text-based UI(TUI) . Navigate to Auth Server -> Scopes -> Add Scopes -> Scope Type as Dynamic -> Dynamic Scope Script Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Userinfo"}, {"location": "janssen-server/auth-server/endpoints/userinfo/#overview", "text": "Userinfo endpoint is an OAuth2 protected endpoint that is used to retrieve claims about an authenticated end-user. Userinfo endpoint is defined in the OpenID Connect specification . URL to access userinfo endpoint on Janssen Server is listed in the response of Janssen Server's well-known configuration endpoint given below. https://janssen.server.host/jans-auth/.well-known/openid-configuration userinfo_endpoint claim in the response specifies the URL for userinfo endpoint. By default, userinfo endpoint looks like below: https://janssen.server.host/jans-auth/restv1/userinfo In response to a valid request, the userinfo endpoint returns user information in JSON format similar to below: HTTP/1.1 200 OK Content-Type: application/json { \"sub\": \"3482897610054\", \"jti\": \"sdu28g9c761g0y0g5\", \"client_id\": \"db6daf8c-ab1b-4010-9fb0\", \"name\": \"Chad Wick\", \"given_name\": \"Chad\", \"family_name\": \"Wick\", \"preferred_username\": \"c.wick\", \"email\": \"cwick@jans.com\", \"picture\": \"http://mysite.com/mypic.jpg\" } User Info response should contain: sub , jti and client_id claims. Since userinfo endpoint is an OAuth2 protected resource, a valid access token with appropriate scope is required to access the endpoint. More information about request and response of the userinfo endpoint can be found in the OpenAPI specification of jans-auth-server module .", "title": "Overview"}, {"location": "janssen-server/auth-server/endpoints/userinfo/#disabling-the-endpoint-using-feature-flag", "text": "userinfo endpoint can be enabled or disable using USERINFO feature flag . Use Janssen Text-based UI(TUI) or Janssen command-line interface to perform this task. When using TUI, navigate via Auth Server -> Properties -> enabledFeatureFlags to screen below. From here, enable or disable USERINFO flag as required.", "title": "Disabling The Endpoint Using Feature Flag"}, {"location": "janssen-server/auth-server/endpoints/userinfo/#configuration-properties", "text": "Userinfo endpoint can be further configured using Janssen Server configuration properties listed below. When using Janssen Text-based UI(TUI) to configure the properties, navigate via Auth Server -> Properties . mtlsUserInfoEndpoint userInfoEncryptionAlgValuesSupported userInfoEncryptionEncValuesSupported userInfoEndpoint userInfoSigningAlgValuesSupported", "title": "Configuration Properties"}, {"location": "janssen-server/auth-server/endpoints/userinfo/#using-scopes-to-control-claim-release", "text": "", "title": "Using Scopes To Control Claim Release"}, {"location": "janssen-server/auth-server/endpoints/userinfo/#standard-scopes", "text": "In context of OpenID Connect specification, claim information released by userinfo endpoint can be controlled using scopes. Janssen Server supports all standard scopes and releases corresponding claims as per OpenID Connect specification. Administrator can customise standard scopes and define claims to be linked to each standard scope. When using Janssen Text-based UI(TUI) to configure the scopes, navigate via Auth Server -> Scopes -> Add Scopes -> Scope Type as OpenID ->search for a standard scope like address", "title": "Standard Scopes"}, {"location": "janssen-server/auth-server/endpoints/userinfo/#dynamic-scopes", "text": "In addition to standard scopes, Janssen server allows defining custom scopes which can be associated to user-defined list of claims. This allows administrators to create custom groupings of claims. When using Janssen Text-based UI(TUI) , navigate via Auth Server -> Scopes -> Add Scopes -> Scope Type as Dynamic", "title": "Dynamic Scopes"}, {"location": "janssen-server/auth-server/endpoints/userinfo/#interception-scripts", "text": "Response from userinfo can be further customized using dynamic scope interception script. Administrator can attach a dynamic scope script to a dynamic scope using Janssen Text-based UI(TUI) . Navigate to Auth Server -> Scopes -> Add Scopes -> Scope Type as Dynamic -> Dynamic Scope Script", "title": "Interception Scripts"}, {"location": "janssen-server/auth-server/endpoints/userinfo/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/international/client-config/", "tags": ["administration", "auth-server", "i18n"], "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Client Configuration"}, {"location": "janssen-server/auth-server/international/client-config/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "janssen-server/auth-server/international/client-config/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "janssen-server/auth-server/international/client-config/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/international/scope-descriptions/", "tags": ["administration", "auth-server", "i18n"], "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Scope Descriptions"}, {"location": "janssen-server/auth-server/international/scope-descriptions/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "janssen-server/auth-server/international/scope-descriptions/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "janssen-server/auth-server/international/scope-descriptions/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/international/web-pages/", "tags": ["administration", "auth-server", "i18n"], "text": "This content is in progress # The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future. Have questions in the meantime? # While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Web Pages"}, {"location": "janssen-server/auth-server/international/web-pages/#this-content-is-in-progress", "text": "The Janssen Project documentation is currently in development. Topic pages are being created in order of broadest relevance, and this page is coming in the near future.", "title": "This content is in progress"}, {"location": "janssen-server/auth-server/international/web-pages/#have-questions-in-the-meantime", "text": "While this documentation is in progress, you can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "janssen-server/auth-server/international/web-pages/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/logging/audit-logs/", "tags": ["administration", "auth-server", "logging"], "text": "Audit Logs # Audit logs are located in jans-auth_audit.log log file. All jans-auth-server log files are located in /opt/jans/jetty/jans-auth/logs/ . Audit is disabled by default on AS and can be enabled via enabledOAuthAuditLogging AS configuration property. Audit logs are logged to file when enabled, however if JMS configuration is specified it will be logged to JMS as well. JMS Configuration must be set inside AS global configuration Name Description jmsBrokerURISet JMS Broker URI Set jmsUserName JMS UserName jmsPassword JMS Password. Audit events: - CLIENT_REGISTRATION - CLIENT_UPDATE - CLIENT_READ - CLIENT_DELETE - USER_AUTHORIZATION - BACKCHANNEL_AUTHENTICATION - BACKCHANNEL_DEVICE_REGISTRATION - USER_INFO - TOKEN_REQUEST - TOKEN_VALIDATE - TOKEN_REVOCATION - SESSION_UNAUTHENTICATED - SESSION_AUTHENTICATED - SESSION_DESTROYED - DEVICE_CODE_AUTHORIZATION - SSA_CREATE - SSA_READ Enable/Disable Audit Logs on Jans TUI # Using Jans TUI we can easily Enable or Disable Audit Logs. Go to jans tui select Auth Server tab then Properties tab. Now set the value of enabledOAuthAuditLogging pressing Enter button on your keyboard. Save it and let's see below image Have questions in the meantime? # You can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Audit Logs"}, {"location": "janssen-server/auth-server/logging/audit-logs/#audit-logs", "text": "Audit logs are located in jans-auth_audit.log log file. All jans-auth-server log files are located in /opt/jans/jetty/jans-auth/logs/ . Audit is disabled by default on AS and can be enabled via enabledOAuthAuditLogging AS configuration property. Audit logs are logged to file when enabled, however if JMS configuration is specified it will be logged to JMS as well. JMS Configuration must be set inside AS global configuration Name Description jmsBrokerURISet JMS Broker URI Set jmsUserName JMS UserName jmsPassword JMS Password. Audit events: - CLIENT_REGISTRATION - CLIENT_UPDATE - CLIENT_READ - CLIENT_DELETE - USER_AUTHORIZATION - BACKCHANNEL_AUTHENTICATION - BACKCHANNEL_DEVICE_REGISTRATION - USER_INFO - TOKEN_REQUEST - TOKEN_VALIDATE - TOKEN_REVOCATION - SESSION_UNAUTHENTICATED - SESSION_AUTHENTICATED - SESSION_DESTROYED - DEVICE_CODE_AUTHORIZATION - SSA_CREATE - SSA_READ", "title": "Audit Logs"}, {"location": "janssen-server/auth-server/logging/audit-logs/#enabledisable-audit-logs-on-jans-tui", "text": "Using Jans TUI we can easily Enable or Disable Audit Logs. Go to jans tui select Auth Server tab then Properties tab. Now set the value of enabledOAuthAuditLogging pressing Enter button on your keyboard. Save it and let's see below image", "title": "Enable/Disable Audit Logs on Jans TUI"}, {"location": "janssen-server/auth-server/logging/audit-logs/#have-questions-in-the-meantime", "text": "You can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "janssen-server/auth-server/logging/audit-logs/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/logging/custom-logs/", "tags": ["administration", "auth-server", "logging", "custom-logs"], "text": "Customize logs # Sometimes it can be useful to customize logging behavior or override AS loggers. It is possible to fully override AS logging configuration by specifying own log4j2.xml file in externalLoggerConfiguration AS configuration property. It must point to valid log4j2.xml file. Note: invalid external log4j2.xml can lead to AS start up issues and no logs in standard log files or otherwise in other log files if such are defined by log4j2.xml . Have questions in the meantime? # You can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Custom Logs"}, {"location": "janssen-server/auth-server/logging/custom-logs/#customize-logs", "text": "Sometimes it can be useful to customize logging behavior or override AS loggers. It is possible to fully override AS logging configuration by specifying own log4j2.xml file in externalLoggerConfiguration AS configuration property. It must point to valid log4j2.xml file. Note: invalid external log4j2.xml can lead to AS start up issues and no logs in standard log files or otherwise in other log files if such are defined by log4j2.xml .", "title": "Customize logs"}, {"location": "janssen-server/auth-server/logging/custom-logs/#have-questions-in-the-meantime", "text": "You can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "janssen-server/auth-server/logging/custom-logs/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/logging/log-levels/", "tags": ["administration", "auth-server", "logging-levels"], "text": "Log Levels # Log level for AS can be set in loggingLevel AS configuration property. AS under the hood is using log4j2 and slf4j . Thus logging levels in loggingLevel stick to log4j2 and are following: Log Level Description OFF No events will be logged. FATAL A fatal event that will prevent the application from continuing. ERROR An error in the application, possibly recoverable. WARN An event that might possible lead to an error. INFO An event for informational purposes. DEBUG A general debugging event. TRACE A fine-grained debug message, typically capturing the flow through the application. ALL All events should be logged. Select Log Levels on TUI # Go to Jans TUI jans tui . Select Auth Server tab then select Logging tab after that select Auth Server Log Level finally save logging and exit from TUI. Have questions in the meantime? # You can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover. Want to contribute? # If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Log Levels"}, {"location": "janssen-server/auth-server/logging/log-levels/#log-levels", "text": "Log level for AS can be set in loggingLevel AS configuration property. AS under the hood is using log4j2 and slf4j . Thus logging levels in loggingLevel stick to log4j2 and are following: Log Level Description OFF No events will be logged. FATAL A fatal event that will prevent the application from continuing. ERROR An error in the application, possibly recoverable. WARN An event that might possible lead to an error. INFO An event for informational purposes. DEBUG A general debugging event. TRACE A fine-grained debug message, typically capturing the flow through the application. ALL All events should be logged.", "title": "Log Levels"}, {"location": "janssen-server/auth-server/logging/log-levels/#select-log-levels-on-tui", "text": "Go to Jans TUI jans tui . Select Auth Server tab then select Logging tab after that select Auth Server Log Level finally save logging and exit from TUI.", "title": "Select Log Levels on TUI"}, {"location": "janssen-server/auth-server/logging/log-levels/#have-questions-in-the-meantime", "text": "You can ask questions through GitHub Discussions or the community chat on Gitter . Any questions you have will help determine what information our documentation should cover.", "title": "Have questions in the meantime?"}, {"location": "janssen-server/auth-server/logging/log-levels/#want-to-contribute", "text": "If you have content you'd like to contribute to this page in the meantime, you can get started with our Contribution guide .", "title": "Want to contribute?"}, {"location": "janssen-server/auth-server/logging/log4j2/", "tags": ["administration", "auth-server", "logging"], "text": "log4j2 # AS under the hood is using log4j2 and slf4j . AS is configured by log4j2.xml Main structure of which defines standard logs and which can be overwritten by specifying own custom log4j2.xml . Please reference log4j configuration for available logging options. Sample