diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt index f94f242050b..71e90026782 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt @@ -17,6 +17,7 @@ import com.intellij.ui.dsl.builder.Align import com.intellij.ui.dsl.builder.panel import com.intellij.ui.jcef.JBCefJSQuery import org.cef.CefApp +import software.amazon.awssdk.services.ssooidc.model.SsoOidcException import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn @@ -27,6 +28,8 @@ import software.aws.toolkits.jetbrains.core.credentials.actions.SsoLogoutAction import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES import software.aws.toolkits.jetbrains.core.credentials.sono.isSono +import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProvider +import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener import software.aws.toolkits.jetbrains.core.region.AwsRegionProvider import software.aws.toolkits.jetbrains.core.webview.BrowserMessage import software.aws.toolkits.jetbrains.core.webview.BrowserState @@ -243,12 +246,27 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos writeValueAsString(it) } - // TODO: pass "REAUTH" if connection expires - val stage = if (isQExpired(project)) { - "REAUTH" + val stage = if(isQExpired(project)) { + try { + val conn = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection + val provider = conn?.getConnectionSettings()?.tokenProvider + val p = provider?.delegate as? BearerTokenProvider + p?.resolveToken() + provider?.id?.let { BearerTokenProviderListener.notifyCredUpdate(it) } + return + } catch (e: SsoOidcException) { + "REAUTH" + } + } else { "START" } + // TODO: pass "REAUTH" if connection expires +// val stage = if (isQExpired(project)) { +// "REAUTH" +// } else { +// "START" +// } val jsonData = """ { diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/utils/FunctionUtils.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/utils/FunctionUtils.kt index 0ba09a91f9f..7996c5960f1 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/utils/FunctionUtils.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/utils/FunctionUtils.kt @@ -7,6 +7,7 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.delay import kotlinx.coroutines.withTimeoutOrNull import org.slf4j.LoggerFactory +import software.amazon.awssdk.services.ssooidc.model.SsoOidcException import software.aws.toolkits.core.utils.debug import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager @@ -56,6 +57,7 @@ fun isQExpired(project: Project): Boolean { LOG.debug { "qConnectionState: $qState; cwConnectionState: $cwState" } + return qState == BearerTokenAuthState.NEEDS_REFRESH || cwState == BearerTokenAuthState.NEEDS_REFRESH }