Hi all,
I’m preparing a Forge app for the Marketplace and would like to check one design decision against the 2026 “Security requirements for cloud apps” before I submit.
The app. A Jira project page (plus a project settings page and an issue panel) showing revert-based Change Failure Rate / MTTR. It reads commit metadata (message, date, SHA — no source code) from the customer’s Git provider (GitHub, GitLab, Bitbucket Cloud, Azure Repos) through permissions.external.fetch.backend, and can optionally export events to the customer’s own BigQuery table or S3 bucket. Scopes: storage:app, read:jira-work. No web triggers, no remotes. Each resolver checks the calling user’s Jira permission via /rest/api/3/mypermissions (called asUser()): Browse for viewing, project-admin for settings and sync.
How authentication works today. A project admin pastes a read-only, fine-grained token of their own Git provider account (for example a GitHub PAT with Contents: read-only). It is stored per project with kvs.setSecret, is never shown in the UI again, is never logged, is never returned to the frontend, and is only sent in the Authorization header to the provider’s API host declared in the manifest.
Why not Forge’s external authentication (asUser().withProvider). Credentials there are per Jira user, and the raw token can’t be reused at project level. The whole point of the dashboard is that PMs and executives who have no repository access can still see it, so a shared project-level credential is required.
My questions
- The requirement says external OAuth2 clients “must use Forge’s OAuth2 Providers unless a required capability is not supported”. Is a customer-supplied, read-only, third-party PAT stored via
kvs.setSecretin scope of that requirement at all, or does it fall under “must securely store and manage secrets” (which listssetSecretas the Forge approach)? I read the PAT prohibition as covering credentials of Atlassian user accounts only — is that correct? - Would a reviewer accept this design in the security questionnaire, given that the provider-managed flow can’t provide a shared project-level credential? Has anyone gone through review with a comparable pattern?
- If not, what is the recommended pattern for a shared, project-level credential to a third-party API (e.g. a webtrigger-based OAuth flow with app-level token storage)?
Docs I’m relying on: Security requirements for cloud apps (last updated Feb 19, 2026), the secret store (kvs.setSecret) reference, and the External authentication reference.
Thanks in advance!