This repository was archived by the owner on Apr 18, 2022. It is now read-only.

Repository files navigation

Authenticator

Maven CentralDocker Build Typescript typings for the apis are provided as npm packages: npm versionnpm versionnpm version

This service signs JWT tokens to be used by applications relying on the JWT-auth 1.1 microoprofile spec.

Architecture

The goal of this service is to allow application developers to rely on a trusted third party for user authentication. This trust is ensured by multiple means:

  • The TLS certificates exposed by this service during the SSL handshake guarantees an application is talking to a genuine authenticator service.
  • Cryptographic signature of the JWT tokens exchanged with each API call allow each party to check the signature validity.

The project is split into several modules:

  • At the core, authenticator-ejb provides the services to alter the database state, sign and verify jwt, and trigger calls to applications. authenticator-domain contains the POJOs exchanged during these internal calls, as well as the database-bound entities and some shared stuff.
  • A first web resource module, authenticator, and its api, autenticator-api exposes web services targetting end-user (applications frontends). It contains endpoints to sign an user in, out, get the logged user information, ...
  • Another web resources module, authenticator-admin, and its api, authenticator-admin-api expose web resources accessible for the administrator user. They can be used to manage users, applications and keys.
  • Another web resource module, authenticator-management and its api authenticator-management-api expose web resources targetting applications (backends). It allows applications registered with this service to create/register new users, validate their email, request new passwords, ...;
  • An application API, authenticator-application-api define rest resources an application must implement to integrates with this service. It is barely a couple of REST resources called on various events, like an user has been created, or removed, or an email address has been validated. The authenticator-application-client module contains the HTTP client used to contact applications using this API.

Getting started

You may deploy the authenticator-web artifact, which is a war bundling the modules decribed above, or provide the different modules in an ear. You need to configure your application container to reference a jndi resource jdbc/authenticator which will be used to connect to the database. Take a look at the example/microbundle project to build a payara-micro microbundle deploying the service using an h2 database.

Configuration

A configuration file defines the configuration keys used and their default value. You can provide configuration values using the microprofile-config mechanisms.

If you do not provide an admin password at startup, one will be generated and printed in the logs.

Creating applications

Once the service is running, you must register an application and generate an application secret. Use the admin api with your admin credentials to do so. You can find some example requests in the test resources of the example/microbundle module.

Implementing application-api

Applications implement the application-api and accept token signed by this service.

  • The authorization resource contains a listUserRoles returning s a list of roles that will be provided in the token as well as an healthcheck endpoint to ensure the jwt tokens are handled correctly.
  • The health resource should be already implemented by your container providing the microprofile-health api, although you may need to provide it under the correct context path.
  • The user event resource contains 3 endpoints that will be called asynchronously.

Applications configure their authentication mechanism to accept JWT signed using their key by this service issuer. Refer to the JWT 1.1 spec or the examples of this project to figure out how to configure the JWT authentication. You will need to provide the trusted public key as well as the accepted token issuer, at least. The application public key can be provided as an url: /app/${appName}/publicKey

Example application

Building the project with the example profile active produces a payaramicro executable jar deploying authenticator-web and another one deploying an example application. the authenticator service will be deployed on port 8443, the example application on port 8444. The authenticator service will be preconfigured for a second application deployed on port 8445 - to make use of this one, you have to generate a secret and specify the port and secret, for instance by passing system properties: -Dpayaramicro.sslPort=8445 -DappSecret=<generated app secret>.

The example application exposes a /test/ servlet with a login/register form and displaying rest responses and internal events.

Application domain

The service handles applications, (token signing) keys and users. They can be managed using the admin api.

Applications must be registered manually, and a secret token must be generated. The application is then deployed at the registered url, using its application secret to contact this service and trusting JWT tokens signed with its signing key. Healthcheck endpoints are implemented on both side to ensure communication between the service works as expected. Take care before using them as a docker healthcheck for instance: if both this service and the application are waiting on each other to become healthy to consider itself healthy, none of them may ever be reachable.

Signing keys are stored in the database as well. They are bound to a single scope. Key scopes include:

  • Keys intended to sign user token for this service audience (an user can request her information by means of the authenticator-api)
  • Keys intended to sign application secrets for this service audience (application secrets are long-lived jwt tokens)
  • Keys intended to sign token for an application audience (an user requesting a token for application X will be signed with application X key) Although 1 key for each scope is probably sufficient, keys may be rotated and deactivated.

Users are expected to create accounts on applications. Users with an existing account may use a rest resource to consult and update their data. User email verification is delegated to applications which have the permission.

Note on entropy

This service uses SecureRandom.getInstanceStrong() as its RNG, which in turn will use the /dev/random entropy source on unix systems. This entropy source may block until enough entropy is available, and as such the application may hang during key pair generation, like on first deployment. To avoid this, make sure your system is provided with enough entropy. Alternatively, using docker, you can bind-mount the host /dev/urandom - which does not block - as the container /dev/random. Make sure you understand the implications before using this.

Docker image

Docker images are built automatically. They fetch and deploy the authenticator-web war artifact on startup. You can specify the version to deploy by overwriting the CMD.

