Skip to content

Commit 02f5d78

Browse files
committed
Print AWS console signin URL when --print-console-signin-url is passed
1 parent a6d6ee8 commit 02f5d78

File tree

1 file changed

+47
-4
lines changed

1 file changed

+47
-4
lines changed

aws_adfs/login.py

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import os.path
66
import subprocess
77
import sys
8+
import urllib
89
from datetime import datetime, timezone
910
from os import environ
1011
from platform import system
@@ -13,6 +14,7 @@
1314
import botocore.exceptions
1415
import botocore.session
1516
import click
17+
import requests
1618
from botocore import client
1719

1820
from . import authenticator, helpers, prepare, role_chooser
@@ -90,6 +92,11 @@
9092
is_flag=True,
9193
help='Output commands to set AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN, AWS_DEFAULT_REGION environmental variables instead of saving them to the aws configuration file.',
9294
)
95+
@click.option(
96+
'--print-console-signin-url',
97+
is_flag=True,
98+
help='Output a URL that lets users who sign in to your organization\'s network securely access the AWS Management Console.',
99+
)
93100
@click.option(
94101
'--role-arn',
95102
help='Predefined role arn to selects, e.g. aws-adfs login --role-arn arn:aws:iam::123456789012:role/YourSpecialRole',
@@ -133,6 +140,7 @@ def login(
133140
authfile,
134141
stdout,
135142
printenv,
143+
print_console_signin_url,
136144
role_arn,
137145
session_duration,
138146
no_session_cache,
@@ -259,7 +267,9 @@ def login(
259267
_emit_json(aws_session_token)
260268
elif printenv:
261269
_emit_summary(config, aws_session_duration)
262-
_print_environment_variables(aws_session_token,config)
270+
_print_environment_variables(aws_session_token, config)
271+
elif print_console_signin_url:
272+
_print_console_signin_url(aws_session_token, adfs_host)
263273
else:
264274
_store(config, aws_session_token)
265275
_emit_summary(config, aws_session_duration)
@@ -275,7 +285,7 @@ def _emit_json(aws_session_token):
275285
}))
276286

277287

278-
def _print_environment_variables(aws_session_token,config):
288+
def _print_environment_variables(aws_session_token, config):
279289
envcommand = "export"
280290
if(sys.platform=="win32"):
281291
envcommand="set"
@@ -287,8 +297,41 @@ def _print_environment_variables(aws_session_token,config):
287297
click.echo(
288298
u"""{} AWS_SESSION_TOKEN={}""".format(envcommand,aws_session_token['Credentials']['SessionToken']))
289299
click.echo(
290-
u"""{} AWS_DEFAULT_REGION={}""".format(envcommand,config.region))
291-
300+
u"""{} AWS_DEFAULT_REGION={}""".format(envcommand, config.region))
301+
302+
303+
def _print_console_signin_url(aws_session_token, adfs_host):
304+
# The steps below come from https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html
305+
306+
# Step 3: Format resulting temporary credentials into JSON
307+
url_credentials = {}
308+
url_credentials['sessionId'] = aws_session_token['Credentials']['AccessKeyId']
309+
url_credentials['sessionKey'] = aws_session_token['Credentials']['SecretAccessKey']
310+
url_credentials['sessionToken'] = aws_session_token['Credentials']['SessionToken']
311+
json_string_with_temp_credentials = json.dumps(url_credentials)
312+
313+
# Step 4. Make request to AWS federation endpoint to get sign-in token. Construct the parameter string with
314+
# the sign-in action request, a 12-hour session duration, and the JSON document with temporary credentials
315+
# as parameters.
316+
request_parameters = "?Action=getSigninToken"
317+
request_parameters += "&SessionDuration=43200"
318+
request_parameters += "&Session=" + urllib.parse.quote_plus(json_string_with_temp_credentials)
319+
request_url = "https://signin.aws.amazon.com/federation" + request_parameters
320+
r = requests.get(request_url)
321+
# Returns a JSON document with a single element named SigninToken.
322+
signin_token = json.loads(r.text)
323+
324+
# Step 5: Create URL where users can use the sign-in token to sign in to
325+
# the console. This URL must be used within 15 minutes after the
326+
# sign-in token was issued.
327+
request_parameters = "?Action=login"
328+
request_parameters += "&Issuer=" + urllib.parse.quote_plus("https://" + adfs_host + "/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=urn:amazon:webservices")
329+
request_parameters += "&Destination=" + urllib.parse.quote_plus("https://console.aws.amazon.com/")
330+
request_parameters += "&SigninToken=" + signin_token["SigninToken"]
331+
request_url = "https://signin.aws.amazon.com/federation" + request_parameters
332+
333+
# Send final URL to stdout
334+
click.echo("""\nAWS web console signin URL:\n\n{}""".format(request_url))
292335

293336
def _emit_summary(config, session_duration):
294337
click.echo(

0 commit comments

Comments
 (0)