{"record":{"id":"917d8d44e6e65016","repo":"phacility/phabricator","slug":"no-asana-provider-configured","errorCode":null,"errorMessage":"No Asana provider configured.","messagePattern":"No Asana provider configured\\.","errorType":"exception","errorClass":"PhabricatorWorkerPermanentFailureException","httpStatus":null,"severity":"error","filePath":"src/applications/doorkeeper/worker/DoorkeeperAsanaFeedWorker.php","lineNumber":460,"sourceCode":"        'POST',\n        array(\n          'text' => $text,\n        ));\n    }\n  }\n\n\n/* -(  Internals  )---------------------------------------------------------- */\n\n  private function getWorkspaceID() {\n    return PhabricatorEnv::getEnvConfig('asana.workspace-id');\n  }\n\n  private function getProvider() {\n    if (!$this->provider) {\n      $provider = PhabricatorAsanaAuthProvider::getAsanaProvider();\n      if (!$provider) {\n        throw new PhabricatorWorkerPermanentFailureException(\n          pht('No Asana provider configured.'));\n      }\n      $this->provider = $provider;\n    }\n    return $this->provider;\n  }\n\n  private function getAsanaTaskData($object) {\n    $publisher = $this->getPublisher();\n\n    $title = $publisher->getObjectTitle($object);\n    $uri = $publisher->getObjectURI($object);\n    $description = $publisher->getObjectDescription($object);\n    $is_completed = $publisher->isObjectClosed($object);\n\n    $notes = array(\n      $description,\n      $uri,","sourceCodeStart":442,"sourceCodeEnd":478,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/doorkeeper/worker/DoorkeeperAsanaFeedWorker.php#L442-L478","documentation":"DoorkeeperAsanaFeedWorker::getProvider() lazily resolves the configured Asana auth provider via PhabricatorAsanaAuthProvider::getAsanaProvider(). If no enabled Asana provider exists (typically because asana.application-id / application-private-key are unset or the provider is not configured in the Auth application), it throws PhabricatorWorkerPermanentFailureException and the story task is dropped without retry.","triggerScenarios":"The Asana feed worker is active (subscribed/enabled) while the Phabricator instance has no Asana auth provider configured — `PhabricatorAsanaAuthProvider::getAsanaProvider()` returns null. Also fires if the provider was disabled after Asana edges/workers already exist.","commonSituations":"Enabling or leaving on the Asana integration in one config layer while the auth provider was never set up in the Auth application; disabling the provider during migration; fresh installs that import a config with asana.workspace-id set but no provider.","solutions":["Configure the Asana auth provider: Auth application -> Add Provider -> Asana, with application ID and secret from Asana","Ensure asana.application-id and application-private-key config are set to match the Asana developer app","If Asana integration is not wanted, disable the Doorkeeper Asana feed worker / unsubscribe so stories stop failing"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (!PhabricatorAsanaAuthProvider::getAsanaProvider()) {\n  // Do not enqueue Asana feed work until a provider is configured.\n  return;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Configure the Asana auth provider in the Auth application before enabling the bridge","Set asana.workspace-id only after the provider works, to avoid half-configured states","Disable the Asana feed worker when the integration is decommissioned"],"tags":["phabricator","asana","oauth","provider","configuration","worker"],"backgroundTag":"oauth-provider-not-configured","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}