License

MIT, do whatever you want

Links

About

No description or website provided.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Authenticator

Maven CentralDocker Build Typescript typings for the apis are provided as npm packages: npm versionnpm versionnpm version

This service signs JWT tokens to be used by applications relying on the JWT-auth 1.1 microoprofile spec.

Architecture

The goal of this service is to allow application developers to rely on a trusted third party for user authentication. This trust is ensured by multiple means:

  • The TLS certificates exposed by this service during the SSL handshake guarantees an application is talking to a genuine authenticator service.
  • Cryptographic signature of the JWT tokens exchanged with each API call allow each party to check the signature validity.

The project is split into several modules:

  • At the core, authenticator-ejb provides the services to alter the database state, sign and verify jwt, and trigger calls to applications. authenticator-domain contains the POJOs exchanged during these internal calls, as well as the database-bound entities and some shared stuff.
  • A first web resource module, authenticator, and its api, autenticator-api exposes web services targetting end-user (applications frontends). It contains endpoints to sign an user in, out, get the logged user information, ...
  • Another web resources module, authenticator-admin, and its api, authenticator-admin-api expose web resources accessible for the administrator user. They can be used to manage users, applications and keys.
  • Another web resource module, authenticator-management and its api authenticator-management-api expose web resources targetting applications (backends). It allows applications registered with this service to create/register new users, validate their email, request new passwords, ...;
  • An application API, authenticator-application-api define rest resources an application must implement to integrates with this service. It is barely a couple of REST resources called on various events, like an user has been created, or removed, or an email address has been validated. The authenticator-application-client module contains the HTTP client used to contact applications using this API.

Getting started

You may deploy the authenticator-web artifact, which is a war bundling the modules decribed above, or provide the different modules in an ear. You need to configure your application container to reference a jndi resource jdbc/authenticator which will be used to connect to the database. Take a look at the example/microbundle project to build a payara-micro microbundle deploying the service using an h2 database.

Configuration

A configuration file defines the configuration keys used and their default value. You can provide configuration values using the microprofile-config mechanisms.

If you do not provide an admin password at startup, one will be generated and printed in the logs.

Creating applications

Once the service is running, you must register an application and generate an application secret. Use the admin api with your admin credentials to do so. You can find some example requests in the test resources of the example/microbundle module.

Implementing application-api

Applications implement the application-api and accept token signed by this service.

  • The authorization resource contains a listUserRoles returning s a list of roles that will be provided in the token as well as an healthcheck endpoint to ensure the jwt tokens are handled correctly.
  • The health resource should be already implemented by your container providing the microprofile-health api, although you may need to provide it under the correct context path.
  • The user event resource contains 3 endpoints that will be called asynchronously.

Applications configure their authentication mechanism to accept JWT signed using their key by this service issuer. Refer to the JWT 1.1 spec or the examples of this project to figure out how to configure the JWT authentication. You will need to provide the trusted public key as well as the accepted token issuer, at least. The application public key can be provided as an url: /app/${appName}/publicKey

Example application

Building the project with the example profile active produces a payaramicro executable jar deploying authenticator-web and another one deploying an example application. the authenticator service will be deployed on port 8443, the example application on port 8444. The authenticator service will be preconfigured for a second application deployed on port 8445 - to make use of this one, you have to generate a secret and specify the port and secret, for instance by passing system properties: -Dpayaramicro.sslPort=8445 -DappSecret=<generated app secret>.

The example application exposes a /test/ servlet with a login/register form and displaying rest responses and internal events.

Application domain

The service handles applications, (token signing) keys and users. They can be managed using the admin api.

Applications must be registered manually, and a secret token must be generated. The application is then deployed at the registered url, using its application secret to contact this service and trusting JWT tokens signed with its signing key. Healthcheck endpoints are implemented on both side to ensure communication between the service works as expected. Take care before using them as a docker healthcheck for instance: if both this service and the application are waiting on each other to become healthy to consider itself healthy, none of them may ever be reachable.

Signing keys are stored in the database as well. They are bound to a single scope. Key scopes include:

  • Keys intended to sign user token for this service audience (an user can request her information by means of the authenticator-api)
  • Keys intended to sign application secrets for this service audience (application secrets are long-lived jwt tokens)
  • Keys intended to sign token for an application audience (an user requesting a token for application X will be signed with application X key) Although 1 key for each scope is probably sufficient, keys may be rotated and deactivated.

Users are expected to create accounts on applications. Users with an existing account may use a rest resource to consult and update their data. User email verification is delegated to applications which have the permission.

Note on entropy

This service uses SecureRandom.getInstanceStrong() as its RNG, which in turn will use the /dev/random entropy source on unix systems. This entropy source may block until enough entropy is available, and as such the application may hang during key pair generation, like on first deployment. To avoid this, make sure your system is provided with enough entropy. Alternatively, using docker, you can bind-mount the host /dev/urandom - which does not block - as the container /dev/random. Make sure you understand the implications before using this.

Docker image

Docker images are built automatically. They fetch and deploy the authenticator-web war artifact on startup. You can specify the version to deploy by overwriting the CMD.

