fix(providers): complete OAuth logins that finish in the browser
OpenCode's authorize response reports how the client must finish: `code` expects a pasted code, while `auto` requires the client to call oauth/callback immediately and hold it open — upstream blocks in there polling for the device code or waiting on its loopback redirect, and only that call persists the credential. Every auth plugin OpenCode ships uses `auto`; none use `code`. The page implemented only `code`. It opened the browser, showed a paste field no provider can fill, and never called back, so a successful sign-in stored nothing and the app sat unchanged. Authorization now drives the UI: `auto` chains straight into the callback behind a waiting state with a cancel, and the paste field appears only when a provider actually asks for a code. Two smaller failures shared that surface. Prompts were never collected, which put GitHub Copilot Enterprise out of reach entirely, so a method that declares them now asks first and passes the answers to authorize. Device codes are also recovered from the instructions text, where they actually live — the old code read fields the API does not return, so the copy button never appeared. The callback is exempt from the ordinary proxy deadline and gets a 15-minute budget, bounded by the shortest upstream expiry we know of. A human sign-in with 2FA does not fit in four minutes, and expiring it turned a completed login into a 504.
This commit is contained in:
@@ -1360,6 +1360,9 @@ export const settingsDict = {
|
||||
'settings.projects.sidebar.actions.addProject': 'Dodaj projekt',
|
||||
'settings.projects.sidebar.total': 'Suma: {count}',
|
||||
'settings.providers.page.actions.complete': 'Zakończ',
|
||||
'settings.providers.page.actions.continue': 'Kontynuuj',
|
||||
'settings.providers.page.actions.cancel': 'Anuluj',
|
||||
'settings.providers.page.actions.tryAgain': 'Spróbuj ponownie',
|
||||
'settings.providers.page.actions.connect': 'Połącz',
|
||||
'settings.providers.page.actions.copy': 'Kopiuj',
|
||||
'settings.providers.page.actions.copyCode': 'Kopiuj kod',
|
||||
@@ -1385,6 +1388,17 @@ export const settingsDict = {
|
||||
'settings.providers.page.auth.loadingMethods': 'Ładowanie metod uwierzytelniania...',
|
||||
'settings.providers.page.auth.oauthMethodFallback': 'Metoda OAuth {index}',
|
||||
'settings.providers.page.auth.pasteAuthorizationCodePlaceholder': 'Wklej kod autoryzacyjny',
|
||||
'settings.providers.page.auth.oauth.starting': 'Rozpoczynanie autoryzacji…',
|
||||
'settings.providers.page.auth.oauth.waiting': 'Oczekiwanie na autoryzację…',
|
||||
'settings.providers.page.auth.oauth.waitingHint': 'Dokończ logowanie w przeglądarce. Zostaw tę stronę otwartą — połączenie zakończy się samo.',
|
||||
'settings.providers.page.auth.oauth.codeHint': 'Skopiuj kod autoryzacji z przeglądarki i wklej go tutaj.',
|
||||
'settings.providers.page.auth.oauth.deviceCodeLabel': 'Kod urządzenia',
|
||||
'settings.providers.page.auth.oauth.linkLabel': 'Link autoryzacyjny',
|
||||
'settings.providers.page.auth.oauth.promptRequired': 'Wypełnij pole „{field}”, aby kontynuować',
|
||||
'settings.providers.page.auth.oauth.error.sessionExpired': 'Żądanie autoryzacji wygasło. Połącz ponownie, aby zacząć od nowa.',
|
||||
'settings.providers.page.auth.oauth.error.codeRequired': 'Ten dostawca wymaga kodu autoryzacji z przeglądarki.',
|
||||
'settings.providers.page.auth.oauth.error.declined': 'Autoryzacja została odrzucona lub nie została ukończona.',
|
||||
'settings.providers.page.auth.oauth.error.invalidInput': 'Wprowadzone dane zostały odrzucone.',
|
||||
'settings.providers.page.auth.title': 'Uwierzytelnianie',
|
||||
'settings.providers.page.auth.useReconnectHint': '· Użyj Połącz ponownie, aby zaktualizować dane logowania',
|
||||
'settings.providers.page.custom.optionLabel': 'Inny / Niestandardowy',
|
||||
@@ -1474,7 +1488,6 @@ export const settingsDict = {
|
||||
'settings.providers.page.toast.apiKeySaveFailed': 'Nie udało się zapisać klucza API',
|
||||
'settings.providers.page.toast.apiKeySaved': 'Klucz API został zapisany',
|
||||
'settings.providers.page.toast.authMethodsLoadFailed': 'Nie udało się załadować metod uwierzytelniania dostawcy',
|
||||
'settings.providers.page.toast.completeOAuthInBrowser': 'Dokończ proces OAuth w przeglądarce',
|
||||
'settings.providers.page.toast.deviceCodeCopied': 'Kod urządzenia został skopiowany',
|
||||
'settings.providers.page.toast.deviceCodeCopyFailed': 'Nie udało się skopiować kodu urządzenia',
|
||||
'settings.providers.page.toast.oauthCompleteFailed': 'Nie udało się dokończyć procesu OAuth',
|
||||
|
||||
Reference in New Issue
Block a user