Add examples for action token spi to explain how to create a token.
This commit is contained in:
parent
218d2dd976
commit
c143e2746b
1 changed files with 63 additions and 8 deletions
|
@ -35,7 +35,7 @@ In addition, an action token can contain any number of custom fields serializabl
|
||||||
|
|
||||||
When an action token is passed to a {project_name} endpoint
|
When an action token is passed to a {project_name} endpoint
|
||||||
`_KEYCLOAK_ROOT_/auth/realms/master/login-actions/action-token` via `key` parameter, it is validated and a proper action
|
`_KEYCLOAK_ROOT_/auth/realms/master/login-actions/action-token` via `key` parameter, it is validated and a proper action
|
||||||
token handler is executed. The processing always takes place in a context of an authentication session, either a fresh
|
token handler is executed. *The processing always takes place in a context of an authentication session*, either a fresh
|
||||||
one or the action token service joins an existing authentication session (details are described below). The action token
|
one or the action token service joins an existing authentication session (details are described below). The action token
|
||||||
handler can perform actions prescribed by the token (often it alters the authentication session) and results into an HTTP
|
handler can perform actions prescribed by the token (often it alters the authentication session) and results into an HTTP
|
||||||
response (e.g. it can continue in authentication or display an information/error page). These steps are detailed below.
|
response (e.g. it can continue in authentication or display an information/error page). These steps are detailed below.
|
||||||
|
@ -69,6 +69,68 @@ above), it can be serialized and signed as such using Keycloak's `JWSBuilder` cl
|
||||||
implemented in `serialize(session, realm, uriInfo)` method of `org.keycloak.authentication.actiontoken.DefaultActionToken`
|
implemented in `serialize(session, realm, uriInfo)` method of `org.keycloak.authentication.actiontoken.DefaultActionToken`
|
||||||
and can be leveraged by implementors by using that class for tokens instead of plain `JsonWebToken`.
|
and can be leveraged by implementors by using that class for tokens instead of plain `JsonWebToken`.
|
||||||
|
|
||||||
|
The following example shows the implementation of a simple action token. Note that the class must have a private constructor without any arguments.
|
||||||
|
This is necessary to deserialize the token class from JWT.
|
||||||
|
|
||||||
|
[source,java]
|
||||||
|
----
|
||||||
|
import org.keycloak.authentication.actiontoken.DefaultActionToken;
|
||||||
|
|
||||||
|
public class DemoActionToken extends DefaultActionToken {
|
||||||
|
|
||||||
|
public static final String TOKEN_TYPE = "my-demo-token";
|
||||||
|
|
||||||
|
public DemoActionToken(String userId, int absoluteExpirationInSecs, String compoundAuthenticationSessionId) {
|
||||||
|
super(userId, TOKEN_TYPE, absoluteExpirationInSecs, null, compoundAuthenticationSessionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DemoActionToken() {
|
||||||
|
// Required to deserialize from JWT
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
If the action token you are implementing contains any custom fields that should be serializabled to JSON fields, you
|
||||||
|
should consider implementing a descendant of `org.keycloak.representations.JsonWebToken` class that would implement
|
||||||
|
`org.keycloak.models.ActionTokenKeyModel` interface. In that case, you can take advantage of the existing
|
||||||
|
`org.keycloak.authentication.actiontoken.DefaultActionToken` class as it already satisfies both these conditions,
|
||||||
|
and either use it directly or implement its child, the fields of which can be annotated with appropriate Jackson
|
||||||
|
annotations, e.g. `com.fasterxml.jackson.annotation.JsonProperty` to serialize them to JSON.
|
||||||
|
|
||||||
|
The following example extends the `DemoActionToken` from the previous example with the field `demo-id`:
|
||||||
|
|
||||||
|
[source,java]
|
||||||
|
----
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import org.keycloak.authentication.actiontoken.DefaultActionToken;
|
||||||
|
|
||||||
|
public class DemoActionToken extends DefaultActionToken {
|
||||||
|
|
||||||
|
public static final String TOKEN_TYPE = "my-demo-token";
|
||||||
|
|
||||||
|
private static final String JSON_FIELD_DEMO_ID = "demo-id";
|
||||||
|
|
||||||
|
@JsonProperty(value = JSON_FIELD_DEMO_ID)
|
||||||
|
private String demoId;
|
||||||
|
|
||||||
|
public DemoActionToken(String userId, int absoluteExpirationInSecs, String compoundAuthenticationSessionId, String demoId) {
|
||||||
|
super(userId, TOKEN_TYPE, absoluteExpirationInSecs, null, compoundAuthenticationSessionId);
|
||||||
|
this.demoId = demoId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private DemoActionToken() {
|
||||||
|
// you must have this private constructor for deserializer
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDemoId() {
|
||||||
|
return demoId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
|
||||||
==== Packaging Classes and Deployment
|
==== Packaging Classes and Deployment
|
||||||
|
|
||||||
To plug your own action token and its handler, you need to implement few interfaces on server side:
|
To plug your own action token and its handler, you need to implement few interfaces on server side:
|
||||||
|
@ -108,11 +170,4 @@ only method that needs to be implemented is `handleToken(token, context)` that p
|
||||||
Note that you have to register the custom `ActionTokenHandlerFactory` implementation as explained in the
|
Note that you have to register the custom `ActionTokenHandlerFactory` implementation as explained in the
|
||||||
<<_providers,Service Provider Interfaces>> section of this guide.
|
<<_providers,Service Provider Interfaces>> section of this guide.
|
||||||
|
|
||||||
* If the action token you are implementing contains any custom fields that should be serializabled to JSON fields, you
|
|
||||||
should consider implementing a descendant of `org.keycloak.representations.JsonWebToken` class that would implement
|
|
||||||
`org.keycloak.models.ActionTokenKeyModel` interface. In that case, you can take advantage of the existing
|
|
||||||
`org.keycloak.authentication.actiontoken.DefaultActionToken` class as it already satisfies both these conditions,
|
|
||||||
and either use it directly or implement its child, the fields of which can be annotated with appropriate Jackson
|
|
||||||
annotations, e.g. `com.fasterxml.jackson.annotation.JsonProperty` to serialize them to JSON.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue