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:
@@ -1359,6 +1359,17 @@ export const settingsDict = {
|
||||
'settings.providers.page.auth.apiKeyPlaceholder': 'sk-...',
|
||||
'settings.providers.page.auth.oauthMethodFallback': 'OAuth 방식 {index}',
|
||||
'settings.providers.page.auth.pasteAuthorizationCodePlaceholder': 'authorization code 붙여넣기',
|
||||
'settings.providers.page.auth.oauth.starting': '인증을 시작하는 중…',
|
||||
'settings.providers.page.auth.oauth.waiting': '인증을 기다리는 중…',
|
||||
'settings.providers.page.auth.oauth.waitingHint': '브라우저에서 로그인을 완료하세요. 이 페이지를 열어 두면 연결이 자동으로 완료됩니다.',
|
||||
'settings.providers.page.auth.oauth.codeHint': '브라우저에서 인증 코드를 복사해 여기에 붙여넣으세요.',
|
||||
'settings.providers.page.auth.oauth.deviceCodeLabel': '기기 코드',
|
||||
'settings.providers.page.auth.oauth.linkLabel': '인증 링크',
|
||||
'settings.providers.page.auth.oauth.promptRequired': '계속하려면 “{field}”을(를) 입력하세요',
|
||||
'settings.providers.page.auth.oauth.error.sessionExpired': '인증 요청이 만료되었습니다. 다시 연결해 처음부터 시작하세요.',
|
||||
'settings.providers.page.auth.oauth.error.codeRequired': '이 제공자에는 브라우저의 인증 코드가 필요합니다.',
|
||||
'settings.providers.page.auth.oauth.error.declined': '인증이 거부되었거나 완료되지 않았습니다.',
|
||||
'settings.providers.page.auth.oauth.error.invalidInput': '입력한 정보가 거부되었습니다.',
|
||||
'settings.providers.page.auth.connected': '연결됨',
|
||||
'settings.providers.page.auth.incomplete': '자격 증명 없음',
|
||||
'settings.providers.page.auth.incompleteHint': '· 채팅에서 이 공급자를 사용하기 전에 API 키 또는 {env:VAR}을(를) 추가하세요',
|
||||
@@ -1391,6 +1402,9 @@ export const settingsDict = {
|
||||
'settings.providers.page.actions.open': '열기',
|
||||
'settings.providers.page.actions.copy': '복사',
|
||||
'settings.providers.page.actions.complete': '완료',
|
||||
'settings.providers.page.actions.continue': '계속',
|
||||
'settings.providers.page.actions.cancel': '취소',
|
||||
'settings.providers.page.actions.tryAgain': '다시 시도',
|
||||
'settings.providers.page.actions.hide': '숨기기',
|
||||
'settings.providers.page.actions.reconnect': '재연결',
|
||||
'settings.providers.page.actions.edit': '편집',
|
||||
@@ -1406,7 +1420,6 @@ export const settingsDict = {
|
||||
'settings.providers.page.toast.apiKeySaved': 'API key가 저장되었습니다',
|
||||
'settings.providers.page.toast.oauthStartFailed': 'OAuth flow를 시작하지 못했습니다',
|
||||
'settings.providers.page.toast.oauthDetailsMissing': '반환된 OAuth 세부 정보가 없습니다',
|
||||
'settings.providers.page.toast.completeOAuthInBrowser': '브라우저에서 OAuth flow를 완료하세요',
|
||||
'settings.providers.page.toast.oauthCompleteFailed': 'OAuth flow를 완료하지 못했습니다',
|
||||
'settings.providers.page.toast.oauthCompleted': 'OAuth 연결이 완료되었습니다',
|
||||
'settings.providers.page.toast.oauthLinkCopied': 'OAuth 링크가 복사되었습니다',
|
||||
|
||||
Reference in New Issue
Block a user