A token you can take back.

Most JWT plugins can issue a token. Ask one to stop a token and the only answer is “change the site’s signing key” — which signs out every app, every build script and every integration at once. This one keeps a record of each token it hands out, so taking one back is a button.

Withdraw one token15-minute access tokensRotating refresh tokensScoped to routesEvery refusal explainedNo external calls

Free forever. No account, no card, no quota. Makes no external requests of any kind.

15

minutes, not seven days — how long the credential sent on every request stays useful.

πŸ›‘
Withdrawal that worksOne token, or every token for an account, stopped on the very next request.
πŸ”Ž
Refusals in plain words“The signing key changed after this token was issued” — not “invalid token”.
πŸ”—
Limited to what it is forA token can be tied to particular routes, so a stock feed cannot delete a page.

Why Lynbro API Auth

A stolen token has a short life

The credential that goes out on every single request is the one that ends up in proxy logs, browser storage and crash reports. Ours expires in minutes; the long-lived half is shown once and is replaced every time it is used.

Signing in is not a guessing game

The REST sign-in route is not covered by the plugins that protect wp-login.php, so it is rate-limited here — failures only, never a lockout, and the same answer whether the account exists or not.

You are told why, not that

Every refusal is written down with the reason, on screen and downloadable as CSV. That is the difference between an afternoon lost and a fix in two minutes.

Everything you need β€” included, free

No "Pro" tier, no nag screens. The features other plugins paywall are here from day one.

⏱️
Short-lived access tokens

Fifteen minutes by default, and you choose. The refresh token behind it does the waiting.

πŸ”„
Refresh tokens that rotate

Each use replaces the token. If a spent one turns up again, a copy exists somewhere — so the whole session ends and it is written down.

πŸ”‘
Key rotation without an outage

New tokens are signed with the new key; the old one keeps verifying for a day, so nobody is thrown out mid-request.

πŸ”
HS256 and RS256

With RS256 the public half is published at a keys endpoint, so another service can verify your tokens without holding a secret of yours.

πŸ“‹
Scoped tokens

Tie a token to routes, to capabilities, or to both. What is not listed is refused, and the refusal says which rule it hit.

πŸ”‘
Passwords that mean something

Change an account’s password and its tokens stop, the way its login cookies already do.

πŸ›‘οΈ
A rate limit on signing in

Counted per address, never per account — so nobody can lock a real user out of the API by guessing at their name.

🧭
Diagnostics that name the culprit

The commonest failure is the web server eating the Authorization header. The overview spots that setup and shows the three lines that fix it.

πŸ”—
A migration that is a switch

Answer on the old /jwt-auth/v1/ routes in the old shape, and accept the tokens the old plugin issued until they expire. Nothing needs redeploying on the day.

Free here β€” paid almost everywhere else

The plugin most WordPress sites use for this, and what WordPress already gives you for free.

FeatureLynbro API AuthJWT Authentication for WP REST APIApplication passwords
Withdraw a single tokenβœ“β€”βœ“
Tokens expire on their ownβœ“βœ“β€”
Access token measured in minutes, not daysβœ“β€”β€”
Refresh tokens, rotated on useβœ“β€”β€”
A changed password stops existing tokensβœ“β€”βœ“
Tokens limited to particular routesβœ“β€”β€”
Every refusal explained in wordsβœ“β€”β€”
The sign-in route is rate-limitedβœ“β€”β€”
Same answer for a wrong name and a wrong passwordβœ“β€”β€”
A list of what is currently issuedβœ“β€”βœ“
No upgrade notice in the adminβœ“β€”βœ“

Requirements

6.0+WordPresstested up to 7.1
7.4+PHP
GPLv2+License
35Languages

FAQ

Should I use this or application passwords?

For a script of your own on a server you control, application passwords — fewer moving parts, and they are already there. Reach for tokens when you need a credential that expires by itself, one a person obtains by signing in rather than by visiting their profile page, or one limited to part of the API. This plugin never disables application passwords and links straight to them.

I am moving from the other JWT plugin. What breaks?

Nothing, if you switch on the two compatibility settings. The old routes are answered from here in the old shape, with the same fields in the same places, and the tokens your clients already hold keep working until they expire. Switch the second one off once the last of them has run out.

My client sends an Authorization header and the site says there is none.

The web server ate it. Apache running PHP as CGI or FastCGI drops that header unless told to pass it on. The overview screen detects that setup and shows the .htaccess lines that fix it — the plugin does not write to server configuration files itself.

Does it break my public REST routes?

No, and there is a test for it. A request that carries no token is left exactly as it was found.

Where does the signing key live?

Generated the first time a token is issued and stored so that it is not loaded on ordinary page views. Define LYNBRO_API_AUTH_SECRET in wp-config.php to keep it out of database backups entirely. It is never shown back to you in the admin.

Is there a limit on how many tokens I can issue?

No. There is no quota, no plan and no threshold at which anything stops working. Everything runs on your own server, so there is nothing for us to meter.