Protect Endpoints with jwt_required
Verify the token on each API call.
Protect Endpoints with jwt_required is a free Flask Academy lesson on CoddyKit — lesson 3 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the Flask Academy learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Guarding a Route
A token is only useful if some routes demand it. The jwt_required decorator turns any view into a members-only endpoint. 🔒
Apply the Decorator
Stack @jwt_required() under your route. Now the view only runs when a valid, unexpired token arrives.
@app.get("/profile")
@jwt_required()
def profile():
...Where the Token Goes
Clients send the token in the Authorization header using the Bearer scheme. Flask-JWT-Extended reads it from there automatically.
Authorization: Bearer <your-token>Automatic Rejection
No token, or a bad one? The decorator stops the request before your code runs and returns a 401. You write zero checking logic.
Who Is Calling
Inside a guarded view, call get_jwt_identity to read the identity you signed at login, usually the user id.
from flask_jwt_extended import get_jwt_identity
uid = get_jwt_identity()Read the Full Claims
Need extra claims like a role? get_jwt returns the whole payload as a dict so you can branch on what is inside.
from flask_jwt_extended import get_jwt
role = get_jwt().get("role")Use the Identity
With the user id in hand, load that user and serve their data. The token told you who, so the rest is normal Flask. 🙂
user = User.query.get(get_jwt_identity())Optional Protection
Want a page that adapts whether or not someone is logged in? Use optional=True so the view runs either way.
@jwt_required(optional=True)Customize the Error
Register an unauthorized_loader to return a friendly JSON message instead of the default when a token is missing.
@jwt.unauthorized_loader
def missing(reason):
return {"msg": reason}, 401Expired Tokens
An expired token is also rejected by the decorator. The client must log in again or refresh to keep going, which keeps stolen tokens short-lived.
Never Trust the Body
Read the caller from the token, never from a user id in the request body. The signature is what makes the identity trustworthy.
Quick Check
Recall how a guarded view learns who is calling.
Recap
Add @jwt_required() to guard a route, send the token as a Bearer header, and read the caller with get_jwt_identity. 🔐
Frequently asked questions
Is the “Protect Endpoints with jwt_required” lesson free?
Yes — the full text of “Protect Endpoints with jwt_required” is free to read here on the web, and the Flask Academy course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the Flask Academy course, upgrade to CoddyKit PRO.
What will I learn in “Protect Endpoints with jwt_required”?
Verify the token on each API call. You practise Flask Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start Flask Academy?
No prior experience is required. Flask Academy on CoddyKit is structured for beginners through advanced learners; this is — lesson 3 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Protect Endpoints with jwt_required” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this Flask Academy lesson?
Yes. Every Flask Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Sessions vs Stateless Tokens
- Issue Access Tokens on Login
- Protect Endpoints with jwt_required
- Refresh Tokens and Expiry