Console
Get Started with data modeling
A step-by-step guide on how to create entities, attributes and relations.
Configuration permission policies
Add permissions to entities using policies.
Guide on Webhooks
Act on events using webhooks.
A step-by-step guide on how to create entities, attributes and relations.
Add permissions to entities using policies.
Act on events using webhooks.
Before creating a data model, you need to create a project.
You can do that with the “Create Project” button on the organization page:
In the pop-up dialog you can give your project a name:
Next, you have to select a blueprint to work with:
Now you can start the data modeling by clicking the Data model menu item:
In the Data model
tool you can model your business entities.
You start by creating your first “Entity” by clicking the “Add Entity” button and give it a name.
Now that you created your first entity, you’ll see that you can still edit the name of the entity or delete it.
An entity can have attributes and relations to other entities. When you create an attribute in an entity a dialog will pop up with a few options:
Attribute options:
You can also model relationships to other entities, or even to the same entity. To add a new relation to the entity, click the “Add Relation” button, and you will see a pop-up dialog:
When adding a relation, you have some options to configure:
ContentGrid takes a different approach to permissions than legacy content management systems. Instead of making a complex hierarchical tree structure of permissions with inheritance, a set of permission policies describes access for each entity. These policies are rules that contain logical expressions, making use of (a combination of) entity attributes and user attributes.
First, go to the Permissions modeler:
To create our first policy, we first have to choose the entity for which we are going to create a policy:
When clicking the “Create Policy” button you will see the configuration options for creating a new policy:
First, you’ll have to choose for which operation this policy will be evaluated. The options are: Read, Create, Update, Delete. You can choose one or more operations.
By choosing the visibility setting, you can define if this policy is applicable for authenticated users only, or for all users.
The “Additional conditions” section is where you define the conditions for this policy, access to the entity is granted when the conditions are fulfilled.
Multiple conditions can be applied, and each rule has a left and a right side, that are compared to each other. Both left and right sides of can be a “user attribute”, “entity attribute” or constant. The possible comparisons between the left and the right side are:
You can add more conditions with the “Add Condition” button. All conditions have to be satisfied before a policy grants access. Save the policy with the “Add Policy” button.
Now, you should see your policy for this entity in the overview.
Webhooks are one way that ContentGrid applications can send automated messages or information to external systems. They are almost always faster than polling, and require less work on your end.
Each mutating operation on an resource is handled individually and is asynchronously, but almost immediately delivered to the configured webhook endpoint.
A ContentGrid Webhook
First, go to the Webhooks modeler:
To create our first Webhook, we first have to click on Create Webhook:
When clicking the “Create Webhook” button you will see the configuration options for creating a new Webhook:
After clicking save, the Webhook is saved and is listed in the overview but will only be available to your ContentGrid runtime application once you create a new release.
You can add more Webhooks with the “Create Webhook” button.
A Webhook endpoint has some specific constraints and must respect the following implementation details:
ContentGrid signs JWTs using asymmetric encryption (RS256), and publishes the public signing keys in a JWKS (JSON Web Key Set).
The signing keys are rotated on a regular basis.
One of the benefits of JSON Web Token (JWT) is that you can validate a token using an easy cryptographic operation.
A JSON Web Key (JWK) is a JSON data structure that represents a cryptographic key. JWKs are a set of keys shared between different services and are used to verify the JWT token from the authorization server.
You should only be validating the received JWT against ContentGrid Json Web Key (JWK) URL which is ${CONTENTGRID_URL}/.well-known/jwks.json
We use JWKS to expose the public keys used by the ContentGrid platform to all the clients required to validate signatures.
For more information you can check the JWK RFC
The example of a JWKS is something that looks like this:
{
"keys": [
{
"use": "sig",
"kty": "RSA",
"kid": "UVelusmvyM2xScEu0F_xSNlhelC5jZTD77R_3mmOZXs",
"alg": "RS256",
"n": "...yjXzcFpbMJB1fIFam9lQBeXWbTqzJwbuFbspHMsRowa8FaPw44l2C9Q42J3AdQD8CcN...",
"e": "AQAB"
},
{
...
}
]
}
In the above example some important fields are
{
"kid": "UVelusmvyM2xScEu0F_xSNlhelC5jZTD77R_3mmOZXs",
"alg": "RS256"
}.{
"aud": "https://webhooks-demo.rtp-scw-sandbox.contentgrid.cloud/broker-process",
"exp": 1679044765,
"iat": 1679044465,
"jti": "df475d5a-fc0e-4fca-a03a-c279e86fe9ed"
}.[Signature]
Here is a Java exmaple of how to validate a JWT using JWKs with Nimbus JOSE + JWT
ResourceRetriever jwkSetRetriever = new DefaultResourceRetriever();
JWKSource<SecurityContext> jwkSource = new RemoteJWKSet<>(URI.create("${CONTENTGRID_URL}/.well-known/jwks.json").toURL(), jwkSetRetriever);
JWSKeySelector<SecurityContext> jwsKeySelector = JWSAlgorithmFamilyJWSKeySelector.fromJWKSource(jwkSource);
ConfigurableJWTProcessor<SecurityContext> jwtProcessor = new DefaultJWTProcessor<>();
jwtProcessor.setJWSKeySelector(jwsKeySelector);
jwtProcessor.setJWTClaimsSetVerifier((claims, context) -> {
final Date now = new Date();
final Date exp = claims.getExpirationTime();
if (exp != null) {
if (now.after(exp)) {
throw new BadJWTException("expired");
}
}
});
SignedJWT signedJWT = SignedJWT.parse(THE_JWT);
jwtProcessor.process(signedJWT, null);
This short guide provides the basic steps required to locally verify an access or ID token signed by ContentGrid. It uses packages from Nimbus JOSE + JWT for key parsing and token validation, but the general principles should apply to any JWT validation library.