{"record":{"id":"41f2c4bb94f8275f","repo":"MathewSachin/Captura","slug":"not-logged-in-to-imgur","errorCode":null,"errorMessage":"Not logged in to Imgur","messagePattern":"Not logged in to Imgur","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/Captura.Imgur/ImgurUploader.cs","lineNumber":73,"sourceCode":"            }\n\n            return new UploadResult\n            {\n                Url = uploadResponse.Data.Link,\n                DeleteLink = $\"https://api.imgur.com/3/image/{uploadResponse.Data.DeleteHash}\"\n            };\n        }\n\n        async Task<string> GetAuthorizationHeader()\n        {\n            if (_settings.Anonymous)\n            {\n                return $\"Client-ID {_apiKeys.ImgurClientId}\";\n            }\n\n            if (string.IsNullOrWhiteSpace(_settings.AccessToken))\n            {\n                throw new Exception(\"Not logged in to Imgur\");\n            }\n\n            if (_settings.IsExpired())\n            {\n                if (!await RefreshToken())\n                {\n                    throw new Exception(\"Failed to Refresh Imgur token\");\n                }\n            }\n\n            return $\"Bearer {_settings.AccessToken}\";\n        }\n\n        async Task<bool> RefreshToken()\n        {\n            var args = new NameValueCollection\n            {\n                { \"refresh_token\", _settings.RefreshToken },","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/MathewSachin/Captura/blob/3fdf41529bf4d50cd7a85aedd856f30e34279a47/src/Captura.Imgur/ImgurUploader.cs#L55-L91","documentation":"Thrown by ImgurUploader.GetAuthorizationHeader (src/Captura.Imgur/ImgurUploader.cs:73) when not anonymous and _settings.AccessToken is null/whitespace. The code only falls back to Client-ID when _settings.Anonymous is true; an authenticated profile without a stored access token cannot produce a Bearer header.","triggerScenarios":"Calling Upload (or DeleteUploadedFile) in non-anonymous mode when ImgurSettings.AccessToken was never set, was cleared, or was never persisted after a prior OAuth flow.","commonSituations":"User toggled Imgur to authenticated mode but never completed the OAuth login; settings were reset/migrated and AccessToken came back empty; profile JSON partially corrupted.","solutions":["Run the Imgur OAuth login flow to populate AccessToken before allowing non-anonymous uploads.","Expose a UI guard: disable authenticated upload when AccessToken is empty and prompt to sign in.","Fall back to anonymous mode (set _settings.Anonymous = true) if Client-ID keys are available.","Persist AccessToken/RefreshToken/ExpiresAt immediately after login."],"exampleFix":"// before\nif (string.IsNullOrWhiteSpace(_settings.AccessToken))\n    throw new Exception(\"Not logged in to Imgur\");\n// after\nif (string.IsNullOrWhiteSpace(_settings.AccessToken))\n    throw new ImgurAuthRequiredException(); // caller starts OAuth flow","handlingStrategy":"validation","validationCode":"if (!_settings.Anonymous && string.IsNullOrWhiteSpace(_settings.AccessToken))\n    throw new ImgurAuthRequiredException(); // caller runs OAuth","typeGuard":"static bool CanUploadAuthenticated(ImgurSettings s)\n    => s.Anonymous || !string.IsNullOrWhiteSpace(s.AccessToken);","tryCatchPattern":"try { await uploader.Upload(img, fmt, progress); }\ncatch (Exception e) when (e.Message.Contains(\"Not logged in\")) { await StartOAuthFlow(); }","preventionTips":["Disable authenticated upload when AccessToken is empty; prompt sign-in.","Persist AccessToken/RefreshToken/ExpiresAt immediately after OAuth.","Offer anonymous mode as a fallback when Client-ID keys are configured."],"tags":["imgur","oauth","authentication","configuration","csharp"],"backgroundTag":null,"analyzedSha":"3fdf41529bf4d50cd7a85aedd856f30e34279a47","analyzedAt":"2026-08-13T19:35:27.486Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}