← All posts

Comparison

API keys, application passwords and OAuth: how each CMS lets something else in

Bands of orange, teal and cream running side by side, each a different colour and each going the same way.

There are three ways a content system lets outside software in, and they are not equally good. An API key or token is a secret that stands for an account. An application password is a secret made for one application, listed separately and revocable on its own. OAuth sends you to your own site to approve the thing, and binds what it may do to what you may do. The third is clearly the best and almost nobody offers it: of 11 platforms we have built for, one does.

·

This matters more than it sounds, because whatever you paste into a product is the whole of your protection. A credential you cannot see, cannot scope and cannot revoke on its own is a credential you have to trust somebody about.

The three mechanisms, and what each one proves

The useful question about any credential is not how long it is. It is: what does holding it prove, and what happens when you want it back?

What each platform asks you for

This table is read from each adapter's own connection form, so it is what you will actually be asked to paste. The second column is the one that tells you something: a platform that needs to know *who you are* as well as what the secret is usually has the better arrangement behind it.

Platform What it asks you to paste And who you are
WordPress Application password Your WordPress username
Joomla Joomla API token No
Drupal That account's password The Drupal username
Craft CMS Craft GraphQL token No
Concrete CMS Client Secret Client ID
Ghost Admin API key No
Webflow Webflow API token No
Wix Wix API key Your Wix site ID
Contentful Content management token No
Strapi Strapi API token No
Sanity Sanity API token No

Read from each adapter's own connection form, so this table and the form you actually fill in cannot disagree.

The best of them, and why

Concrete CMS, and it is not close — which is a surprising sentence to write about the platform that allows the fewest jobs on our whole list. Concrete connects by sending you to your own site to approve an integration, and the resulting access is bound to your account. No password leaves your hands, and you revoke it from your own dashboard rather than asking us to.

There is a lesson in how we found that out. Concrete also offers the credential-style connection that every other platform here uses, and it works — the token is issued, signed and reads the site perfectly. Every write then fails, because Concrete attaches permissions to a person and that kind of token has no person on it. The arrangement we would have chosen for convenience was the one that could not work, and the arrangement that works is the one we would have chosen on principle. WordPress is second with its application passwords, and after that it is a field of keys that differ mainly in whether they can be scoped.

Three arrangements to be careful with

Not criticism of the platforms — each of these is a reasonable decision by somebody with different constraints. But each one asks something of you that the others do not.

What happens to it after you paste it

Worth saying plainly, since the whole post is about not having to trust anybody. Every credential is encrypted, and each one is tied to the website it belongs to — so a stored secret copied from one website's record to another's fails to decrypt rather than quietly authorising the wrong site. The key that does the encrypting lives outside the web root and is never in the code. Nothing is ever written to a log: not a credential, not an authorisation header, not the body of a token request. And when you disconnect a site, the stored secret goes with it, which is the easy half — the important half is that you can also revoke it at the other end, in your own platform, without asking us anything.

Honest limit: a credential we hold is still a credential somebody else holds, however it is encrypted, and the only arrangement that avoids that entirely is the Concrete-style one where you approve access on your own site. Of 11 platforms, one offers it. We would rather name that as the gap it is than describe encryption as though it were the same thing.

Questions we get asked about this

Which is safer, an API key or OAuth?
OAuth, clearly: no password leaves your hands, the access is bound to your own permissions, and you withdraw it from your own dashboard. A scoped API key is a reasonable second. An unscoped administrator key is the one to avoid.
Is an application password the same as my WordPress password?
No, and that is the point of it. It is a separate credential, made for one application, that works only for the REST API. Deleting it changes nothing about how you log in, and it never reveals your actual password.
What if I want to take access away right now?
Do it at your end, in your own platform: delete the application password, revoke the token, or remove the integration. That works whatever we do, which is exactly why it is the better answer than asking us.

Where to go next