License

MIT, do whatever you want

Links

About

No description or website provided.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Authenticator

Maven CentralDocker Build Typescript typings for the apis are provided as npm packages: npm versionnpm versionnpm version

This service signs JWT tokens to be used by applications relying on the JWT-auth 1.1 microoprofile spec.

Architecture

The goal of this service is to allow application developers to rely on a trusted third party for user authentication. This trust is ensured by multiple means:

  • The TLS certificates exposed by this service during the SSL handshake guarantees an application is talking to a genuine authenticator service.
  • Cryptographic signature of the JWT tokens exchanged with each API call allow each party to check the signature validity.

The project is split into several modules:

  • At the core, authenticator-ejb provides the services to alter the database state, sign and verify jwt, and trigger calls to applications. authenticator-domain contains the POJOs exchanged during these internal calls, as well as the database-bound entities and some shared stuff.
  • A first web resource module, authenticator, and its api, autenticator-api exposes web services targetting end-user (applications frontends). It contains endpoints to sign an user in, out, get the logged user information, ...
  • Another web resources module, authenticator-admin, and its api, authenticator-admin-api expose web resources accessible for the administrator user. They can be used to manage users, applications and keys.
  • Another web resource module, authenticator-management and its api authenticator-management-api expose web resources targetting applications (backends). It allows applications registered with this service to create/register new users, validate their email, request new passwords, ...;
  • An application API, authenticator-application-api define rest resources an application must implement to integrates with this service. It is barely a couple of REST resources called on various events, like an user has been created, or removed, or an email address has been validated. The authenticator-application-client module contains the HTTP client used to contact applications using this API.

Getting started

You may deploy the authenticator-web artifact, which is a war bundling the modules decribed above, or provide the different modules in an ear. You need to configure your application container to reference a jndi resource jdbc/authenticator which will be used to connect to the database. Take a look at the example/microbundle project to build a payara-micro microbundle deploying the service using an h2 database.

Configuration

A configuration file defines the configuration keys used and their default value. You can provide configuration values using the microprofile-config mechanisms.

If you do not provide an admin password at startup, one will be generated and printed in the logs.

Creating applications

Once the service is running, you must register an application and generate an application secret. Use the admin api with your admin credentials to do so. You can find some example requests in the test resources of the example/microbundle module.

Implementing application-api

Applications implement the application-api and accept token signed by this service.

  • The authorization resource contains a listUserRoles returning s a list of roles that will be provided in the token as well as an healthcheck endpoint to ensure the jwt tokens are handled correctly.
  • The health resource should be already implemented by your container providing the microprofile-health api, although you may need to provide it under the correct context path.
  • The user event resource contains 3 endpoints that will be called asynchronously.

Applications configure their authentication mechanism to accept JWT signed using their key by this service issuer. Refer to the JWT 1.1 spec or the examples of this project to figure out how to configure the JWT authentication. You will need to provide the trusted public key as well as the accepted token issuer, at least. The application public key can be provided as an url: /app/${appName}/publicKey

Example application

Building the project with the example profile active produces a payaramicro executable jar deploying authenticator-web and another one deploying an example application. the authenticator service will be deployed on port 8443, the example application on port 8444. The authenticator service will be preconfigured for a second application deployed on port 8445 - to make use of this one, you have to generate a secret and specify the port and secret, for instance by passing system properties: -Dpayaramicro.sslPort=8445 -DappSecret=<generated app secret>.

The example application exposes a /test/ servlet with a login/register form and displaying rest responses and internal events.

Application domain

The service handles applications, (token signing) keys and users. They can be managed using the admin api.

Applications must be registered manually, and a secret token must be generated. The application is then deployed at the registered url, using its application secret to contact this service and trusting JWT tokens signed with its signing key. Healthcheck endpoints are implemented on both side to ensure communication between the service works as expected. Take care before using them as a docker healthcheck for instance: if both this service and the application are waiting on each other to become healthy to consider itself healthy, none of them may ever be reachable.

Signing keys are stored in the database as well. They are bound to a single scope. Key scopes include:

  • Keys intended to sign user token for this service audience (an user can request her information by means of the authenticator-api)
  • Keys intended to sign application secrets for this service audience (application secrets are long-lived jwt tokens)
  • Keys intended to sign token for an application audience (an user requesting a token for application X will be signed with application X key) Although 1 key for each scope is probably sufficient, keys may be rotated and deactivated.

Users are expected to create accounts on applications. Users with an existing account may use a rest resource to consult and update their data. User email verification is delegated to applications which have the permission.

Note on entropy

This service uses SecureRandom.getInstanceStrong() as its RNG, which in turn will use the /dev/random entropy source on unix systems. This entropy source may block until enough entropy is available, and as such the application may hang during key pair generation, like on first deployment. To avoid this, make sure your system is provided with enough entropy. Alternatively, using docker, you can bind-mount the host /dev/urandom - which does not block - as the container /dev/random. Make sure you understand the implications before using this.

Docker image

Docker images are built automatically. They fetch and deploy the authenticator-web war artifact on startup. You can specify the version to deploy by overwriting the CMD.

License

