claude-apps-gateway-deploy.md +108 −37
126 126
127請參閱 [每個機制儲存原則的位置](/docs/zh-TW/managed-settings#where-each-mechanism-stores-the-policy) 以取得檔案路徑,以及 [用戶端受管設定](/docs/zh-TW/claude-apps-gateway-config#client-side-managed-settings) 以取得 Claude Desktop `bootstrapUrl` 等效項。127請參閱 [每個機制儲存原則的位置](/docs/zh-TW/managed-settings#where-each-mechanism-stores-the-policy) 以取得檔案路徑,以及 [用戶端受管設定](/docs/zh-TW/claude-apps-gateway-config#client-side-managed-settings) 以取得 Claude Desktop `bootstrapUrl` 等效項。
128 128
129<h3 id="large-rollouts">
130 大規模推出
131</h3>
132
133登入按用戶端 IP 地址進行速率限制,預設值適合小型團隊。每個地址在每 10 分鐘內獲得 30 次登入開始和 10 次代碼提交。向數千名開發人員的推出可能在第一個早上達到這些限制,原因有兩個:
134
135* **閘道無法看到您的負載平衡器之外。** 沒有 [`listen.trusted_proxies`](/docs/zh-TW/claude-apps-gateway-config#listen),每個開發人員似乎都來自負載平衡器的地址並共享一個限制。首先設定它。閘道在第一次忽略 `X-Forwarded-For` 標頭時記錄警告。
136* **許多開發人員共享幾個 NAT 或 VPN 出口地址。** 即使 `trusted_proxies` 正確,他們也共享這些地址的限制。提高 [`rate_limits`](/docs/zh-TW/claude-apps-gateway-config#http-tuning) 以適應。
137
138要調整 `max`,將開發人員數除以他們共享的出口地址。估計在一個 `window_seconds` 期間內有多少人登入,預設為 10 分鐘。然後將其加倍以涵蓋重試和登入到 Claude Code 和 Claude Desktop 的開發人員。
139
140例如,10,000 名開發人員在 4 個出口地址後面在一小時內均勻登入。這是每個地址 2,500 名開發人員,每 10 分鐘約 420 名,您將其加倍並四捨五入到 1,000。下面的範例將兩個限制都設定為 1,000:
141
142```yaml theme={null}
143rate_limits:
144 device_authorization: { max: 1000, window_seconds: 600 }
145 device_verify: { max: 1000, window_seconds: 600 }
146```
147
148`device_verify` 是阻止某人猜測另一個開發人員登入代碼的原因,因此只在您的估計需要的範圍內提高它。即使在這些限制下,代碼也是來自 20 字元字母表的 8 個字元,並在 10 分鐘後過期,因此猜測仍然不切實際;請參閱 [使用者代碼暴力破解抵抗](#user-code-brute-force-resistance)。
149
150當您的 IdP 發行重新整理權杖時,Claude Code 會無聲地更新會話,因此您可以在推出後將限制放回。沒有重新整理權杖,開發人員每 [`session.ttl_hours`](/docs/zh-TW/claude-apps-gateway-config#session) 再次登入。同時調整兩個限制的大小以適應該穩定速率,並保持提高。
151
152當達到限制時,Claude Code v2.1.274 或更新版本顯示 `The gateway is limiting sign-in attempts right now`。v2.1.274 或更新版本的閘道在驗證頁面上顯示 `Too many attempts came from your network address`,並提供要檢查的設定。它還寫入 `sign-in refused` 日誌行,命名要變更的設定。
153
129<h2 id="operations">154<h2 id="operations">
130155 運營 操作
131</h2>156</h2>
132 157
133158一旦閘道開始提供流量,日常運營就是讀取其日誌、探測其健康狀況,以及按您的時間表輪換其祕密。下面的小節涵蓋每一個,加上 Postgres 持有的內容以及升級和回滾的行為方式。一旦閘道開始提供流量,日常操作包括讀取其日誌、探測其健康狀態,以及按照您的排程輪換其密鑰。以下小節涵蓋每一項,以及 Postgres 保存的內容,以及升級和回滾的行為方式。
134 159
135<h3 id="logs">160<h3 id="logs">
136 日誌161 日誌
137</h3>162</h3>
138 163
139164閘道向 stderr 寫入兩個流,都是 JSON 友好的:閘道向 stderr 寫入兩個串流,兩者都是 JSON 友善的:
140 165
141166* **審計事件**:每個安全相關事件的單行 JSON。將 stderr 管道傳輸到您的日誌聚合器。* **稽核事件**:每個安全相關事件一行 JSON。將 stderr 導管到您的日誌聚合器。
142 167
143 發出的事件包括 `config.load`、`session.mint`、`session.refresh`、`device.authorize`、`device.verify`、`device.callback`、`auth.denied`、`access.denied`、`access.public_client`、`inference`、`managed.serve`、`desktop_bootstrap.serve`、`desktop_bootstrap.denied`、`spend.blocked`、`admin.denied`、`admin.limit.upsert` 和 `admin.limit.delete`。欄位因事件而異:168 發出的事件包括 `config.load`、`session.mint`、`session.refresh`、`device.authorize`、`device.verify`、`device.callback`、`auth.denied`、`access.denied`、`access.public_client`、`inference`、`managed.serve`、`desktop_bootstrap.serve`、`desktop_bootstrap.denied`、`spend.blocked`、`admin.denied`、`admin.limit.upsert` 和 `admin.limit.delete`。欄位因事件而異:
144 169
145 * 成功的 mint 和 refresh 事件攜帶 `sub`、`email`、`client_ip` 和結果170 * 成功的 mint 和 refresh 事件攜帶 `sub`、`email`、`client_ip` 和結果
146 * `auth.denied` 和 `access.denied` 攜帶原因和用戶端 IP,加上 `auth.denied` 的請求路徑,因為在這些拒絕時不存在使用者身份。兩個 `access.denied` 原因改變事件攜帶的內容:171 * `auth.denied` 和 `access.denied` 攜帶原因和用戶端 IP,加上 `auth.denied` 的請求路徑,因為在這些拒絕時不存在使用者身份。兩個 `access.denied` 原因改變事件攜帶的內容:
147 * `xff_unparseable`:事件也攜帶無法讀取的 `X-Forwarded-For` 項目172 * `xff_unparseable`:事件也攜帶無法讀取的 `X-Forwarded-For` 項目
148173 * `client_ip_unknown`:事件不攜帶用戶端 IP,因為連線沒有對等位址,而設定了 `access_control` 清單 * `client_ip_unknown`:事件不攜帶用戶端 IP,因為連線沒有對等位址,而 `access_control` 清單已設定
149174 * `access.public_client` 攜帶在 `access_control.allow_cidrs` 為空時,每個程序從公開位址到達的第一個請求的用戶端 IP。閘道照常提供請求;事件表示閘道可能可從公開網際網路到達。請參閱 [`access_control` 參考](/docs/zh-TW/claude-apps-gateway-config#http-tuning),了解什麼算作公開以及建議的允許清單。 * `access.public_client` 攜帶每個程序中第一個從公開位址到達的請求的用戶端 IP,同時 `access_control.allow_cidrs` 為空。閘道照常提供請求;事件表示閘道可能可從公開網際網路到達。請參閱 [`access_control` 參考](/docs/zh-TW/claude-apps-gateway-config#http-tuning),了解什麼算作公開以及建議的允許清單。
150 * `inference` 記錄哪個上游提供了請求以及回應狀態175 * `inference` 記錄哪個上游提供了請求以及回應狀態
151 * `desktop_bootstrap.denied` 記錄被拒絕的 Claude Desktop bootstrap 擷取,包含原因(`not_configured`、`policy_not_opted_in` 或 `no_policy_matched`)和使用者的身份176 * `desktop_bootstrap.denied` 記錄被拒絕的 Claude Desktop bootstrap 擷取,包含原因(`not_configured`、`policy_not_opted_in` 或 `no_policy_matched`)和使用者的身份
152177 * `admin.denied` 記錄被拒絕的管理員 API 驗證嘗試,包括用戶端 IP、方法、路徑和原因,不包括呈現的金鑰材料:當呈現了 `x-api-key` 但與沒有配置的金鑰相符時為 `invalid_key`,當只呈現了 `Authorization` 標頭且它未驗證為 `admin.admin_groups` 中的閘道會話時為 `bearer_rejected`,或當兩個標頭都未呈現時為 `no_credentials` * `admin.denied` 記錄被拒絕的管理員 API 驗證嘗試,包含用戶端 IP、方法、路徑和原因,不包含呈現的金鑰資料:當呈現了 `x-api-key` 但未與任何已設定的金鑰相符時為 `invalid_key`,當僅呈現了 `Authorization` 標頭且其未驗證為 `admin.admin_groups` 中的閘道工作階段時為 `bearer_rejected`,或當兩個標頭都未呈現時為 `no_credentials`
153178* **運營日誌**:人類可讀的 `[gateway]` 前綴行,用於啟動、警告和上游錯誤。`CLAUDE_GATEWAY_LOG_LEVEL` 環境變數控制詳細程度,接受 `debug`、`info`、`warn` 或 `error`,預設為 `info`。在 `debug` 時,每次登入和重新整理也會記錄 id\_token 中的宣告名稱(不是值),加上當 `userinfo_fallback` 提供任何時的 userinfo 宣告名稱,因此您可以診斷 `email_claim` 和 `groups_claim` 設定,而不記錄個人識別資訊。它不影響審計事件,這些事件始終被發出。* **操作日誌**:人類可讀的 `[gateway]` 前綴行,用於啟動、警告和上游錯誤。`CLAUDE_GATEWAY_LOG_LEVEL` 環境變數控制詳細程度,接受 `debug`、`info`、`warn` 或 `error`,預設為 `info`。在 `debug` 時,每個登入和重新整理也會記錄 id\_token 中的宣告名稱(而非值),加上當 `userinfo_fallback` 提供任何時的 userinfo 宣告名稱,因此您可以診斷 `email_claim` 和 `groups_claim` 設定,而不記錄個人識別資訊。它不影響稽核事件,稽核事件始終被發出。
154 179
155<h3 id="health">180<h3 id="health">
156181 健康 健康狀態
182</h3>
183
184閘道提供 `GET /healthz` 作為活躍性探測,`GET /readyz` 作為就緒性探測;`/readyz` 驗證存放區是否可到達。兩者都豁免於 `access_control.allow_cidrs`,因此探測在鎖定的接聽程式上保持運作。
185
186`/.well-known/oauth-authorization-server` 的 OAuth 探索文件也只在設定載入、OIDC 探索、上游用戶端建構和 Postgres 遷移全部成功後才傳回 `200`,因此它也可作為端對端啟動檢查。
187
188<h3 id="concurrent-upstream-requests">
189 並行上游請求
157</h3>190</h3>
158 191
159192閘道提供 `GET /healthz` 作為活躍探針,`GET /readyz` 作為就緒探針;`/readyz` 驗證存儲是否可到達。兩者都豁免於 `access_control.allow_cidrs`,因此探針在鎖定的監聽器上保持工作。預設情況下,每個閘道複本同時最多向上游傳送 256 個請求。串流回應在串流結束前計入限制。
193
194在複本達到限制時到達的請求在閘道內等待空閒插槽。開發人員看到回應開始緩慢或似乎掛起。在 `provider: anthropic` 上游上,等待時間超過 [`timeouts.upstream_ttfb_ms`](/docs/zh-TW/claude-apps-gateway-config#http-tuning) 的請求放棄該上游,當沒有後續上游提供它時失敗並返回 502。
195
196包含 `upstream requests:` 的啟動日誌行顯示有效的限制。當複本的開啟請求數超過限制時,它也會記錄最多每分鐘一次包含 `client requests are open` 的警告。
160 197
161198OAuth 發現文件位於 `/.well-known/oauth-authorization-server` 也只在配置載入、OIDC 發現、上游用戶端構造和 Postgres 遷移全部成功後才傳回 `200`,因此它也充當端到端啟動檢查。要同時提供更多請求,您有兩個選項:
199
200* 新增複本。
201* 提高每個複本上的限制。在閘道容器上設定 `BUN_CONFIG_MAX_HTTP_REQUESTS` 環境變數為 1 到 65535 之間的整數,然後重新啟動容器。
202
203複本以約限制除以請求保持開啟的平均秒數的請求速率填滿其限制。例如,如果請求平均保持開啟 10 秒,預設限制為 256 的複本以約每秒 26 個請求的速率填滿它。
204
205如果您在 CPU 上自動擴展,達到限制的複本會佇列請求而不觸發橫向擴展,因此將目標設定在複本在記錄 `client requests are open` 警告時顯示的 CPU 級別以下。
206
207<Warning>
208 每個開啟的請求在串流時和等待插槽時在閘道程序中保持記憶體。如果您將限制保持在 256,過載複本上的記憶體仍會增長,因為等待的請求保持其請求本體。根據尖峰時開啟的請求數調整容器的記憶體大小,並在您變更限制時監視記憶體。記憶體不足的複本被殺死並丟棄它保持的每個串流。
209</Warning>
162 210
163<h3 id="outage-behavior">211<h3 id="outage-behavior">
164 中斷行為212 中斷行為
165</h3>213</h3>
166 214
167215如果 Postgres 宕機,閘道本身繼續為已簽入的開發人員提供服務,新的簽入失敗。開發人員是否實際保持工作取決於您的協調器如何處理就緒:如果 Postgres 宕機,閘道本身繼續提供已登入的開發人員,新登入失敗。開發人員是否實際繼續工作取決於您的協調器如何處理就緒性:
168 216
169217* **現有會話**:持有人令牌使用 JWT 祕密在本地驗證,會話重新整理不接觸存儲,閘道程序仍然可以提供推理* **現有工作階段**:持有人令牌使用 JWT 密鑰在本地驗證,工作階段重新整理不接觸存放區,閘道程序仍可提供推論
170218* **新簽入**:失敗直到 Postgres 恢復,因為設備流及其速率限制計數器存在於 Postgres 中* **新登入**:失敗直到 Postgres 恢復,因為裝置流及其速率限制計數器存在於 Postgres
171219* **[支出限制執行](/docs/zh-TW/claude-apps-gateway-spend-limits#postgres-availability)**:在中斷期間預設失敗開放,因此推理仍然流動;如果您寧願阻止也不願無計量執行,請將其翻轉為失敗關閉* **[支出限制強制執行](/docs/zh-TW/claude-apps-gateway-spend-limits#postgres-availability)**:在中斷期間預設失敗開啟,因此推論仍流動;如果您寧願阻止而不是無計量執行,請將其翻轉為失敗關閉
172220* **就緒**:`/readyz` 在中斷期間報告未就緒,因此在就緒上閘門流量的協調器一次從輪換中移除每個副本。在該拓撲中,所有流量,包括閘道仍然可以提供的推理,在負載平衡器處失敗,直到 Postgres 恢復。`/healthz` 上的活躍探針保持通過,因此副本不會重新啟動。如果您寧願已簽入的開發人員在存儲中斷期間保持工作,請將就緒探針指向 `/healthz`;成本是新簽入失敗對仍然報告就緒的副本。* **就緒性**:`/readyz` 在中斷期間報告未就緒,因此在就緒性上閘道流量的協調器立即從輪換中移除每個複本。在該拓撲中,所有流量(包括閘道仍可提供的推論)在負載平衡器處失敗,直到 Postgres 恢復。`/healthz` 上的活躍性探測保持通過,因此複本不被重新啟動。如果您寧願已登入的開發人員在存放區中斷期間繼續工作,請將就緒性探測指向 `/healthz`;代價是新登入對仍報告就緒的複本失敗。
173 221
174222如果您的 IdP 宕機,現有會話工作直到 `ttl_hours`,新登入和重新整理失敗。如果您的 IdP 有頻繁的維護窗口,設定更長的 `ttl_hours`。如果您的 IdP 宕機,現有工作階段工作直到 `ttl_hours`,新登入和重新整理失敗。如果您的 IdP 有頻繁的維護視窗,請設定更長的 `ttl_hours`。
175 223
176<h3 id="jwt-secret-rotation">224<h3 id="jwt-secret-rotation">
177225 JWT 祕密輪換 JWT 密鑰輪換
178</h3>226</h3>
179 227
180228分三個步驟輪換簽名祕密,以便現有會話保持有效:分階段輪換簽署密鑰,以便現有工作階段保持有效:
181 229
1822301. 生成新祕密。將其前置到 `session.jwt_secret` 陣列。1. 產生新密鑰。將其前置到 `session.jwt_secret` 陣列。
1832312. 滾動部署。新令牌使用新祕密簽名;舊令牌仍然驗證。2. 推出部署。新令牌使用新密鑰簽署;舊令牌仍驗證。
1842323. 在 `ttl_hours` 加上邊距後,移除舊祕密並再次滾動。3. 在 `ttl_hours` 加上邊際後,移除舊密鑰並再次推出。
185 233
186234輪換也是在它們過期之前強制會話退出的唯一方法:持有人令牌根據 JWT 祕密在本地驗證,因此沒有按會話撤銷。直接替換祕密,不在陣列中保留舊祕密,一次使每個未完成的會話無效。對於個別離職,在您的 IdP 中取消配置使用者;他們的會話在 `ttl_hours` 內結束。輪換也是在過期前強制工作階段退出的唯一方式:持有人令牌針對 JWT 密鑰在本地驗證,因此不存在每個工作階段的撤銷。直接替換密鑰,不在陣列中保持舊密鑰,立即使每個未完成的工作階段失效。對於個別離職,在您的 IdP 中取消配置使用者;其工作階段在 `ttl_hours` 內結束。
187 235
188<h3 id="postgres">236<h3 id="postgres">
189 Postgres237 Postgres
190</h3>238</h3>
191 239
192240閘道持有五個資料表加上一個 `_migrations` 表,全部由其啟動時遷移建立:閘道保持五個資料表加上 `_migrations` 表,全部由其啟動時遷移建立:
193 241
194| 表 | 內容 | 保留 |242| 表 | 內容 | 保留 |
195243| ------------------ | ------------------------------------- | --------------------------------------------- || ------------------ | ------------------------------------- | -------------------------------------------- |
196244| `kv` | 設備授予(10 分鐘 TTL)和速率限制計數器 | 每行 TTL || `kv` | 裝置授予(10 分鐘 TTL)和速率限制計數器 | 每行 TTL |
197245| `spend` | 按主體期間至今支出計數器,以美分計 | `admin.spend_retention_months`,預設 13 || `spend` | 每個主體期間至今支出計數器,以美分計 | `admin.spend_retention_months`,預設 13 |
198246| `spend_limits` | 配置的支出上限 | 直到透過 API 刪除 || `spend_limits` | 已設定的支出上限 | 直到透過 API 刪除 |
199| `admin_audit` | 管理員 API 變更軌跡 | `admin.audit_retention_days`,預設 365 |247| `admin_audit` | 管理員 API 變更軌跡 | `admin.audit_retention_days`,預設 365 |
200248| `principal_emails` | 每個主體的最後看到的電子郵件、顯示名稱和 IdP 群組。包含個人識別資訊。 | `admin.identity_retention_days` 自上次活動以來,預設 90 || `principal_emails` | 每個主體的最後看到的電子郵件、顯示名稱和 IdP 群組。包含個人識別資訊。 | `admin.identity_retention_days` 自上次活動起,預設 90 |
201 249
20225030 秒迴圈過期 `kv` 行超過其 TTL,每小時掃描在支出表上強制保留窗口,因此沒有任何東西無限增長。沒有 [支出限制](/docs/zh-TW/claude-apps-gateway-spend-limits) 配置,只有 `kv` 被寫入。閘道在啟動時應用其自己的架構遷移,以及在每次升級時,因此其資料庫角色需要建立和更改表的權限。將其指向專用於閘道的資料庫或架構,以保持該授予狹窄。30 秒迴圈過期 `kv` 行超過其 TTL,每小時掃描在支出表上強制保留視窗,因此沒有任何東西無限增長。沒有[支出限制](/docs/zh-TW/claude-apps-gateway-spend-limits)已設定,只有 `kv` 被寫入。閘道在啟動和每次升級時應用其自己的架構遷移,因此其資料庫角色需要建立和更改表的權限。將其指向專用於閘道的資料庫或架構,以保持該授予狹窄。
203 251
204252使用支出限制,丟失的資料庫意味著丟失支出追蹤和上限,不僅僅是開發人員重新登入,因此執行定期備份。要立即清除一個已離職的開發人員,而不是等待保留,直接執行 `DELETE FROM principal_emails WHERE principal = '<sub>'`;這移除唯一持有其電子郵件、名稱和群組的表。`spend` 和 `admin_audit` 行僅參考偽匿名 OIDC `sub`。使用支出限制,遺失的資料庫意味著遺失支出追蹤和上限,不僅是開發人員重新登入,因此執行定期備份。要立即清除一個已離職的開發人員而不是等待保留,直接執行 `DELETE FROM principal_emails WHERE principal = '<sub>'`;這移除唯一保持其電子郵件、名稱和群組的表。`spend` 和 `admin_audit` 行僅參考假名 OIDC `sub`。
205 253
206<h3 id="upgrades">254<h3 id="upgrades">
207 升級255 升級
208</h3>256</h3>
209 257
210258副本是無狀態的,因此滾動重新啟動在任何時間都是安全的。閘道在啟動時執行架構遷移,這意味著部署新二進位檔案自我遷移資料庫。並行副本在 Postgres 諮詢鎖上序列化,因此只有一個應用每個遷移。複本是無狀態的,因此滾動重新啟動不會遺失閘道狀態。閘道在啟動時執行架構遷移,這意味著部署新二進位檔案自動遷移資料庫。並行複本在 Postgres 諮詢鎖上序列化,因此只有一個應用每個遷移。
259
260當您的協調器使用 `SIGTERM` 停止複本時,如在滾動重新啟動或縮減中,閘道停止接受新連線並讓已在進行中的請求和串流在退出前完成。它等待最多 25 秒,稱為排放視窗,然後關閉仍然開啟的任何東西。`SIGINT`(例如終端中的 Ctrl+C)啟動相同的排放,排放期間的第二個信號關閉開啟的請求並立即退出。排放需要閘道 v2.1.274 或更新版本。
261
262長代代可以串流數分鐘。在 Kubernetes 和 Amazon ECS 上,將這兩者一起提高以給予這些串流更多時間:
211 263
212264遷移是僅附加的,因此回滾到知道較少遷移的先前二進位檔案是安全的;它忽略額外的行。回滾也根據較舊二進位檔案的架構重新驗證 YAML,因此採用較新版本引入的金鑰的配置在較舊版本上啟動失敗。在回滾之前移除新金鑰。* **排放視窗**:在閘道容器上設定 `CLAUDE_GATEWAY_DRAIN_TIMEOUT_MS` 環境變數為正整數毫秒數,例如 `120000`。閘道忽略任何其他形式的值,例如 `120s`,並保持 25 秒預設
265* **您的協調器的寬限期**:Kubernetes 上的 `terminationGracePeriodSeconds`,或 Amazon ECS 上的 `stopTimeout`
213 266
214267因為您在自己的映像中固定閘道的版本,新 Claude Code 版本中的修復,包括安全修復,只有在您更新固定並重新部署時才會到達您的部署。將閘道包含在您用於持有生產認證的其他服務的相同修補週期中。寬限期在兩個平台上預設為 30 秒。將其保持至少比排放視窗長 5 秒,否則協調器在排放完成前殺死閘道。在 Kubernetes 上,也新增任何 `preStop` 鉤子的持續時間,因為寬限期在鉤子執行前開始計數,而不是當閘道接收 `SIGTERM` 時。
268
269您的平台也可能限制排放可以執行多長時間:
270
271* **Amazon ECS on Fargate**:`stopTimeout` 最多允許 120 秒
272* **Cloud Run**:在 `SIGTERM` 後 10 秒停止實例,因此開啟的串流在那裡最多獲得 10 秒,無論排放視窗是什麼
273
274當排放視窗結束時仍有開啟的請求,閘道記錄包含 `drain window over after` 的警告,計數它切割的請求,並命名兩個要提高的設定。
275
276遷移是僅附加的,因此回滾到知道較少遷移的先前二進位檔案是安全的;它忽略額外的行。回滾也針對較舊二進位檔案的架構重新驗證 YAML,因此採用由較新版本引入的金鑰的設定在較舊版本上啟動失敗。在回滾前移除新金鑰。
277
278因為您在自己的映像中固定閘道的版本,新 Claude Code 版本中的修復(包括安全修復)僅在您更新固定並重新部署時到達您的部署。將閘道包含在您用於保持生產認證的其他服務的相同修補排程中。
215 279
216<h2 id="security">280<h2 id="security">
217 安全281 安全
239 303
240* 開發人員持有短期 JWT 而不是原始上游金鑰。CLI 到閘道的腿使用 RFC 8628 設備授予,閘道與 IdP 的授權碼交換在預設配置中執行 PKCE,因此攔截的 IdP 授權碼是無用的。304* 開發人員持有短期 JWT 而不是原始上游金鑰。CLI 到閘道的腿使用 RFC 8628 設備授予,閘道與 IdP 的授權碼交換在預設配置中執行 PKCE,因此攔截的 IdP 授權碼是無用的。
241* 設備驗證頁面強制執行同源 POST 和根據 RFC 8628 §5.1 的每 IP 速率限制。請參閱 [使用者代碼暴力破解抵抗](#user-code-brute-force-resistance)。305* 設備驗證頁面強制執行同源 POST 和根據 RFC 8628 §5.1 的每 IP 速率限制。請參閱 [使用者代碼暴力破解抵抗](#user-code-brute-force-resistance)。
242306* 出站請求通過伺服器端請求偽造 (SSRF) 防護,解析 DNS、阻止連結本地和雲端中繼資料地址加上預設環回,並將連接固定到解析的 IP,因此操作員影響的 URL(例如 IdP 和 OTLP 目的地)無法重新導向到雲端中繼資料端點。RFC 1918 私有範圍被刻意允許,因為 IdP 和 OTLP 收集器通常存在於私有 IP 上。只有當閘道必須到達的東西合法地存在於環回上時,才在閘道的環境中設定 `CLAUDE_GATEWAY_ALLOW_LOOPBACK=1`,例如本地開發 IdP 或 `localhost` 上的邊車 OTLP 收集器。該變數放寬每個操作員配置的 URL 的環回阻止,也跳過啟動時檢查 pod 是否可以到達雲端中繼資料端點的警告,因此偏好為收集器提供自己的內部地址。* 閘道對您的 IdP、您的 OTLP 收集器和 `provider: anthropic` 上游的請求通過伺服器端請求偽造 (SSRF) 防護,解析 DNS、阻止連結本地和雲端中繼資料地址加上預設環回,並將連接固定到解析的 IP,因此操作員影響的 URL 無法重新導向到雲端中繼資料端點。RFC 1918 私有範圍被刻意允許,因為 IdP 和 OTLP 收集器通常存在於私有 IP 上。對於其他提供者,閘道在載入配置時拒絕命名這些地址或中繼資料主機名的 `base_url`,提供者的 SDK 隨後連接而不進行 DNS 檢查。
307
308 如果您開啟 [僅代理出口](/docs/zh-TW/claude-apps-gateway-config#proxy-only-egress),該地址檢查會移至您的轉發代理:閘道交付主機名,代理的允許清單必須拒絕這些目的地。
309
310 只有當閘道必須到達的東西合法地存在於環回上時,才在閘道的環境中設定 `CLAUDE_GATEWAY_ALLOW_LOOPBACK=1`,例如本地開發 IdP 或 `localhost` 上的邊車 OTLP 收集器。該變數放寬每個操作員配置的 URL 的環回阻止,也跳過啟動時檢查 pod 是否可以到達雲端中繼資料端點的警告,因此偏好為收集器提供自己的內部地址。
243 311
244如果您新增自己的出口控制,閘道必須在使用工作負載身份等實例中繼資料認證時到達中繼資料伺服器。312如果您新增自己的出口控制,閘道必須在使用工作負載身份等實例中繼資料認證時到達中繼資料伺服器。
245 313
254 322
255開發人員在 `/device` 驗證頁面中輸入的 `user_code` 是從 20 字元字母表中抽取的 8 個字元,產生 20⁸ 或約 2.56×10¹⁰ 個組合,並在 10 分鐘後過期。323開發人員在 `/device` 驗證頁面中輸入的 `user_code` 是從 20 字元字母表中抽取的 8 個字元,產生 20⁸ 或約 2.56×10¹⁰ 個組合,並在 10 分鐘後過期。
256 324
257325閘道在設備授予端點上應用按 IP 速率限制,可透過 [`rate_limits`](/docs/zh-TW/claude-apps-gateway-config#http-tuning) 配置。如果許多開發人員從單一共享公司 NAT 地址簽入,請提高限制。限制僅適用於簽入流程,不適用於推理。閘道在設備授予端點上應用按 IP 速率限制,可透過 [`rate_limits`](/docs/zh-TW/claude-apps-gateway-config#http-tuning) 配置。如果許多開發人員從單一共享公司 NAT 地址簽入,請提高限制。[大規模推出](#large-rollouts) 顯示如何調整它們的大小。限制僅適用於簽入流程,不適用於推理。
258 326
259<h3 id="compliance-posture">327<h3 id="compliance-posture">
260 合規性態勢328 合規性態勢
291| 啟動顯示 `Gateway login is configured in managed settings, but this Claude Code build does not include Cloud gateway support.` | 已安裝的 Claude Code 組建早於 gateway 支援 | 讓開發者將 Claude Code 更新到包含 Cloud gateway 支援的版本 |359| 啟動顯示 `Gateway login is configured in managed settings, but this Claude Code build does not include Cloud gateway support.` | 已安裝的 Claude Code 組建早於 gateway 支援 | 讓開發者將 Claude Code 更新到包含 Cloud gateway 支援的版本 |
292| 啟動結束,顯示 `Administrator policy requires a Cloud gateway sign-in on this machine` | 開發者的環境設定了 `ANTHROPIC_API_KEY` 或 `ANTHROPIC_AUTH_TOKEN`、其設定配置了 [`apiKeyHelper`](/docs/zh-TW/settings-reference#apikeyhelper),或來自較早 Claude Console 登入的 API 金鑰仍然被儲存 | 讓開發者清除每個適用的項目:取消設定變數、移除 `apiKeyHelper` 項目,或執行 `claude auth logout` 以移除已儲存的金鑰。然後讓他們啟動 `claude` 並使用 `/login` 登入。另請參閱[系統管理員原則要求 Cloud gateway 登入](/docs/zh-TW/errors#administrator-policy-requires-a-cloud-gateway-sign-in)。 |360| 啟動結束,顯示 `Administrator policy requires a Cloud gateway sign-in on this machine` | 開發者的環境設定了 `ANTHROPIC_API_KEY` 或 `ANTHROPIC_AUTH_TOKEN`、其設定配置了 [`apiKeyHelper`](/docs/zh-TW/settings-reference#apikeyhelper),或來自較早 Claude Console 登入的 API 金鑰仍然被儲存 | 讓開發者清除每個適用的項目:取消設定變數、移除 `apiKeyHelper` 項目,或執行 `claude auth logout` 以移除已儲存的金鑰。然後讓他們啟動 `claude` 並使用 `/login` 登入。另請參閱[系統管理員原則要求 Cloud gateway 登入](/docs/zh-TW/errors#administrator-policy-requires-a-cloud-gateway-sign-in)。 |
293| 啟動或 `/login` 在受管設定載入時出現 403 後報告 `Claude Code may not be enabled for your organization` | gateway 或其前面的某個東西以 403 回應了 `/managed/settings` 請求。gateway 自己的設定路由永遠不會回應 403。狀態來自 [`access_control`](/docs/zh-TW/claude-apps-gateway-config#http-tuning) IP 檢查或來自 gateway 前面的代理或 WAF。稽核日誌將 IP 檢查拒絕記錄為 `access.denied`,並附上原因。開發者保持登入狀態。 | 檢查稽核日誌中失敗時的 `access.denied`,並修正 `access_control` 清單或前端,然後讓開發者再次啟動 `claude` |361| 啟動或 `/login` 在受管設定載入時出現 403 後報告 `Claude Code may not be enabled for your organization` | gateway 或其前面的某個東西以 403 回應了 `/managed/settings` 請求。gateway 自己的設定路由永遠不會回應 403。狀態來自 [`access_control`](/docs/zh-TW/claude-apps-gateway-config#http-tuning) IP 檢查或來自 gateway 前面的代理或 WAF。稽核日誌將 IP 檢查拒絕記錄為 `access.denied`,並附上原因。開發者保持登入狀態。 | 檢查稽核日誌中失敗時的 `access.denied`,並修正 `access_control` 清單或前端,然後讓開發者再次啟動 `claude` |
362| CLI `/login`:`The gateway is limiting sign-in attempts right now`,或在較舊版本上 `Request failed with status code 429`。`/device` 頁面可能對尚未嘗試過的開發者顯示 `Too many attempts` | 達到了每個 IP 的登入速率限制。要麼 `listen.trusted_proxies` 不涵蓋負載平衡器,所以每個開發者共享其位址,要麼許多開發者共享 NAT 或 VPN 出口位址。具有 `result: rate_limited` 的稽核事件顯示相同的一個或幾個 `client_ip` 值。 | 首先將 `listen.trusted_proxies` 設定為負載平衡器的來源範圍,然後如果開發者仍然共享位址,請提高 `rate_limits`。請參閱[大規模推出](#large-rollouts)。 |
294| CLI `/login`:`Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip>` | gateway 主機名稱解析為至少一個公開 IP 位址。Claude Code 檢查每個已解析的位址,並要求每個位址都是私有的。常見原因是雙堆疊名稱,其中一個系列解析為公開位址,包括 AWS 內部雙堆疊負載平衡器,它們傳回公開範圍的 AAAA 位址。 | 讓 gateway 名稱在開發者機器上只解析為私有位址。對於雙堆疊名稱,請刪除公開範圍記錄或提供單獨的僅限內部 DNS 名稱。請參閱[私有網路先決條件](/docs/zh-TW/claude-apps-gateway#prerequisites)。如果位址是您的組織擁有並在內部使用的公開空間,請改為[宣告該區塊](/docs/zh-TW/claude-apps-gateway#allow-a-gateway-on-public-address-space-you-own)。 |363| CLI `/login`:`Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip>` | gateway 主機名稱解析為至少一個公開 IP 位址。Claude Code 檢查每個已解析的位址,並要求每個位址都是私有的。常見原因是雙堆疊名稱,其中一個系列解析為公開位址,包括 AWS 內部雙堆疊負載平衡器,它們傳回公開範圍的 AAAA 位址。 | 讓 gateway 名稱在開發者機器上只解析為私有位址。對於雙堆疊名稱,請刪除公開範圍記錄或提供單獨的僅限內部 DNS 名稱。請參閱[私有網路先決條件](/docs/zh-TW/claude-apps-gateway#prerequisites)。如果位址是您的組織擁有並在內部使用的公開空間,請改為[宣告該區塊](/docs/zh-TW/claude-apps-gateway#allow-a-gateway-on-public-address-space-you-own)。 |
295| CLI `/login`:`Gateway login would go through proxy <proxy>, which is not on a private network` | `HTTPS_PROXY` 或 `HTTP_PROXY` 適用於 gateway 主機,且代理的主機名稱解析為公開位址。主機名稱只解析為私有位址的代理是允許的,不會觸發此錯誤 | 在開發者的機器上將 gateway 主機新增到 `NO_PROXY`,以便連線是直接的,或使用主機名稱解析為私有位址的代理。訊息會命名要新增的確切 `NO_PROXY` 項目 |364| CLI `/login`:`Gateway login would go through proxy <proxy>, which is not on a private network` | `HTTPS_PROXY` 或 `HTTP_PROXY` 適用於 gateway 主機,且代理的主機名稱解析為公開位址。主機名稱只解析為私有位址的代理是允許的,不會觸發此錯誤 | 在開發者的機器上將 gateway 主機新增到 `NO_PROXY`,以便連線是直接的,或使用主機名稱解析為私有位址的代理。訊息會命名要新增的確切 `NO_PROXY` 項目 |
296| CLI `/login`:`Claude Code only signs in to <host> from inside its declared network <block> (managed settings), and this machine is connecting from <ip>, outside it` | gateway 位於 [`gatewayInternalNetworks`](/docs/zh-TW/claude-apps-gateway#allow-a-gateway-on-public-address-space-you-own) 中宣告的區塊上,開發者的機器從該區塊外的位址到達它:VPN 位址池、容器或 WSL2 NAT 區段,或不是您的網路 | 讓開發者從您網路上的主機 OS 執行 `/login`。如果顯示的位址也是您組織自己的公開空間,請將 gateway 的項目替換為涵蓋兩者的區塊,最多 `/8`;第二個重疊項目會被拒絕 |365| CLI `/login`:`Claude Code only signs in to <host> from inside its declared network <block> (managed settings), and this machine is connecting from <ip>, outside it` | gateway 位於 [`gatewayInternalNetworks`](/docs/zh-TW/claude-apps-gateway#allow-a-gateway-on-public-address-space-you-own) 中宣告的區塊上,開發者的機器從該區塊外的位址到達它:VPN 位址池、容器或 WSL2 NAT 區段,或不是您的網路 | 讓開發者從您網路上的主機 OS 執行 `/login`。如果顯示的位址也是您組織自己的公開空間,請將 gateway 的項目替換為涵蓋兩者的區塊,最多 `/8`;第二個重疊項目會被拒絕 |
301| CLI `/login`:`Could not resolve gateway host <host>` | 機器無法解析 gateway 的內部 DNS 名稱,通常是因為它不在公司網路上 | 讓開發者連線到您的網路或 VPN,然後重試 `/login` |370| CLI `/login`:`Could not resolve gateway host <host>` | 機器無法解析 gateway 的內部 DNS 名稱,通常是因為它不在公司網路上 | 讓開發者連線到您的網路或 VPN,然後重試 `/login` |
302| 啟動結束,顯示命名 `store.postgres_url` 的設定驗證錯誤 | 未設定 Postgres;gateway 需要 Postgres | 設定 `store.postgres_url`。對於本機開發,請使用一次性容器:`docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres`。 |371| 啟動結束,顯示命名 `store.postgres_url` 的設定驗證錯誤 | 未設定 Postgres;gateway 需要 Postgres | 設定 `store.postgres_url`。對於本機開發,請使用一次性容器:`docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres`。 |
303| 啟動結束:`requires the native binary` | 在 Node 下執行而不是原生二進位檔 | 使用其中一種[獨立安裝方法](/docs/zh-TW/setup)安裝 Claude Code |372| 啟動結束:`requires the native binary` | 在 Node 下執行而不是原生二進位檔 | 使用其中一種[獨立安裝方法](/docs/zh-TW/setup)安裝 Claude Code |
304373| 啟動結束,在 `config.load` 後出現 OIDC 探索錯誤 | `oidc.issuer` 無法到達,或 TLS 鏈不受信任 | 檢查發行者是否可從 pod 到達並提供 `/.well-known/openid-configuration`。為私有 PKI 設定 `ca_cert_pem`。如果 pod 只能通過轉發代理到達 IdP,請設定 [`oidc.use_proxy: true`](/docs/zh-TW/claude-apps-gateway-config#idp-requests-through-a-forward-proxy);在 v2.1.227 之前的版本上,改為給 pod 一條到 IdP 每個端點的直接路由。 || 啟動結束,在 `config.load` 後出現 OIDC 探索錯誤 | `oidc.issuer` 無法到達,或 TLS 鏈不受信任 | 檢查發行者是否可從 pod 到達並提供 `/.well-known/openid-configuration`。為私有 PKI 設定 `ca_cert_pem`。如果 pod 只能通過轉發代理到達 IdP,請設定 [`oidc.use_proxy: true`](/docs/zh-TW/claude-apps-gateway-config#idp-requests-through-a-forward-proxy);在 v2.1.227 之前的版本上,改為給 pod 一條到 IdP 每個端點的直接路由。如果 pod 也無法解析 IdP 的主機名稱,或代理拒絕 `CONNECT` 到 IP 位址,請參閱[僅代理出口](/docs/zh-TW/claude-apps-gateway-config#proxy-only-egress),這需要 v2.1.277 或更新版本。 |
305| 啟動結束,出現 Postgres 權限錯誤 | 資料庫角色在其結構描述上缺少 DDL 權限 | 授予角色在 gateway 結構描述上的 `CREATE` 權限,以便它可以在啟動時建立和更改其表格 |374| 啟動結束,出現 Postgres 權限錯誤 | 資料庫角色在其結構描述上缺少 DDL 權限 | 授予角色在 gateway 結構描述上的 `CREATE` 權限,以便它可以在啟動時建立和更改其表格 |
375| 日誌:`could not connect to Postgres at boot, attempt 1 of 3` | 當 gateway 啟動時資料庫無法到達,例如在冷執行個體上,其網路仍在啟動中 | 如果 gateway 隨後完成啟動,則無需採取任何行動。當資料庫無法到達時,gateway 在結束前嘗試連線三次,間隔兩秒。如果它結束時顯示 `could not connect to Postgres`,請檢查 `store.postgres_url` 和到資料庫的網路路徑。如果嘗試逾時而不是被拒絕,請提高 [`store.connect_timeout_seconds`](/docs/zh-TW/claude-apps-gateway-config#store) 以給每個嘗試更長的時間。 |
306| `/oauth/callback` 顯示「Sign-in could not be completed」 | 電子郵件網域被拒絕、id\_token 驗證失敗,或 `email_verified` 明確為 `false`,gateway 始終拒絕且無法覆蓋 | 檢查 `allowed_email_domains` 以及 IdP 是否傳回已驗證的 `email` 宣告。對於 `email_verified: false`,修正 IdP 端驗證。如果您的 IdP 在不同的宣告名稱下發出電子郵件,請設定 `oidc.email_claim`。 |376| `/oauth/callback` 顯示「Sign-in could not be completed」 | 電子郵件網域被拒絕、id\_token 驗證失敗,或 `email_verified` 明確為 `false`,gateway 始終拒絕且無法覆蓋 | 檢查 `allowed_email_domains` 以及 IdP 是否傳回已驗證的 `email` 宣告。對於 `email_verified: false`,修正 IdP 端驗證。如果您的 IdP 在不同的宣告名稱下發出電子郵件,請設定 `oidc.email_claim`。 |
307| 日誌:`token exchange failed request_id=<id>: id_token missing email claim` | IdP 預設不在 id\_token 中包含 `email`。此拒絕僅在設定 `allowed_email_domains` 時觸發;沒有它,遺漏的電子郵件會建立沒有電子郵件的工作階段 | 設定 IdP 在 id\_token 中發出 `email`。Okta:將 `email` 新增到自訂授權伺服器的 ID 令牌宣告。Entra:在應用程式註冊上新增 `email` 作為選用宣告。PingFederate:啟用發出 `email` 的 OpenID Connect 原則。如果 IdP 從 userinfo 端點提供 `email` 但不會在 id\_token 中包含它,例如 Okta 組織授權伺服器,請設定 `oidc.userinfo_fallback: true`。 |377| 日誌:`token exchange failed request_id=<id>: id_token missing email claim` | IdP 預設不在 id\_token 中包含 `email`。此拒絕僅在設定 `allowed_email_domains` 時觸發;沒有它,遺漏的電子郵件會建立沒有電子郵件的工作階段 | 設定 IdP 在 id\_token 中發出 `email`。Okta:將 `email` 新增到自訂授權伺服器的 ID 令牌宣告。Entra:在應用程式註冊上新增 `email` 作為選用宣告。PingFederate:啟用發出 `email` 的 OpenID Connect 原則。如果 IdP 從 userinfo 端點提供 `email` 但不會在 id\_token 中包含它,例如 Okta 組織授權伺服器,請設定 `oidc.userinfo_fallback: true`。 |
308| 日誌:`refresh failed request_id=<id>: invalid_token (…) (at userinfo_no_id_token, …)`,開發者每 `session.ttl_hours` 看到 `Cloud gateway session expired` | IdP 接受了重新整理令牌但沒有隨之傳回 id\_token,所以 gateway 詢問了 IdP 的 userinfo 端點以取得使用者的宣告。IdP 在那裡拒絕了重新整理的存取令牌。gateway 回應 `temporarily_unavailable`,所以 Claude Code 保留重新整理令牌但無法更新工作階段。v2.1.260 之前的 gateway 版本記錄相同的行,但沒有 `(at …)` 詳細資訊。 | 設定 [`oidc.scope_on_refresh: true`](/docs/zh-TW/claude-apps-gateway-config#oidc)(在 gateway v2.1.260 或更新版本中可用),以便重新整理請求再次要求 `openid`。某些 IdP(例如 Okta)僅在被要求時才在重新整理時傳回 id\_token。在 PingFederate 上,改為在 **Applications > OAuth > OpenID Connect Policy Management** 下啟用 **Return ID Token On Refresh Grant**。該金鑰不會改變 PingFederate 的行為。對於仍然省略它的其他 IdP,檢查 userinfo 端點是否接受由重新整理發出的存取令牌。作為臨時解決方案,提高 [`session.ttl_hours`](/docs/zh-TW/claude-apps-gateway-config#session)。請參閱[身分提供者設定](#identity-provider-setup)以了解取消佈建權衡。 |378| 日誌:`refresh failed request_id=<id>: invalid_token (…) (at userinfo_no_id_token, …)`,開發者每 `session.ttl_hours` 看到 `Cloud gateway session expired` | IdP 接受了重新整理令牌但沒有隨之傳回 id\_token,所以 gateway 詢問了 IdP 的 userinfo 端點以取得使用者的宣告。IdP 在那裡拒絕了重新整理的存取令牌。gateway 回應 `temporarily_unavailable`,所以 Claude Code 保留重新整理令牌但無法更新工作階段。v2.1.260 之前的 gateway 版本記錄相同的行,但沒有 `(at …)` 詳細資訊。 | 設定 [`oidc.scope_on_refresh: true`](/docs/zh-TW/claude-apps-gateway-config#oidc)(在 gateway v2.1.260 或更新版本中可用),以便重新整理請求再次要求 `openid`。某些 IdP(例如 Okta)僅在被要求時才在重新整理時傳回 id\_token。在 PingFederate 上,改為在 **Applications > OAuth > OpenID Connect Policy Management** 下啟用 **Return ID Token On Refresh Grant**。該金鑰不會改變 PingFederate 的行為。對於仍然省略它的其他 IdP,檢查 userinfo 端點是否接受由重新整理發出的存取令牌。作為臨時解決方案,提高 [`session.ttl_hours`](/docs/zh-TW/claude-apps-gateway-config#session)。請參閱[身分提供者設定](#identity-provider-setup)以了解取消佈建權衡。 |
309| 每個 Amazon Bedrock 請求都傳回 502;日誌顯示 `Could not load credentials from any providers` | 在 EC2 上,IMDSv2 的預設躍點限制為 1 會阻止來自容器內的執行個體中繼資料請求。啟動和 `/readyz` 仍然通過,因為 AWS SDK 在第一個請求時解析執行個體認證,而不是在用戶端建構時 | 使用 `aws ec2 modify-instance-metadata-options --instance-id <id> --http-put-response-hop-limit 2` 提高躍點限制,或在啟動範本中設定它。變更適用於執行個體上的每個容器。在可用的地方優先使用 ECS 工作角色,它們從 ECS 容器認證端點讀取認證並完全避免變更,或在專用 gateway 執行個體上應用變更以限制暴露。 |379| 每個 Amazon Bedrock 請求都傳回 502;日誌顯示 `Could not load credentials from any providers` | 在 EC2 上,IMDSv2 的預設躍點限制為 1 會阻止來自容器內的執行個體中繼資料請求。啟動和 `/readyz` 仍然通過,因為 AWS SDK 在第一個請求時解析執行個體認證,而不是在用戶端建構時 | 使用 `aws ec2 modify-instance-metadata-options --instance-id <id> --http-put-response-hop-limit 2` 提高躍點限制,或在啟動範本中設定它。變更適用於執行個體上的每個容器。在可用的地方優先使用 ECS 工作角色,它們從 ECS 容器認證端點讀取認證並完全避免變更,或在專用 gateway 執行個體上應用變更以限制暴露。 |
380| 在尖峰負載時,回應開始緩慢或似乎掛起,或在上游健康時失敗,顯示 502 `all upstreams failed` | 副本開啟的請求比它一次傳送到上游的請求多,所以額外的請求在 gateway 內等待。在 `provider: anthropic` 上游上,等待時間超過 `timeouts.upstream_ttfb_ms` 的請求會放棄該上游,當沒有後來的上游提供它時會產生 502。日誌顯示包含 `client requests are open` 的警告。 | 新增副本,或提高每個副本上的限制。請參閱[並行上游請求](#concurrent-upstream-requests)。 |
310| IdP 錯誤:unknown or unsupported scope | IdP 拒絕它不認識的範圍 | 將 `oidc.scopes` 設定為您的 IdP 接受的確切清單;它必須包含 `openid`。預設值為 `openid profile email offline_access`。 |381| IdP 錯誤:unknown or unsupported scope | IdP 拒絕它不認識的範圍 | 將 `oidc.scopes` 設定為您的 IdP 接受的確切清單;它必須包含 `openid`。預設值為 `openid profile email offline_access`。 |
311| 設定 `oidc.scopes` 後工作階段不會無聲地更新 | `offline_access` 已從覆蓋中刪除 | 如果您的 IdP 支援,請新增 `offline_access` 回來。沒有重新整理令牌,開發者每 `session.ttl_hours` 重新執行瀏覽器登入。 |382| 設定 `oidc.scopes` 後工作階段不會無聲地更新 | `offline_access` 已從覆蓋中刪除 | 如果您的 IdP 支援,請新增 `offline_access` 回來。沒有重新整理令牌,開發者每 `session.ttl_hours` 重新執行瀏覽器登入。 |
312| 瀏覽器顯示「This request came from another site and was blocked」 | 跨網站表單 POST,被阻止作為 CSRF 保護。嵌入或代理頁面的預期行為 | 直接開啟驗證連結 |383| 瀏覽器顯示「This request came from another site and was blocked」 | 跨網站表單 POST,被阻止作為 CSRF 保護。嵌入或代理頁面的預期行為 | 直接開啟驗證連結 |