Backend Authorization
In our guide on Protecting Backend APIs, we saw how to set up a /api/whoami
route only accessible from logged-in users.
Now, we’re going to create a route that is scoped to an organization and can only be called by users with an Admin role in the specified organization.
Passing in an orgId in the URL
The API route we’re going to create is:
GET /org/:orgId/is-admin
This means that when the frontend makes a request, we expect it to tell us which organization is currently active.
You can also configure PropelAuth such that each user can only be in one organization at a time, in which case you don’t
need to pass in the orgId
, however, we consider it good practice to be explicit here.
Choose your framework
Express
Node
Flask
FastAPI
Django
Python
Go
In the Protecting Backend APIs guide, we created this route, protected by requireUser
:
const auth = require("./propelauth");
// requireUser is a middleware which validates the access token
app.get("/whoami", auth.requireUser, (req, res) => {
res.text("Hello user with ID " + req.user.userId);
});
To create our new API, we can use the requireOrgMemberWithExactRole function:
// The extractor tells the library how to find the orgId
const orgIdInPathExtractor = (req) => req.params.orgId;
const requireAdminInOrg = auth.requireOrgMemberWithExactRole({
role: "Admin",
orgIdExtractor: orgIdInQueryExtractor,
})
app.get("/org/:orgId/is-admin", requireAdminInOrg, (req, res) => {
console.log("req.user AND req.org are set", req.user, req.org)
res.text("Yes, you are an admin");
});
This middleware does a few things:
- Makes sure the user is valid, and sets
req.user
if so. If not, it returns a 401. - Makes sure the user is in the specified organization, and sets
req.org
if so. If not, it returns a 403. - Makes sure the user is an
Admin
within that organization. If not, it returns a 403.
Other authorization functions
You can also call:
requireOrgMember
- to just check that the user is in the extracted organizationrequireOrgMemberWithMinimumRole
- checksrequireOrgMember
AND that the users role is at least the providedminimumRequiredRole
requireOrgMemberWithPermission
- checksrequireOrgMember
AND that the user has the providedpermission
requireOrgMemberWithAllPermissions
- checksrequireOrgMember
AND that the user has all the providedpermissions
A Note on Latency
Checking authorization information can be done with no external requests, as the tokens themselves contain authorization information. This means that checking the organization, role, and/or permissions adds virtually no latency to your requests.