MIT, do whatever you want

Links

About

No description or website provided.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Authenticator

Maven CentralDocker Build Typescript typings for the apis are provided as npm packages: npm versionnpm versionnpm version

This service signs JWT tokens to be used by applications relying on the JWT-auth 1.1 microoprofile spec.

Architecture

The goal of this service is to allow application developers to rely on a trusted third party for user authentication. This trust is ensured by multiple means:

  • The TLS certificates exposed by this service during the SSL handshake guarantees an application is talking to a genuine authenticator service.
  • Cryptographic signature of the JWT tokens exchanged with each API call allow each party to check the signature validity.

The project is split into several modules:

  • At the core, authenticator-ejb provides the services to alter the database state, sign and verify jwt, and trigger calls to applications. authenticator-domain contains the POJOs exchanged during these internal calls, as well as the database-bound entities and some shared stuff.
  • A first web resource module, authenticator, and its api, autenticator-api exposes web services targetting end-user (applications frontends). It contains endpoints to sign an user in, out, get the logged user information, ...
  • Another web resources module, authenticator-admin, and its api, authenticator-admin-api expose web resources accessible for the administrator user. They can be used to manage users, applications and keys.
  • Another web resource module, authenticator-management and its api authenticator-management-api expose web resources targetting applications (backends). It allows applications registered with this service to create/register new users, validate their email, request new passwords, ...;
  • An application API, authenticator-application-api define rest resources an application must implement to integrates with this service. It is barely a couple of REST resources called on various events, like an user has been created, or removed, or an email address has been validated. The authenticator-application-client module contains the HTTP client used to contact applications using this API.

Getting started

You may deploy the authenticator-web artifact, which is a war bundling the modules decribed above, or provide the different modules in an ear. You need to configure your application container to reference a jndi resource jdbc/authenticator which will be used to connect to the database. Take a look at the example/microbundle project to build a payara-micro microbundle deploying the service using an h2 database.

Configuration

A configuration file defines the configuration keys used and their default value. You can provide configuration values using the microprofile-config mechanisms.

If you do not provide an admin password at startup, one will be generated and printed in the logs.

Creating applications

Once the service is running, you must register an application and generate an application secret. Use the admin api with your admin credentials to do so. You can find some example requests in the test resources of the example/microbundle module.

Implementing application-api

Applications implement the application-api and accept token signed by this service.

  • The authorization resource contains a listUserRoles returning s a list of roles that will be provided in the token as well as an healthcheck endpoint to ensure the jwt tokens are handled correctly.
  • The health resource should be already implemented by your container providing the microprofile-health api, although you may need to provide it under the correct context path.
  • The user event resource contains 3 endpoints that will be called asynchronously.

Applications configure their authentication mechanism to accept JWT signed using their key by this service issuer. Refer to the JWT 1.1 spec or the examples of this project to figure out how to configure the JWT authentication. You will need to provide the trusted public key as well as the accepted token issuer, at least. The application public key can be provided as an url: /app/${appName}/publicKey

Example application

Building the project with the example profile active produces a payaramicro executable jar deploying authenticator-web and another one deploying an example application. the authenticator service will be deployed on port 8443, the example application on port 8444. The authenticator service will be preconfigured for a second application deployed on port 8445 - to make use of this one, you have to generate a secret and specify the port and secret, for instance by passing system properties: -Dpayaramicro.sslPort=8445 -DappSecret=<generated app secret>.

The example application exposes a /test/ servlet with a login/register form and displaying rest responses and internal events.

Application domain

The service handles applications, (token signing) keys and users. They can be managed using the admin api.

Applications must be registered manually, and a secret token must be generated. The application is then deployed at the registered url, using its application secret to contact this service and trusting JWT tokens signed with its signing key. Healthcheck endpoints are implemented on both side to ensure communication between the service works as expected. Take care before using them as a docker healthcheck for instance: if both this service and the application are waiting on each other to become healthy to consider itself healthy, none of them may ever be reachable.

Signing keys are stored in the database as well. They are bound to a single scope. Key scopes include:

  • Keys intended to sign user token for this service audience (an user can request her information by means of the authenticator-api)
  • Keys intended to sign application secrets for this service audience (application secrets are long-lived jwt tokens)
  • Keys intended to sign token for an application audience (an user requesting a token for application X will be signed with application X key) Although 1 key for each scope is probably sufficient, keys may be rotated and deactivated.

Users are expected to create accounts on applications. Users with an existing account may use a rest resource to consult and update their data. User email verification is delegated to applications which have the permission.

Note on entropy

This service uses SecureRandom.getInstanceStrong() as its RNG, which in turn will use the /dev/random entropy source on unix systems. This entropy source may block until enough entropy is available, and as such the application may hang during key pair generation, like on first deployment. To avoid this, make sure your system is provided with enough entropy. Alternatively, using docker, you can bind-mount the host /dev/urandom - which does not block - as the container /dev/random. Make sure you understand the implications before using this.

Docker image

Docker images are built automatically. They fetch and deploy the authenticator-web war artifact on startup. You can specify the version to deploy by overwriting the CMD.

License

MIT, do whatever you want

