Loading...
Loading...
Audit and harden a Convex app's authorization: identity-from-arg impersonation, missing per-document ownership checks, public queries leaking data by a client-supplied id, and writes into a parent/container the caller doesn't own. Scans for the 4 shapes, applies requireIdentity/requireOwner, verifies with tsc. TRIGGER on 'secure my app', 'audit auth/authz', 'who can access this data'. SKIP when there is no convex/ directory.
npx skill4agent add convex/agent-skills convex-authz/add authquery(mutation(argsuserIdactorIdownerIdauthorIdaccountIdv.id(...)ctx.auth/\b(userId|actorId|ownerId|authorId|accountId)\s*:\s*v\.id\(/args: { ... }/\bctx\.auth\b/(query|mutation)\(\s*\{ ... }query(mutation(ctx.db.get(args.<xId>)_idctx.db.patchctx.db.deletectx.db.replace<doc>.<ownerField>===!==identity.subjectctx.authquery(returnsemailrevenuessnpasswordtokenauditLogdashboardctx.authmutation(v.id(...)projectIdboardIdteamIdorgIdlistIdfolderIdconversationIdaccountIdctx.db.insertctx.db.patchv.id(...)convex/model/auth.tsrequireIdentity(ctx)ctx.auth.getUserIdentity()requireOwner(ctx, doc)doc.ownerId !== identity.subjectrequireIdentity(ctx)_idrequireOwner(ctx, await ctx.db.get(args.xId))requireIdentityrequireOwnerrequireOwner(ctx, parent)participantIds.includes(user._id)usersusersuser._idId<"users">identity.subjectinternalQueryinternalMutationnpx tsc --noEmitctx.auth