You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug]: Private Azure blob URLs break browser images, downloads and conversation history #16628
With fileStrategy: azure_blob and anonymous blob access disabled, browser-facing file metadata still contains raw Azure blob URLs. Images and file downloads fail with 409 Public access is not permitted, even when server-side reads work through the authenticated Azure client.
Reopening a conversation can expose the same inaccessible URLs from stored message attachments.
Expected: logged-in users can view and download private Azure files without enabling anonymous storage access, while preserving file ACLs and tenant checks.
Version Information
LibreChat version: v0.8.8
Commit: e8f3be08623663d4ad7f7241e693c94469b63bb0
Branch: v0.8.8
Build date: 2026-10-01 03:28:25 UTC
User agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/154.0.0.0 Safari/537.36 Edg/154.0.0.0
Steps to Reproduce
Configure fileStrategy: azure_blob, valid Azure credentials and AZURE_STORAGE_PUBLIC_ACCESS=false. Disable anonymous blob access on the storage account.
Upload an image and inspect its browser request URL.
Reopen the conversation and try viewing/downloading its attachments.
The browser receives a private https://<account>.blob.core.windows.net/... URL and cannot authenticate to Azure.
Possible fix
Return an authorized browser URL instead of the raw storage URL, including in upload responses, generated artifacts and conversation history. A same-origin download route needs authentication suitable for image/link requests, which cannot attach a bearer header.
Related: #13340, #14955, #13411 and #13245. This report concerns the remaining browser-facing paths in v0.8.8 after authenticated server-side reads.
This is the browser half of #14955. #14956 is an open PR for the download part of it: getAzureDownloadURL returns a short-lived, read-only SAS URL for a private container, so /api/files/download-url/... stops answering 501 for azure_blob. The server-side read half is already in through #15763.
The PR does not rewrite the stored image URLs in message history; that part of this report is covered by #13245. It is small and separate from #13245, and it has had no CI run yet. A maintainer approval for the workflow would show whether it still passes on dev.
This is also addressed by the STORAGE_PROXY_FILES feature proposed in #16912.
☁️ feat: Serve Azure Blob Files Through LibreChat With Stable Links #16915: the Azure strategy stores links to LibreChat (/api/stored-files/azure_blob/<blob path>) for uploads, generated images and outputs, and avatars. LibreChat streams each blob through the authenticated container client, so the container stays private.
Activity
mihidumh commentedon Oct 2, 2026
This is the browser half of #14955. #14956 is an open PR for the download part of it:
getAzureDownloadURLreturns a short-lived, read-only SAS URL for a private container, so/api/files/download-url/...stops answering 501 forazure_blob. The server-side read half is already in through #15763.The PR does not rewrite the stored image URLs in message history; that part of this report is covered by #13245. It is small and separate from #13245, and it has had no CI run yet. A maintainer approval for the workflow would show whether it still passes on
dev.Vidminas commentedon Oct 9, 2026
This is also addressed by the
STORAGE_PROXY_FILESfeature proposed in #16912./api/stored-files/azure_blob/<blob path>) for uploads, generated images and outputs, and avatars. LibreChat streams each blob through the authenticated container client, so the container stays private./imagesdoes, so<img>tags and links work, and it applies the existing file ACLs and tenant checks.npm run migrate:stored-file-linksrewrites blob URLs already stored in conversation history.