Links

About

No description or website provided.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Authenticator

Maven CentralDocker Build Typescript typings for the apis are provided as npm packages: npm versionnpm versionnpm version

This service signs JWT tokens to be used by applications relying on the JWT-auth 1.1 microoprofile spec.

Architecture

The goal of this service is to allow application developers to rely on a trusted third party for user authentication. This trust is ensured by multiple means:

  • The TLS certificates exposed by this service during the SSL handshake guarantees an application is talking to a genuine authenticator service.
  • Cryptographic signature of the JWT tokens exchanged with each API call allow each party to check the signature validity.

The project is split into several modules:

  • At the core, authenticator-ejb provides the services to alter the database state, sign and verify jwt, and trigger calls to applications. authenticator-domain contains the POJOs exchanged during these internal calls, as well as the database-bound entities and some shared stuff.
  • A first web resource module, authenticator, and its api, autenticator-api exposes web services targetting end-user (applications frontends). It contains endpoints to sign an user in, out, get the logged user information, ...
  • Another web resources module, authenticator-admin, and its api, authenticator-admin-api expose web resources accessible for the administrator user. They can be used to manage users, applications and keys.
  • Another web resource module, authenticator-management and its api authenticator-management-api expose web resources targetting applications (backends). It allows applications registered with this service to create/register new users, validate their email, request new passwords, ...;
  • An application API, authenticator-application-api define rest resources an application must implement to integrates with this service. It is barely a couple of REST resources called on various events, like an user has been created, or removed, or an email address has been validated. The authenticator-application-client module contains the HTTP client used to contact applications using this API.

Getting started

You may deploy the authenticator-web artifact, which is a war bundling the modules decribed above, or provide the different modules in an ear. You need to configure your application container to reference a jndi resource jdbc/authenticator which will be used to connect to the database. Take a look at the example/microbundle project to build a payara-micro microbundle deploying the service using an h2 database.

Configuration

A configuration file defines the configuration keys used and their default value. You can provide configuration values using the microprofile-config mechanisms.

If you do not provide an admin password at startup, one will be generated and printed in the logs.

Creating applications

Once the service is running, you must register an application and generate an application secret. Use the admin api with your admin credentials to do so. You can find some example requests in the test resources of the example/microbundle module.

Implementing application-api

Applications implement the application-api and accept token signed by this service.

  • The authorization resource contains a listUserRoles returning s a list of roles that will be provided in the token as well as an healthcheck endpoint to ensure the jwt tokens are handled correctly.
  • The health resource should be already implemented by your container providing the microprofile-health api, although you may need to provide it under the correct context path.
  • The user event resource contains 3 endpoints that will be called asynchronously.

Applications configure their authentication mechanism to accept JWT signed using their key by this service issuer. Refer to the JWT 1.1 spec or the examples of this project to figure out how to configure the JWT authentication. You will need to provide the trusted public key as well as the accepted token issuer, at least. The application public key can be provided as an url: /app/${appName}/publicKey

Example application

Building the project with the example profile active produces a payaramicro executable jar deploying authenticator-web and another one deploying an example application. the authenticator service will be deployed on port 8443, the example application on port 8444. The authenticator service will be preconfigured for a second application deployed on port 8445 - to make use of this one, you have to generate a secret and specify the port and secret, for instance by passing system properties: -Dpayaramicro.sslPort=8445 -DappSecret=<generated app secret>.

The example application exposes a /test/ servlet with a login/register form and displaying rest responses and internal events.

Application domain

The service handles applications, (token signing) keys and users. They can be managed using the admin api.

Applications must be registered manually, and a secret token must be generated. The application is then deployed at the registered url, using its application secret to contact this service and trusting JWT tokens signed with its signing key. Healthcheck endpoints are implemented on both side to ensure communication between the service works as expected. Take care before using them as a docker healthcheck for instance: if both this service and the application are waiting on each other to become healthy to consider itself healthy, none of them may ever be reachable.

Signing keys are stored in the database as well. They are bound to a single scope. Key scopes include:

  • Keys intended to sign user token for this service audience (an user can request her information by means of the authenticator-api)
  • Keys intended to sign application secrets for this service audience (application secrets are long-lived jwt tokens)
  • Keys intended to sign token for an application audience (an user requesting a token for application X will be signed with application X key) Although 1 key for each scope is probably sufficient, keys may be rotated and deactivated.

Users are expected to create accounts on applications. Users with an existing account may use a rest resource to consult and update their data. User email verification is delegated to applications which have the permission.

Note on entropy

This service uses SecureRandom.getInstanceStrong() as its RNG, which in turn will use the /dev/random entropy source on unix systems. This entropy source may block until enough entropy is available, and as such the application may hang during key pair generation, like on first deployment. To avoid this, make sure your system is provided with enough entropy. Alternatively, using docker, you can bind-mount the host /dev/urandom - which does not block - as the container /dev/random. Make sure you understand the implications before using this.

Docker image

Docker images are built automatically. They fetch and deploy the authenticator-web war artifact on startup. You can specify the version to deploy by overwriting the CMD.

License

MIT, do whatever you want

