Integrate CARTO in your existing application
Learn how to securely embed CARTO into your existing architecture providing fine-grained data access
Last updated
Learn how to securely embed CARTO into your existing architecture providing fine-grained data access
Last updated
When you build a solution from scratch using CARTO you can choose between the three different authentication strategies to secure your application. However, in many other cases the starting point is an existing application with its own login system where you want to add a geospatial component, such as a map visualization.
In this guide you will learn how to integrate CARTO with an existing application that has its own login system, implementing the machine-to-machine authentication in order to provide fine-grained data access to the end users.
In this guide, the ACME company has decided to add maps to their existing application and CARTO will be the platform used for it. They have two important requirements:
ACME wants to keep its own login system.
The maps will show different data based on the user, in this case, based on the user's group.
With this in mind, we are going to develop a backend endpoint in order to generate a CARTO API Access Token with only access to the data the user has permission for in our application, the frontend application will use that token to interact with the rest of the CARTO APIs.
The backend is responsible for generating an API Access Token without exceding the actual permissions of the users.
The data used for this guide will be the table retail_stores contains all the retails in the US, It's available at carto-demo-data.demo_tables.retail_stores
.
In our demo application we will have two users:
The user in the group of BOSTON
will only see the stores in the city of Boston, the user in group NEW YORK
will be limited to New York.
Since this guide needs a backend and a frontend application, the first thing we have to do is create the structure to store the code for these components. Let's start with the backend side and install the needed dependencies to work with Express:
We are going to use Typescript on both the backend and frontend sides, so we need to install the required dependencies:
Now, the next step is to uncomment the following line in the file (it specifies an output folder for all emitted files):
As an optional step, you would like to add to have extra help to develop by restarting your application automatically when there are changes in your code. To do that, install the following dependencies:
And add the following content to the file package.json:
Now, just typing npm run dev
the server will run up and you can see the changes in the code immediately.
In order to use the CARTO APIs you need to authenticate your requests. For a backend-side application, the recommended approach is to do so by creating a Machine to Machine OAuth Client (M2M OAuth Client). To create this OAuth Client, you need to go to CARTO Workspace -> Developers -> Credentials -> Create New -> M2M OAuth Client
For development purposes, you can set the URL for localhost in the App URL and Application Login URI. Just set the URL https://127.0.0.1:8000
in both fields.
Once the application is created, you will have to get the Client ID and the Client Secret
Now, we have to create a couple of endpoints: a basic login endpoint to authenticate the user and an endpoint to generate the CARTO token.
For the login endpoint, the responsibilities will be:
Check the login and password.
Get the group of the user and create a JWT token.
In a real production environment, you should already have a login endpoint.
While the endpoint to get the CARTO token will do:
Validate the JWT in the Authentication header.
Extract the group and create the token via CARTO API.
Replace the file index.ts with the following content:
Create a .env file located in the root of the backend with the following content:
The most important function involved in the endpoint is the one called getAPIAccessTokenForGroup
that owns the logic to interact with CARTO in order to get a valid token for the frontend side. Let's see what its implementation looks like:
Tokens are limited based on the quota of your plan. In a production environment, you should implement a mechanism to create only the tokens that you need:
API Access Tokens: avoid creating two tokens with the same grants for the same user.
OAuth Access Tokens: OAuth Access Tokens are valid for 24 hours, so you should avoid creating more than one token per day per application/API instance.
The function will take one parameter indicating the group in order to create the right token. The first thing to do is to get the environment variables to interact with the CARTO API. The next step is to obtain an OAuth Access Token to deal with the rest of the APIs. To get this first token you can see in the line 7 to 13 how to use the Client ID
and the Client Secret
to make the request and get this token. Once, you have a valid OAuth Access Token, the last step is to create an API Access Token for the specific grants. In this case, the grants include the permission to execute a specific SQL query to get all the retail for a specific city.
That means, that once the token is created, the client using this token only will have permission to execute the defined query and get only the data declared in the grants.
Finally, once the code for the backend is ready you can run the server just by typing in your terminal:
If your application requires dynamic queries, you can use query parameters in SQL and Maps API.
SELECT * FROM carto-demo-data.demo_tables.retail_stores
WHERE city = 'BOSTON' AND storetype = @storetype
At this point, our backend is ready to generate tokens for our users. In the following code you can see an example of a frontend application that does:
Login.
Call the previous endpoint to get an API Access Token with the permissions limited to the user.
Use the token to call CARTO APIs.
To run this, first, you need to clone the project:
Edit the .env file at set the VITE_API_BASE_URL:
If you have a different region, you need to modify VITE_CARTO_API_BASE_URL.
Run:
All the code for this guide is available on GitHub.
We recommend you to visit Visualization with deck.gl to learn more about the different visualizations you can create using deck.gl. There are many examples in our gallery that might be useful to improve your application!