Ticket-Granting Ticket REST Protocol

Ticket-granting tickets can be issued by the REST protocol:

1
2
3
POST /cas/v1/tickets HTTP/1.0
'Content-type': 'Application/x-www-form-urlencoded'
username=battags&password=password&additionalParam1=paramvalue

You may also specify a service parameter to verify whether the authenticated user may be allowed to access the given service.

Successful Response

1
2
201 Created
Location: http://www.whatever.com/cas/v1/tickets/{TGT id}

Remember that REST is stateless. Since the caller is the recipient of the ticket-granting ticket that represents a single sign-on session, that means the caller is also responsible for managing and creating single sign-on sessions, removing that responsibility from CAS. In other words, the REST protocol allows one to use CAS as an authentication engine, and not a single sign-on provider. There have been many workarounds, modifications and hacks over the years to bypass this barrier and have REST calls to also, somehow, create the necessary cookies, flows and interactions and whatever else necessary to allow applications to leverage a single sign-on session established via REST. Needless to say, all such endeavors over time have resulted in maintenance headaches, premature aging and loss of DNA.

Unsuccessful Response

If incorrect credentials are sent, CAS will respond with a 401 Unauthorized. A 400 Bad Request error will be sent for missing parameters, etc. If you send a media type it does not understand, it will send the 415 Unsupported Media Type.

JWT Ticket Granting Tickets

Ticket-granting tickets created by the REST protocol may be issued as JWTs instead. Support is enabled by including the following in your overlay:

1
2
3
4
5
<dependency>
  <groupId>org.apereo.cas</groupId>
  <artifactId>cas-server-support-rest-tokens</artifactId>
  <version>${cas.version}</version>
</dependency>
1
implementation "org.apereo.cas:cas-server-support-rest-tokens:${project.'cas.version'}"
1
2
3
4
5
6
7
8
9
dependencyManagement {
  imports {
    mavenBom "org.apereo.cas:cas-server-support-bom:${project.'cas.version'}"
  }
}

dependencies {  
  implementation "org.apereo.cas:cas-server-support-rest-tokens"
}

To request a ticket-granting ticket as JWT next, ensure the POST request matches the following:

1
2
3
POST /cas/v1/tickets HTTP/1.0

username=battags&password=password&token=true&additionalParam1=paramvalue

The token parameter may either be passed as a request parameter or a request header. The body of the response will include the ticket-granting ticket as a JWT. Note that JWTs created are typically signed and encrypted by default with pre-generated keys.

The following settings and properties are available from the CAS configuration catalog:

The configuration settings listed below are tagged as Required in the CAS configuration metadata. This flag indicates that the presence of the setting may be needed to activate or affect the behavior of the CAS feature and generally should be reviewed, possibly owned and adjusted. If the setting is assigned a default value, you do not need to strictly put the setting in your copy of the configuration, but should review it nonetheless to make sure it matches your deployment expectations.

  • cas.authn.token.principal-transformation.groovy.location=
  • The location of the resource. Resources can be URLS, or files found either on the classpath or outside somewhere in the file system.

    In the event the configured resource is a Groovy script, specially if the script set to reload on changes, you may need to adjust the total number of inotify instances. On Linux, you may need to add the following line to /etc/sysctl.conf: fs.inotify.max_user_instances = 256.

    You can check the current value via cat /proc/sys/fs/inotify/max_user_instances.

    org.apereo.cas.configuration.model.core.authentication.GroovyPrincipalTransformationProperties.

  • cas.authn.token.crypto.encryption.key=
  • The encryption key is a JWT whose length is defined by the encryption key size setting.

    org.apereo.cas.configuration.model.core.util.EncryptionJwtCryptoProperties.

  • cas.authn.token.crypto.signing.key=
  • The signing key is a JWT whose length is defined by the signing key size setting.

    org.apereo.cas.configuration.model.core.util.SigningJwtCryptoProperties.

    The configuration settings listed below are tagged as Optional in the CAS configuration metadata. This flag indicates that the presence of the setting is not immediately necessary in the end-user CAS configuration, because a default value is assigned or the activation of the feature is not conditionally controlled by the setting value.

  • cas.authn.token.principal-transformation.blocking-pattern=
  • A regular expression that will be used against the username to match for blocking/forbidden values. If a match is found, an exception will be thrown and principal transformation will fail.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

  • cas.authn.token.principal-transformation.case-conversion=NONE
  • Indicate whether the principal identifier should be transformed into upper-case, lower-case, etc. Available values are as follows:

    • NONE: No conversion.
    • LOWERCASE: Lowercase conversion.
    • UPPERCASE: Uppercase conversion.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

  • cas.authn.token.principal-transformation.pattern=
  • A regular expression that will be used against the provided username for username extractions. On a successful match, the first matched group in the pattern will be used as the extracted username.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

  • cas.authn.token.principal-transformation.prefix=
  • Prefix to add to the principal id prior to authentication.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

  • cas.authn.token.principal-transformation.suffix=
  • Suffix to add to the principal id prior to authentication.

    org.apereo.cas.configuration.model.core.authentication.PrincipalTransformationProperties.

  • cas.authn.token.crypto.alg=
  • The signing/encryption algorithm to use.

    org.apereo.cas.configuration.model.core.util.EncryptionOptionalSigningOptionalJwtCryptographyProperties.

  • cas.authn.token.crypto.enabled=true
  • Whether crypto operations are enabled.

    org.apereo.cas.configuration.model.core.util.EncryptionOptionalSigningOptionalJwtCryptographyProperties.

  • cas.authn.token.crypto.encryption-enabled=true
  • Whether crypto encryption operations are enabled.

    org.apereo.cas.configuration.model.core.util.EncryptionOptionalSigningOptionalJwtCryptographyProperties.

  • cas.authn.token.crypto.encryption.key-size=512
  • The encryption key size.

    org.apereo.cas.configuration.model.core.util.EncryptionJwtCryptoProperties.

  • cas.authn.token.crypto.signing-enabled=true
  • Whether crypto signing operations are enabled.

    org.apereo.cas.configuration.model.core.util.EncryptionOptionalSigningOptionalJwtCryptographyProperties.

  • cas.authn.token.crypto.signing.key-size=512
  • The signing key size.

    org.apereo.cas.configuration.model.core.util.SigningJwtCryptoProperties.

  • cas.authn.token.crypto.strategy-type=ENCRYPT_AND_SIGN
  • Control the cipher sequence of operations. The accepted values are:

    • ENCRYPT_AND_SIGN: Encrypt the value first, and then sign.
    • SIGN_AND_ENCRYPT: Sign the value first, and then encrypt.

    org.apereo.cas.configuration.model.core.util.EncryptionOptionalSigningOptionalJwtCryptographyProperties.

  • cas.authn.token.webflow.enabled=true
  • Whether webflow auto-configuration should be enabled.

    org.apereo.cas.configuration.model.core.web.flow.WebflowAutoConfigurationProperties.

  • cas.authn.token.webflow.order=0
  • The order in which the webflow is configured.

    org.apereo.cas.configuration.model.core.web.flow.WebflowAutoConfigurationProperties.

  • cas.authn.token.name=
  • Name of the authentication handler.

    org.apereo.cas.configuration.model.support.token.TokenAuthenticationProperties.

  • cas.authn.token.state=
  • Define the scope and state of this authentication handler and the lifecycle in which it can be invoked or activated.

    org.apereo.cas.configuration.model.support.token.TokenAuthenticationProperties.