How Clients Authenticate
RESTHeart CloudConfiguration
The URL and credentials the examples on this page use
Setup Guide
Where to run the examples on this page
To run the examples on this page, you need a RESTHeart instance.
Option 1: Use Ulabase (Recommended)
The fastest way to get started is with Ulabase. Create a free service in minutes:
-
Sign up at ulabase.com
-
Create a free API service
-
Set up your root user following the Root User Setup guide
-
Use the configuration panel above to set your service URL and credentials
|
Tip
|
All code examples on this page will automatically use your configured Ulabase credentials. |
Option 2: Run RESTHeart Locally
If you prefer local development, follow the Setup Guide to install RESTHeart on your machine.
|
Note
|
Local instances run at http://localhost:8080 with default credentials admin:secret
|
Introduction
Clients can authenticate passing credentials via the different authentication schemes handled by restheart-security. This section shows how clients can authenticate using the simple basic authentication, a standard method for an HTTP user agent to provide a username and password when making a request.
Some examples
Here’s how to authenticate with basic credentials:
cURL
curl -i --user [BASIC-AUTH] -X GET [RESTHEART-URL]/
HTTPie
http -a [BASIC-AUTH] GET [RESTHEART-URL]/
JavaScript
const username = 'your-username';
const password = 'your-password';
const credentials = btoa(`${username}:${password}`);
fetch('[RESTHEART-URL]/', {
method: 'GET',
headers: {
'Authorization': `Basic ${credentials}`
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
Basic Authentication for dummies
Basic Authentication requires the client to send its credentials with the Authorization request header.
The value of the Authorization request header must be: Basic base64(<userid> + ':' + <password>)
In other words:
-
userid and password are combined into a string "userid:password". Note the colon between userid and password (userid cannot contain the ":" character).
-
The resulting string is base 64 encoded
-
The string "Basic " (note the space) is then put before the encoded string.
Authentication Token
RESTHeart default configuration includes the tokenBasicAuthMechanism and the rndTokenManager.
With those plugins enabled, when a request is successfully authenticated, an auth token is generated by the Token Manager and included in every subsequent responses.
the tokenBasicAuthMechanism allows to authenticate the client using the auth token; the auth token is used as a temporary password in the basic authentication scheme. This means that the Authorization request header can either be calculated from the the Auth-Token itself:
Authorization: Basic base64(<userid> + ':' + <password>) or Authorization: Basic base64(<userid> + ':' + <auth-token>)
Auth token information are passed in the following response headers:
Auth-Token: 6a81d622-5e24-4d9e-adc0-e3f7f2d93ac7
Auth-Token-Location: /tokens/user@si.com
Auth-Token-Valid-Until: 2015-04-16T13:28:10.749Z
|
Note
|
the URI in the Auth-Token-Location header: the client can issue a GET request to obtain information about token or a DELETE request to invalidate it. Of course clients can only request their own tokens (otherwise response code will be 403 Forbidden). |
Token Management Examples
To get information about your auth token:
cURL
curl -i --user [BASIC-AUTH] -X GET [RESTHEART-URL]/tokens/userid
HTTPie
http GET [RESTHEART-URL]/tokens/userid Authorization:"Basic [BASIC-AUTH]"
JavaScript
const username = 'your-username';
const password = 'your-password';
const credentials = btoa(`${username}:${password}`);
fetch('[RESTHEART-URL]/tokens/userid', {
method: 'GET',
headers: {
'Authorization': `Basic ${credentials}`
}
})
.then(response => response.json())
.then(data => {
console.log('Token information:', data);
})
.catch(error => console.error('Error:', error));
To invalidate your auth token:
cURL
curl -i --user [BASIC-AUTH] -X DELETE [RESTHEART-URL]/tokens/userid
HTTPie
http DELETE [RESTHEART-URL]/tokens/userid Authorization:"Basic [BASIC-AUTH]"
JavaScript
const username = 'your-username';
const password = 'your-password';
const credentials = btoa(`${username}:${password}`);
fetch('[RESTHEART-URL]/tokens/userid', {
method: 'DELETE',
headers: {
'Authorization': `Basic ${credentials}`
}
})
.then(response => {
if (response.ok) {
console.log('Token invalidated successfully');
} else {
console.error('Failed to invalidate token:', response.status);
}
})
.catch(error => console.error('Error:', error));
|
Tip
|
The Authentication Token is a very important feature when you are developing a web application. Since every request needs to include the credentials, you need to store them either in a cookie or (better) in the session storage. The sign-in form can check the credentials using the actual password; if it succeeds, the auth token can be stored and used. |
|
Warning
|
Pay attention to the authentication token in case of multi-node deployments (horizontal scalability). In this case, you need to either disable it or use a load balancer with the sticky session option or a different Token Manager implementation. |
The rndTokenManager can be configured as follows (note option TTL the auth token Time To Live in minutes):
rndTokenManager:
ttl: 15
srv-uri: /tokens
Suggested way to check credentials
The default restheart configuration file sets up the useful service roles, bound to /roles/<userid>
Here’s how to check credentials using the roles endpoint:
cURL
curl -i --user [BASIC-AUTH] -X GET [RESTHEART-URL]/roles/userid
HTTPie
http GET [RESTHEART-URL]/roles/userid Authorization:"Basic [BASIC-AUTH]"
JavaScript
const username = 'your-username';
const password = 'your-password';
const credentials = btoa(`${username}:${password}`);
fetch('[RESTHEART-URL]/roles/userid', {
method: 'GET',
headers: {
'Authorization': `Basic ${credentials}`
}
})
.then(response => response.json())
.then(data => {
console.log('User roles:', data);
})
.catch(error => console.error('Error:', error));
The possible response codes of the request GET /roles/<userid>
are:
-
401 Unauthorized missing or wrong credentials
-
403 Forbidden the userid in the URL does not match the one in the Authorization header
-
200 OK credentials match; the following response document is sent back:
{
"authenticated": true,
"roles": [
"USER"
]
}
Of course, if the request succeeds, the client gets back the auth token as well.
|
Note
|
It is easy to check the user credentials from a login form with this handler: in case the client gets back 200, they match and the auth token can be stored for further request; otherwise passed credentials are wrong. |
How to avoid the basic authentication popup in browsers
With basic authentication, browsers can show a awful login popup window and this is not what you usually want.
What happens behind the scene, is that the server sends
the WWW-Authenticate response header that actually leads to it.
You can avoid RESTHeart to actually send this header avoiding the popup
login window altogether, either specifying
the No-Auth-Challenge request header or using
the noauthchallenge query parameter. In this case, RESTHeart will just
respond with 401 Unauthorized in case of missing or wrong
credentials.
|
Tip
|
This feature together with the authentication token, allows you to implement a form based authentication experience on top of the simple and effective basic authentication mechanism. |
|
Tip
|
Watch An application example (blog) |