Skip to content

Commit fd22cd3

Browse files
authored
Move to new 'Confirm' device code flow (#3870)
1 parent ad937ff commit fd22cd3

File tree

5 files changed

+31
-15
lines changed

5 files changed

+31
-15
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix issue displaying SSO code on new UI in Windows"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Authentication: When signing in to AWS Builder Id or IAM Identity Center (SSO), verify the device code matches instead of copy-pasting it"
4+
}

jetbrains-core/src/software/aws/toolkits/jetbrains/core/credentials/sso/SsoLoginCallbackProvider.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package software.aws.toolkits.jetbrains.core.credentials.sso
66
import com.intellij.ide.BrowserUtil
77
import com.intellij.openapi.progress.ProcessCanceledException
88
import software.aws.toolkits.jetbrains.core.credentials.sono.SONO_URL
9-
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.CopyUserCodeForLoginDialog
9+
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.ConfirmUserCodeLoginDialog
1010
import software.aws.toolkits.jetbrains.utils.computeOnEdt
1111
import software.aws.toolkits.jetbrains.utils.notifyError
1212
import software.aws.toolkits.resources.message
@@ -28,15 +28,15 @@ class DefaultSsoLoginCallbackProvider : SsoLoginCallbackProvider {
2828
object SsoPrompt : SsoLoginCallback {
2929
override fun tokenPending(authorization: Authorization) {
3030
computeOnEdt {
31-
val result = CopyUserCodeForLoginDialog(
31+
val result = ConfirmUserCodeLoginDialog(
3232
authorization.userCode,
3333
message("credentials.sso.login.title"),
3434
CredentialType.SsoProfile
3535
).showAndGet()
3636

3737
if (result) {
3838
AwsTelemetry.loginWithBrowser(project = null, Result.Succeeded, CredentialType.SsoProfile)
39-
BrowserUtil.browse(authorization.verificationUri)
39+
BrowserUtil.browse(authorization.verificationUriComplete)
4040
} else {
4141
AwsTelemetry.loginWithBrowser(project = null, Result.Cancelled, CredentialType.SsoProfile)
4242
throw ProcessCanceledException(IllegalStateException(message("credentials.sso.login.cancelled")))
@@ -54,15 +54,15 @@ object SsoPrompt : SsoLoginCallback {
5454
object BearerTokenPrompt : SsoLoginCallback {
5555
override fun tokenPending(authorization: Authorization) {
5656
computeOnEdt {
57-
val codeCopied = CopyUserCodeForLoginDialog(
57+
val codeCopied = ConfirmUserCodeLoginDialog(
5858
authorization.userCode,
5959
message("credentials.sono.login"),
6060
CredentialType.BearerToken
6161
).showAndGet()
6262

6363
if (codeCopied) {
6464
AwsTelemetry.loginWithBrowser(project = null, Result.Succeeded, CredentialType.BearerToken)
65-
BrowserUtil.browse(authorization.verificationUri)
65+
BrowserUtil.browse(authorization.verificationUriComplete)
6666
} else {
6767
AwsTelemetry.loginWithBrowser(project = null, Result.Cancelled, CredentialType.BearerToken)
6868
}
Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,53 @@ import com.intellij.openapi.actionSystem.ActionToolbar
99
import com.intellij.openapi.actionSystem.AnAction
1010
import com.intellij.openapi.actionSystem.AnActionEvent
1111
import com.intellij.openapi.actionSystem.impl.ActionButton
12+
import com.intellij.openapi.editor.colors.EditorColorsUtil
1213
import com.intellij.openapi.ide.CopyPasteManager
1314
import com.intellij.openapi.ui.DialogWrapper
1415
import com.intellij.ui.components.JBLabel
1516
import com.intellij.ui.dsl.builder.panel
1617
import com.intellij.ui.dsl.gridLayout.HorizontalAlign
18+
import com.intellij.util.ui.JBFont
1719
import com.intellij.util.ui.components.BorderLayoutPanel
20+
import software.aws.toolkits.core.utils.tryOrNull
1821
import software.aws.toolkits.resources.message
1922
import software.aws.toolkits.telemetry.AwsTelemetry
2023
import software.aws.toolkits.telemetry.CredentialType
2124
import software.aws.toolkits.telemetry.Result
2225
import java.awt.datatransfer.StringSelection
2326
import javax.swing.JComponent
2427

25-
class CopyUserCodeForLoginDialog(
28+
class ConfirmUserCodeLoginDialog(
2629
private val authCode: String,
2730
private val dialogTitle: String,
2831
private val credentialType: CredentialType
2932
) : DialogWrapper(null) {
3033

3134
private val pane = panel {
3235
row {
33-
text(message("aws.sso.signing.device.code.copy.dialog.text"), maxLineLength = -1)
36+
label(message("aws.sso.signing.device.code.copy.dialog.text"))
3437
}
3538

3639
row {
3740
cell(
3841
BorderLayoutPanel(5, 0).apply {
3942
val action = CopyUserCodeForLogin(authCode)
40-
addToCenter(JBLabel(authCode).setCopyable(true))
43+
addToCenter(
44+
JBLabel(authCode).apply {
45+
tryOrNull {
46+
JBFont.create(JBFont.decode(EditorColorsUtil.getGlobalOrDefaultColorScheme().consoleFontName)).biggerOn(9f).asBold()
47+
}?.let {
48+
font = it
49+
}
50+
setCopyable(true)
51+
}
52+
)
4153
addToRight(ActionButton(action, action.templatePresentation.clone(), ActionPlaces.UNKNOWN, ActionToolbar.NAVBAR_MINIMUM_BUTTON_SIZE))
4254
}
4355
).horizontalAlign(HorizontalAlign.CENTER)
4456
}
4557
}
58+
4659
override fun createCenterPanel(): JComponent? = pane
4760

4861
init {
@@ -51,11 +64,6 @@ class CopyUserCodeForLoginDialog(
5164
super.init()
5265
}
5366

54-
override fun doOKAction() {
55-
CopyPasteManager.getInstance().setContents(StringSelection(authCode))
56-
super.doOKAction()
57-
}
58-
5967
override fun doCancelAction() {
6068
super.doCancelAction()
6169
AwsTelemetry.loginWithBrowser(project = null, Result.Cancelled, credentialType)

resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ aws.settings.telemetry.option=Send usage metrics to AWS
136136
aws.settings.telemetry.prompt.message=Usage metrics are collected by default. Click <a href="">here</a> to adjust this behavior.
137137
aws.settings.telemetry.prompt.title=AWS Toolkit telemetry
138138
aws.settings.title=AWS
139-
aws.sso.signing.device.code=Open and Copy Code
139+
aws.sso.signing.device.code=Proceed To Browser
140140
aws.sso.signing.device.code.copy=Copy Code
141-
aws.sso.signing.device.code.copy.dialog.text=To proceed, open the login page and provide this code to confirm the access request from AWS Toolkit:
141+
aws.sso.signing.device.code.copy.dialog.text=To proceed, open the login page and confirm that the code matches:
142142
aws.sso.signing.device.waiting=Waiting for browser authorization for code: {0}
143143
aws.terminal.action=Open AWS local terminal
144144
aws.terminal.action.tooltip=Start a local terminal with the current AWS connection settings injected as environment variables

0 commit comments

Comments
 (0)