Links

About

No description or website provided.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Authenticator

Maven CentralDocker Build Typescript typings for the apis are provided as npm packages: npm versionnpm versionnpm version

This service signs JWT tokens to be used by applications relying on the JWT-auth 1.1 microoprofile spec.

Architecture

The goal of this service is to allow application developers to rely on a trusted third party for user authentication. This trust is ensured by multiple means:

  • The TLS certificates exposed by this service during the SSL handshake guarantees an application is talking to a genuine authenticator service.
  • Cryptographic signature of the JWT tokens exchanged with each API call allow each party to check the signature validity.

The project is split into several modules:

  • At the core, authenticator-ejb provides the services to alter the database state, sign and verify jwt, and trigger calls to applications. authenticator-domain contains the POJOs exchanged during these internal calls, as well as the database-bound entities and some shared stuff.
  • A first web resource module, authenticator, and its api, autenticator-api exposes web services targetting end-user (applications frontends). It contains endpoints to sign an user in, out, get the logged user information, ...
  • Another web resources module, authenticator-admin, and its api, authenticator-admin-api expose web resources accessible for the administrator user. They can be used to manage users, applications and keys.
  • Another web resource module, authenticator-management and its api authenticator-management-api expose web resources targetting applications (backends). It allows applications registered with this service to create/register new users, validate their email, request new passwords, ...;
  • An application API, authenticator-application-api define rest resources an application must implement to integrates with this service. It is barely a couple of REST resources called on various events, like an user has been created, or removed, or an email address has been validated. The authenticator-application-client module contains the HTTP client used to contact applications using this API.

Getting started

You may deploy the authenticator-web artifact, which is a war bundling the modules decribed above, or provide the different modules in an ear. You need to configure your application container to reference a jndi resource jdbc/authenticator which will be used to connect to the database. Take a look at the example/microbundle project to build a payara-micro microbundle deploying the service using an h2 database.

Configuration

A configuration file defines the configuration keys used and their default value. You can provide configuration values using the microprofile-config mechanisms.

If you do not provide an admin password at startup, one will be generated and printed in the logs.

Creating applications

Once the service is running, you must register an application and generate an application secret. Use the admin api with your admin credentials to do so. You can find some example requests in the test resources of the example/microbundle module.

Implementing application-api

Applications implement the application-api and accept token signed by this service.

  • The authorization resource contains a listUserRoles returning s a list of roles that will be provided in the token as well as an healthcheck endpoint to ensure the jwt tokens are handled correctly.
  • The health resource should be already implemented by your container providing the microprofile-health api, although you may need to provide it under the correct context path.
  • The user event resource contains 3 endpoints that will be called asynchronously.

Applications configure their authentication mechanism to accept JWT signed using their key by this service issuer. Refer to the JWT 1.1 spec or the examples of this project to figure out how to configure the JWT authentication. You will need to provide the trusted public key as well as the accepted token issuer, at least. The application public key can be provided as an url: /app/${appName}/publicKey

Example application

Building the project with the example profile active produces a payaramicro executable jar deploying authenticator-web and another one deploying an example application. the authenticator service will be deployed on port 8443, the example application on port 8444. The authenticator service will be preconfigured for a second application deployed on port 8445 - to make use of this one, you have to generate a secret and specify the port and secret, for instance by passing system properties: -Dpayaramicro.sslPort=8445 -DappSecret=<generated app secret>.

The example application exposes a /test/ servlet with a login/register form and displaying rest responses and internal events.

Application domain

The service handles applications, (token signing) keys and users. They can be managed using the admin api.

Applications must be registered manually, and a secret token must be generated. The application is then deployed at the registered url, using its application secret to contact this service and trusting JWT tokens signed with its signing key. Healthcheck endpoints are implemented on both side to ensure communication between the service works as expected. Take care before using them as a docker healthcheck for instance: if both this service and the application are waiting on each other to become healthy to consider itself healthy, none of them may ever be reachable.

Signing keys are stored in the database as well. They are bound to a single scope. Key scopes include:

  • Keys intended to sign user token for this service audience (an user can request her information by means of the authenticator-api)
  • Keys intended to sign application secrets for this service audience (application secrets are long-lived jwt tokens)
  • Keys intended to sign token for an application audience (an user requesting a token for application X will be signed with application X key) Although 1 key for each scope is probably sufficient, keys may be rotated and deactivated.

Users are expected to create accounts on applications. Users with an existing account may use a rest resource to consult and update their data. User email verification is delegated to applications which have the permission.

Note on entropy

This service uses SecureRandom.getInstanceStrong() as its RNG, which in turn will use the /dev/random entropy source on unix systems. This entropy source may block until enough entropy is available, and as such the application may hang during key pair generation, like on first deployment. To avoid this, make sure your system is provided with enough entropy. Alternatively, using docker, you can bind-mount the host /dev/urandom - which does not block - as the container /dev/random. Make sure you understand the implications before using this.

Docker image

Docker images are built automatically. They fetch and deploy the authenticator-web war artifact on startup. You can specify the version to deploy by overwriting the CMD.

License

MIT, do whatever you want

Links

About

