@@ -14,6 +14,7 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
1414import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1515import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener
1616import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
17+ import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
1718import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProvider
1819import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
1920import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
@@ -69,8 +70,29 @@ class DefaultAuthCredentialsService(
6970 tokenSyncTask = scheduler.scheduleWithFixedDelay(
7071 {
7172 try {
72- if (isQConnected(project) && ! isQExpired(project)) {
73- updateTokenFromActiveConnection()
73+ if (isQConnected(project)) {
74+ if (isQExpired(project)) {
75+ val manager = ToolkitConnectionManager .getInstance(project)
76+ val connection = manager.activeConnectionForFeature(QConnection .getInstance()) ? : return @scheduleWithFixedDelay
77+
78+ // Try to refresh the token if it's in NEEDS_REFRESH state
79+ val tokenProvider = (connection.getConnectionSettings() as ? TokenConnectionSettings )
80+ ?.tokenProvider
81+ ?.delegate
82+ ?.let { it as ? BearerTokenProvider } ? : return @scheduleWithFixedDelay
83+
84+ if (tokenProvider.state() == BearerTokenAuthState .NEEDS_REFRESH ) {
85+ try {
86+ tokenProvider.resolveToken()
87+ // Now that the token is refreshed, update it in Flare
88+ updateTokenFromActiveConnection()
89+ } catch (e: Exception ) {
90+ LOG .warn(e) { " Failed to refresh bearer token" }
91+ }
92+ }
93+ } else {
94+ updateTokenFromActiveConnection()
95+ }
7496 }
7597 } catch (e: Exception ) {
7698 LOG .warn(e) { " Failed to sync bearer token to Flare" }
0 commit comments