No description or website provided.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Authenticator

Maven CentralDocker Build Typescript typings for the apis are provided as npm packages: npm versionnpm versionnpm version

This service signs JWT tokens to be used by applications relying on the JWT-auth 1.1 microoprofile spec.

Architecture

The goal of this service is to allow application developers to rely on a trusted third party for user authentication. This trust is ensured by multiple means:

  • The TLS certificates exposed by this service during the SSL handshake guarantees an application is talking to a genuine authenticator service.
  • Cryptographic signature of the JWT tokens exchanged with each API call allow each party to check the signature validity.

The project is split into several modules:

  • At the core, authenticator-ejb provides the services to alter the database state, sign and verify jwt, and trigger calls to applications. authenticator-domain contains the POJOs exchanged during these internal calls, as well as the database-bound entities and some shared stuff.
  • A first web resource module, authenticator, and its api, autenticator-api exposes web services targetting end-user (applications frontends). It contains endpoints to sign an user in, out, get the logged user information, ...
  • Another web resources module, authenticator-admin, and its api, authenticator-admin-api expose web resources accessible for the administrator user. They can be used to manage users, applications and keys.
  • Another web resource module, authenticator-management and its api authenticator-management-api expose web resources targetting applications (backends). It allows applications registered with this service to create/register new users, validate their email, request new passwords, ...;
  • An application API, authenticator-application-api define rest resources an application must implement to integrates with this service. It is barely a couple of REST resources called on various events, like an user has been created, or removed, or an email address has been validated. The authenticator-application-client module contains the HTTP client used to contact applications using this API.

Getting started

You may deploy the authenticator-web artifact, which is a war bundling the modules decribed above, or provide the different modules in an ear. You need to configure your application container to reference a jndi resource jdbc/authenticator which will be used to connect to the database. Take a look at the example/microbundle project to build a payara-micro microbundle deploying the service using an h2 database.

Configuration

A configuration file defines the configuration keys used and their default value. You can provide configuration values using the microprofile-config mechanisms.

If you do not provide an admin password at startup, one will be generated and printed in the logs.

Creating applications

Once the service is running, you must register an application and generate an application secret. Use the admin api with your admin credentials to do so. You can find some example requests in the test resources of the example/microbundle module.

Implementing application-api

Applications implement the application-api and accept token signed by this service.

  • The authorization resource contains a listUserRoles returning s a list of roles that will be provided in the token as well as an healthcheck endpoint to ensure the jwt tokens are handled correctly.
  • The health resource should be already implemented by your container providing the microprofile-health api, although you may need to provide it under the correct context path.
  • The user event resource contains 3 endpoints that will be called asynchronously.

Applications configure their authentication mechanism to accept JWT signed using their key by this service issuer. Refer to the JWT 1.1 spec or the examples of this project to figure out how to configure the JWT authentication. You will need to provide the trusted public key as well as the accepted token issuer, at least. The application public key can be provided as an url: /app/${appName}/publicKey

Example application

Building the project with the example profile active produces a payaramicro executable jar deploying authenticator-web and another one deploying an example application. the authenticator service will be deployed on port 8443, the example application on port 8444. The authenticator service will be preconfigured for a second application deployed on port 8445 - to make use of this one, you have to generate a secret and specify the port and secret, for instance by passing system properties: -Dpayaramicro.sslPort=8445 -DappSecret=<generated app secret>.

The example application exposes a /test/ servlet with a login/register form and displaying rest responses and internal events.

Application domain

The service handles applications, (token signing) keys and users. They can be managed using the admin api.

Applications must be registered manually, and a secret token must be generated. The application is then deployed at the registered url, using its application secret to contact this service and trusting JWT tokens signed with its signing key. Healthcheck endpoints are implemented on both side to ensure communication between the service works as expected. Take care before using them as a docker healthcheck for instance: if both this service and the application are waiting on each other to become healthy to consider itself healthy, none of them may ever be reachable.

Signing keys are stored in the database as well. They are bound to a single scope. Key scopes include:

  • Keys intended to sign user token for this service audience (an user can request her information by means of the authenticator-api)
  • Keys intended to sign application secrets for this service audience (application secrets are long-lived jwt tokens)
  • Keys intended to sign token for an application audience (an user requesting a token for application X will be signed with application X key) Although 1 key for each scope is probably sufficient, keys may be rotated and deactivated.

Users are expected to create accounts on applications. Users with an existing account may use a rest resource to consult and update their data. User email verification is delegated to applications which have the permission.

Note on entropy

This service uses SecureRandom.getInstanceStrong() as its RNG, which in turn will use the /dev/random entropy source on unix systems. This entropy source may block until enough entropy is available, and as such the application may hang during key pair generation, like on first deployment. To avoid this, make sure your system is provided with enough entropy. Alternatively, using docker, you can bind-mount the host /dev/urandom - which does not block - as the container /dev/random. Make sure you understand the implications before using this.

Docker image

Docker images are built automatically. They fetch and deploy the authenticator-web war artifact on startup. You can specify the version to deploy by overwriting the CMD.

License

MIT, do whatever you want

Links

About

No description or website provided.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Authenticator

Maven CentralDocker Build Typescript typings for the apis are provided as npm packages: npm versionnpm versionnpm version

This service signs JWT tokens to be used by applications relying on the JWT-auth 1.1 microoprofile spec.

Architecture

The goal of this service is to allow application developers to rely on a trusted third party for user authentication. This trust is ensured by multiple means:

  • The TLS certificates exposed by this service during the SSL handshake guarantees an application is talking to a genuine authenticator service.
  • Cryptographic signature of the JWT tokens exchanged with each API call allow each party to check the signature validity.

The project is split into several modules:

  • At the core, authenticator-ejb provides the services to alter the database state, sign and verify jwt, and trigger calls to applications. authenticator-domain contains the POJOs exchanged during these internal calls, as well as the database-bound entities and some shared stuff.
  • A first web resource module, authenticator, and its api, autenticator-api exposes web services targetting end-user (applications frontends). It contains endpoints to sign an user in, out, get the logged user information, ...
  • Another web resources module, authenticator-admin, and its api, authenticator-admin-api expose web resources accessible for the administrator user. They can be used to manage users, applications and keys.
  • Another web resource module, authenticator-management and its api authenticator-management-api expose web resources targetting applications (backends). It allows applications registered with this service to create/register new users, validate their email, request new passwords, ...;
  • An application API, authenticator-application-api define rest resources an application must implement to integrates with this service. It is barely a couple of REST resources called on various events, like an user has been created, or removed, or an email address has been validated. The authenticator-application-client module contains the HTTP client used to contact applications using this API.

Getting started

You may deploy the authenticator-web artifact, which is a war bundling the modules decribed above, or provide the different modules in an ear. You need to configure your application container to reference a jndi resource jdbc/authenticator which will be used to connect to the database. Take a look at the example/microbundle project to build a payara-micro microbundle deploying the service using an h2 database.

Configuration

A configuration file defines the configuration keys used and their default value. You can provide configuration values using the microprofile-config mechanisms.

If you do not provide an admin password at startup, one will be generated and printed in the logs.

Creating applications

Once the service is running, you must register an application and generate an application secret. Use the admin api with your admin credentials to do so. You can find some example requests in the test resources of the example/microbundle module.

Implementing application-api

Applications implement the application-api and accept token signed by this service.

  • The authorization resource contains a listUserRoles returning s a list of roles that will be provided in the token as well as an healthcheck endpoint to ensure the jwt tokens are handled correctly.
  • The health resource should be already implemented by your container providing the microprofile-health api, although you may need to provide it under the correct context path.
  • The user event resource contains 3 endpoints that will be called asynchronously.

Applications configure their authentication mechanism to accept JWT signed using their key by this service issuer. Refer to the JWT 1.1 spec or the examples of this project to figure out how to configure the JWT authentication. You will need to provide the trusted public key as well as the accepted token issuer, at least. The application public key can be provided as an url: /app/${appName}/publicKey

Example application

Building the project with the example profile active produces a payaramicro executable jar deploying authenticator-web and another one deploying an example application. the authenticator service will be deployed on port 8443, the example application on port 8444. The authenticator service will be preconfigured for a second application deployed on port 8445 - to make use of this one, you have to generate a secret and specify the port and secret, for instance by passing system properties: -Dpayaramicro.sslPort=8445 -DappSecret=<generated app secret>.

The example application exposes a /test/ servlet with a login/register form and displaying rest responses and internal events.

Application domain

The service handles applications, (token signing) keys and users. They can be managed using the admin api.

Applications must be registered manually, and a secret token must be generated. The application is then deployed at the registered url, using its application secret to contact this service and trusting JWT tokens signed with its signing key. Healthcheck endpoints are implemented on both side to ensure communication between the service works as expected. Take care before using them as a docker healthcheck for instance: if both this service and the application are waiting on each other to become healthy to consider itself healthy, none of them may ever be reachable.

Signing keys are stored in the database as well. They are bound to a single scope. Key scopes include:

  • Keys intended to sign user token for this service audience (an user can request her information by means of the authenticator-api)
  • Keys intended to sign application secrets for this service audience (application secrets are long-lived jwt tokens)
  • Keys intended to sign token for an application audience (an user requesting a token for application X will be signed with application X key) Although 1 key for each scope is probably sufficient, keys may be rotated and deactivated.

Users are expected to create accounts on applications. Users with an existing account may use a rest resource to consult and update their data. User email verification is delegated to applications which have the permission.

Note on entropy

This service uses SecureRandom.getInstanceStrong() as its RNG, which in turn will use the /dev/random entropy source on unix systems. This entropy source may block until enough entropy is available, and as such the application may hang during key pair generation, like on first deployment. To avoid this, make sure your system is provided with enough entropy. Alternatively, using docker, you can bind-mount the host /dev/urandom - which does not block - as the container /dev/random. Make sure you understand the implications before using this.

Docker image

Docker images are built automatically. They fetch and deploy the authenticator-web war artifact on startup. You can specify the version to deploy by overwriting the CMD.

License

MIT, do whatever you want

Links

About

No description or website provided.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages