使自訂身分經紀人存取 AWS 主控台 - AWS Identity and Access Management

使自訂身分經紀人存取 AWS 主控台

您可以運用編寫和執行程式碼來建立 URL 以使登入到您組織網路的使用者能夠安全存取 AWS Management Console。該 URL 包含您從 AWS 獲得的登入權杖,而權杖則用於對存取 AWS 使用者進行身分驗證。

注意

如果您的組織使用與 SAML 相容的身分提供者 (IdP),則無需編寫程式碼即可設定對主控台的存取許可。這適用於 Microsoft 的 Active Directory 聯合身分驗證服務或開放原始碼 Shibboleth 等提供者。如需詳細資訊,請參閱使 SAML 2.0 聯合身分使用者能夠存取 AWS Management Console

若要使組織中的使用者能夠存取 AWS Management Console,您可以建立負責執行以下步驟的自訂身分代理

  1. 確認您的本機身分系統已對使用者進行身分驗證。

  2. 呼叫 AWS Security Token Service (AWS STS) AssumeRole (建議) 或 GetFederationToken API 操作,以為使用者取得暫時安全憑證。要了解在擔任角色時使用的各種方法,請參閱 使用 IAM 角色。若要了解如何在取得您安全憑證時傳遞選用工作階段標籤,請參閱 在 AWS STS 中傳遞工作階段標籤

    • 如果使用某個 AssumeRole* API 操作取得角色的臨時安全性憑證,您可以在呼叫中包含 DurationSeconds 參數。此參數指定 900 秒 (15 分鐘) 到角色的最大工作階段持續時間設定之間的角色工作階段持續時間。當您在 AssumeRole* 操作中使用 DurationSeconds 時,您必須稱之為具有長期憑證的 IAM 使用者。否則,在步驟 3 中對聯合端點的呼叫將失敗。如要了解如何查看或更改角色的最大值,請參閱 查看角色的最大工作階段持續時間設定

    • 如果使用某個 GetFederationToken API 操作取得憑證,您可以在呼叫中包含 DurationSeconds 參數。此參數指定您的角色工作階段的持續時間。該值的範圍是 900 秒 (15 分鐘) 到 129,600 秒 (36 小時)。您只能使用 IAM 使用者的長期 AWS 安全憑證進行該 API 呼叫。您還可以使用 AWS 帳戶 根使用者憑證來進行這些呼叫,但我們不建議使用這種方法。如果您以根使用者身分執行呼叫,則工作階段預設將持續 1 小時。或者,您可以指定 900 秒 (15 分鐘) 到 3,600 秒 (1 小時) 之間的工作階段。

  3. 呼叫 AWS 聯合端點並提供臨時安全性憑證來請求登入權杖。

  4. 建構包含該權杖的主控台 URL:

    • 如果在 URL 中使用某個 AssumeRole* API 操作,您可以包含 SessionDuration HTTP 參數。此參數指定主控台工作階段持續時間,範圍是 900 秒 (15 分鐘) 到 43200 秒 (12 小時)。

    • 如果在 URL 中使用 GetFederationToken API 操作,您可以包含 DurationSeconds 參數。此參數指定您的聯合身分主控台工作階段的持續時間。該值的範圍是 900 秒 (15 分鐘) 到 129,600 秒 (36 小時)。

      注意

      如果使用 SessionDuration 取得臨時憑證,請不要使用 GetFederationToken HTTP 參數。這會導致操作失敗。

  5. 將 URL 分配給使用者或代表使用者呼叫 URL。

聯合端點提供的 URL 在建立後的 15 分鐘內有效。這與 URL 關聯的臨時安全性憑證工作階段的持續時間 (以秒為單位) 不同。這些憑證在建立時指定的持續時間內有效,從建立的時間算起。

重要

如果您在相關聯暫時安全憑證中啟用許可,則該 URL 會透過 AWS授予存取您的 AWS Management Console 資源。因此,您應該將 URL 視為機密。我們建議您透過安全的重新引導傳回 URL,例如,在 SSL 連接上使用 302 HTTP 回應狀態碼。如需有關 302 HTTP 回應狀態碼的詳細資訊,請參閱 RFC 2616, section 10.3.3

要檢閱如何實現單一登入解決方案的範例應用程式,請參閱《AWS 範本程式碼與程式庫》中的 AWS Management Console 聯合身分代理範例使用案例

若要完成這些任務,您可以使用適用於 AWS Identity and Access Management (IAM) 的 HTTPS Query APIAWS Security Token Service (AWS STS)。或者,您可以使用程式設計語言 (例如 Java、Ruby 或 C#) 與適當的 AWS 開發套件。兩種方法皆詳述於下節。

您可以建構一個 URL,此 URL 向您的聯合身分使用者授予對 AWS Management Console 的直接存取許可。此任務使用 IAM 和 AWS STS HTTPS Query API。如需有關提出查詢請求的詳細資訊,請參閱提出查詢請求

注意

以下過程包括了文字字串的範例。為增加可讀性,一些較長的範例中加入了分行符號。如果您要建立並使用這些字串,必須省略所有分行符號。

向聯合身分使用者授予從 AWS Management Console 存取您的資源的許可

  1. 在您的身分驗證系統裡驗證該使用者。

  2. 為使用者取得臨時安全性憑證。臨時憑證由存取金鑰 ID、私密存取金鑰和工作階段字符組成。如需有關建立暫時性憑證檔案的詳細資訊,請參閱 IAM 中的暫時安全憑證

    若要取得暫時憑證,您可以呼叫 AWS STS AssumeRole API (建議) 或 GetFederationToken API。如需有關這些 API 操作之差異的詳細資訊,請參閱 AWS 安全性部落格中的了解安全地委派 AWS 帳戶存取權的 API 選項

    重要

    在使用 GetFederationToken API 建立暫時安全憑證時,您必須指定這些憑證授予擔任角色之使用者的許可。對於任何以 AssumeRole* 開頭的 API 操作,可使用 IAM 角色來分配許可。對於其他 API 操作,機制會因 API 而異。如需詳細資訊,請參閱 控制臨時安全安全憑證的許可。此外,如果使用 AssumeRole* API 操作,您還必須以具有長期憑證的 IAM 使用者身分來呼叫這些操作。否則,在步驟 3 中對聯合端點的呼叫將失敗。

  3. 在取得臨時安全性憑證後,將其建構到 JSON 工作階段字串以將其交換為登入權杖。以下範例顯示如何為憑證編碼。請將預留位置文字替換為上一步驟中接收的憑證中的適用值。

    {"sessionId":"*** temporary access key ID ***", "sessionKey":"*** temporary secret access key ***", "sessionToken":"*** session token ***"}
  4. URL 編碼前一步驟中的工作階段字串。由於您編碼的資訊是敏感資訊,因此建議您避免對此編碼使用 Web 服務。請改用開發套件中在本機安裝的函數或功能來安全地編碼這些資訊。您可以使用 Python 的 urllib.quote_plus 函數、Java 的 URLEncoder.encode 函數或 Ruby 的 CGI.escape 函數。請參閱本主題後述的範例。

  5. 注意

    AWS 在此處支援 POST 請求。

    將您的請求傳送到 AWS 聯合端點:

    https://region-code.signin.aws.amazon.com/federation

    對於可能的 region-code 值清單,請參閱 AWS 登入端點中的 Region (區域) 欄位。您可以選擇使用預設 AWS 登入聯合端點:

    https://signin.aws.amazon.com/federation

    該請求必須包含 ActionSession 參數;(選擇性) 如果已使用 AssumeRole* API 操作,還必須包含 SessionDuration HTTP 參數,如下列範例所示。

    Action = getSigninToken SessionDuration = time in seconds Session = *** the URL encoded JSON string created in steps 3 & 4 ***
    注意

    此步驟中的下列指示僅適用於 GET 請求。

    SessionDuration HTTP 參數指定主控台工作階段的持續時間。它不同於使用 DurationSeconds 參數指定的臨時憑證的持續時間。您可指定 SessionDuration 最高值為 43,200 (12 小時)。如果缺少 SessionDuration 參數,則工作階段預設為在步驟 2 中從 AWS STS 擷取之憑證的持續時間 (預設為 1 小時)。如需如何使用 DurationSeconds 參數指定持續時間的詳細資訊,請參閱 AssumeRole API 的文件。建立超過 1 小時的主控台工作階段的功能是聯合端點的 getSigninToken 操作所內建的特性。

    注意

    如果使用 SessionDuration 取得臨時憑證,請不要使用 GetFederationToken HTTP 參數。這會導致操作失敗。

    在啟用具有更長持續時間的主控台工作階段時,您會增加洩露憑證的風險。為了幫助緩解這種風險,您可以在 Role Summary (角色摘要) IAM 主控台頁面上選擇 Revoke Sessions (撤銷工作階段) 來立即停用所有角色的使用中的主控台工作階段。如需詳細資訊,請參閱 撤銷 IAM 角色暫時性安全憑證

    以下為請求具體形式的範例。在此處換行以便閱讀,但您應將其做為單行字串提交。

    https://signin.aws.amazon.com/federation ?Action=getSigninToken &SessionDuration=1800 &Session=%7B%22sessionId%22%3A+%22ASIAJUMHIZPTOKTBMK5A%22%2C+%22sessionKey%22 %3A+%22LSD7LWI%2FL%2FN%2BgYpan5QFz0XUpc8s7HYjRsgcsrsm%22%2C+%22sessionToken%2 2%3A+%22FQoDYXdzEBQaDLbj3VWv2u50NN%2F3yyLSASwYtWhPnGPMNmzZFfZsL0Qd3vtYHw5A5dW AjOsrkdPkghomIe3mJip5%2F0djDBbo7SmO%2FENDEiCdpsQKodTpleKA8xQq0CwFg6a69xdEBQT8 FipATnLbKoyS4b%2FebhnsTUjZZQWp0wXXqFF7gSm%2FMe2tXe0jzsdP0O12obez9lijPSdF1k2b5 PfGhiuyAR9aD5%2BubM0pY86fKex1qsytjvyTbZ9nXe6DvxVDcnCOhOGETJ7XFkSFdH0v%2FYR25C UAhJ3nXIkIbG7Ucv9cOEpCf%2Fg23ijRgILIBQ%3D%3D%22%7D

    來自聯合身分端點的回應是一個具有 SigninToken 值的 JSON 文件。看起來與下列範例類似。

    {"SigninToken":"*** the SigninToken string ***"}
  6. 注意

    AWS 在此處支援 POST 請求。

    最後,建立聯合身分使用者可用於存取 AWS Management Console 的 URL。此 URL 與您在 步驟 5 中使用的聯合身分 URL 端點相同,外加以下參數:

    ?Action = login &Issuer = *** the form-urlencoded URL for your internal sign-in page *** &Destination = *** the form-urlencoded URL to the desired AWS console page *** &SigninToken = *** the value of SigninToken received in the previous step ***
    注意

    此步驟中的下列指示僅適用於 GET API。

    以下範例顯示 URL 的最終形式。URL 的有效期為 15 分鐘,自建立時算起。在 URL 中嵌入的臨時安全性憑證和主控台工作階段的有效期為在最初請求它們時在 SessionDuration HTTP 參數中指定的持續時間。

    https://signin.aws.amazon.com/federation ?Action=login &Issuer=https%3A%2F%2Fexample.com &Destination=https%3A%2F%2Fconsole.aws.amazon.com%2F &SigninToken=VCQgs5qZZt3Q6fn8Tr5EXAMPLEmLnwB7JjUc-SHwnUUWabcRdnWsi4DBn-dvC CZ85wrD0nmldUcZEXAMPLE-vXYH4Q__mleuF_W2BE5HYexbe9y4Of-kje53SsjNNecATfjIzpW1 WibbnH6YcYRiBoffZBGExbEXAMPLE5aiKX4THWjQKC6gg6alHu6JFrnOJoK3dtP6I9a6hi6yPgm iOkPZMmNGmhsvVxetKzr8mx3pxhHbMEXAMPLETv1pij0rok3IyCR2YVcIjqwfWv32HU2Xlj471u 3fU6uOfUComeKiqTGX974xzJOZbdmX_t_lLrhEXAMPLEDDIisSnyHGw2xaZZqudm4mo2uTDk9Pv 9l5K0ZCqIgEXAMPLEcA6tgLPykEWGUyH6BdSC6166n4M4JkXIQgac7_7821YqixsNxZ6rsrpzwf nQoS14O7R0eJCCJ684EXAMPLEZRdBNnuLbUYpz2Iw3vIN0tQgOujwnwydPscM9F7foaEK3jwMkg Apeb1-6L_OB12MZhuFxx55555EXAMPLEhyETEd4ZulKPdXHkgl6T9ZkIlHz2Uy1RUTUhhUxNtSQ nWc5xkbBoEcXqpoSIeK7yhje9Vzhd61AEXAMPLElbWeouACEMG6-Vd3dAgFYd6i5FYoyFrZLWvm 0LSG7RyYKeYN5VIzUk3YWQpyjP0RiT5KUrsUi-NEXAMPLExMOMdoODBEgKQsk-iu2ozh6r8bxwC RNhujg

以下範例顯示如何使用 Python 以程式設計方式構建授予聯合身分使用者直接存取 AWS Management Console 權限的 URL。以下是兩個範例:

  • 透過 GET 請求聯合 AWS

  • 透過 POST 請求聯合AWS

兩個範例使用 AWS SDK for Python (Boto3)AssumeRole API 來取得暫時安全憑證。

使用 GET 請求

import urllib, json, sys import requests # 'pip install requests' import boto3 # AWS SDK for Python (Boto3) 'pip install boto3' # Step 1: Authenticate user in your own identity system. # Step 2: Using the access keys for an IAM user in your AWS account, # call "AssumeRole" to get temporary access keys for the federated user # Note: Calls to AWS STS AssumeRole must be signed using the access key ID # and secret access key of an IAM user or using existing temporary credentials. # The credentials can be in Amazon EC2 instance metadata, in environment variables, # or in a configuration file, and will be discovered automatically by the # client('sts') function. For more information, see the Python SDK docs: # http://boto3.readthedocs.io/en/latest/reference/services/sts.html # http://boto3.readthedocs.io/en/latest/reference/services/sts.html#STS.Client.assume_role sts_connection = boto3.client('sts') assumed_role_object = sts_connection.assume_role( RoleArn="arn:aws:iam::account-id:role/ROLE-NAME", RoleSessionName="AssumeRoleSession", ) # Step 3: Format resulting temporary credentials into JSON url_credentials = {} url_credentials['sessionId'] = assumed_role_object.get('Credentials').get('AccessKeyId') url_credentials['sessionKey'] = assumed_role_object.get('Credentials').get('SecretAccessKey') url_credentials['sessionToken'] = assumed_role_object.get('Credentials').get('SessionToken') json_string_with_temp_credentials = json.dumps(url_credentials) # Step 4. Make request to AWS federation endpoint to get sign-in token. Construct the parameter string with # the sign-in action request, a 12-hour session duration, and the JSON document with temporary credentials # as parameters. request_parameters = "?Action=getSigninToken" request_parameters += "&SessionDuration=43200" if sys.version_info[0] < 3: def quote_plus_function(s): return urllib.quote_plus(s) else: def quote_plus_function(s): return urllib.parse.quote_plus(s) request_parameters += "&Session=" + quote_plus_function(json_string_with_temp_credentials) request_url = "https://signin.aws.amazon.com/federation" + request_parameters r = requests.get(request_url) # Returns a JSON document with a single element named SigninToken. signin_token = json.loads(r.text) # Step 5: Create URL where users can use the sign-in token to sign in to # the console. This URL must be used within 15 minutes after the # sign-in token was issued. request_parameters = "?Action=login" request_parameters += "&Issuer=Example.org" request_parameters += "&Destination=" + quote_plus_function("https://console.aws.amazon.com/") request_parameters += "&SigninToken=" + signin_token["SigninToken"] request_url = "https://signin.aws.amazon.com/federation" + request_parameters # Send final URL to stdout print (request_url)

使用 POST 請求

import urllib, json, sys import requests # 'pip install requests' import boto3 # AWS SDK for Python (Boto3) 'pip install boto3' import os from selenium import webdriver # 'pip install selenium', 'brew install chromedriver' # Step 1: Authenticate user in your own identity system. # Step 2: Using the access keys for an IAM user in your AAWS 帳戶, # call "AssumeRole" to get temporary access keys for the federated user # Note: Calls to AWS STS AssumeRole must be signed using the access key ID # and secret access key of an IAM user or using existing temporary credentials. # The credentials can be in Amazon EC2 instance metadata, in environment variables, # or in a configuration file, and will be discovered automatically by the # client('sts') function. For more information, see the Python SDK docs: # http://boto3.readthedocs.io/en/latest/reference/services/sts.html # http://boto3.readthedocs.io/en/latest/reference/services/sts.html#STS.Client.assume_role if sys.version_info[0] < 3: def quote_plus_function(s): return urllib.quote_plus(s) else: def quote_plus_function(s): return urllib.parse.quote_plus(s) sts_connection = boto3.client('sts') assumed_role_object = sts_connection.assume_role( RoleArn="arn:aws:iam::account-id:role/ROLE-NAME", RoleSessionName="AssumeRoleDemoSession", ) # Step 3: Format resulting temporary credentials into JSON url_credentials = {} url_credentials['sessionId'] = assumed_role_object.get('Credentials').get('AccessKeyId') url_credentials['sessionKey'] = assumed_role_object.get('Credentials').get('SecretAccessKey') url_credentials['sessionToken'] = assumed_role_object.get('Credentials').get('SessionToken') json_string_with_temp_credentials = json.dumps(url_credentials) # Step 4. Make request to AWS federation endpoint to get sign-in token. Construct the parameter string with # the sign-in action request, a 12-hour session duration, and the JSON document with temporary credentials # as parameters. request_parameters = {} request_parameters['Action'] = 'getSigninToken' request_parameters['SessionDuration'] = '43200' request_parameters['Session'] = json_string_with_temp_credentials request_url = "https://signin.aws.amazon.com/federation" r = requests.post( request_url, data=request_parameters) # Returns a JSON document with a single element named SigninToken. signin_token = json.loads(r.text) # Step 5: Create a POST request where users can use the sign-in token to sign in to # the console. The POST request must be made within 15 minutes after the # sign-in token was issued. request_parameters = {} request_parameters['Action'] = 'login' request_parameters['Issuer']='Example.org' request_parameters['Destination'] = 'https://console.aws.amazon.com/' request_parameters['SigninToken'] =signin_token['SigninToken'] jsrequest = ''' var form = document.createElement('form'); form.method = 'POST'; form.action = '{request_url}'; request_parameters = {request_parameters} for (var param in request_parameters) {{ if (request_parameters.hasOwnProperty(param)) {{ const hiddenField = document.createElement('input'); hiddenField.type = 'hidden'; hiddenField.name = param; hiddenField.value = request_parameters[param]; form.appendChild(hiddenField); }} }} document.body.appendChild(form); form.submit(); '''.format(request_url=request_url, request_parameters=request_parameters) driver = webdriver.Chrome() driver.execute_script(jsrequest);

以下範例顯示如何使用 Java 以程式設計方式構建授予聯合身分使用者直接存取 AWS Management Console 權限的 URL。下列程式碼片段使用 AWS SDK for Java

import java.net.URLEncoder; import java.net.URL; import java.net.URLConnection; import java.io.BufferedReader; import java.io.InputStreamReader; // Available at http://www.json.org/java/index.html import org.json.JSONObject; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient; import com.amazonaws.services.securitytoken.model.Credentials; import com.amazonaws.services.securitytoken.model.GetFederationTokenRequest; import com.amazonaws.services.securitytoken.model.GetFederationTokenResult; /* Calls to AWS STS API operations must be signed using the access key ID and secret access key of an IAM user or using existing temporary credentials. The credentials should not be embedded in code. For this example, the code looks for the credentials in a standard configuration file. */ AWSCredentials credentials = new PropertiesCredentials( AwsConsoleApp.class.getResourceAsStream("AwsCredentials.properties")); AWSSecurityTokenServiceClient stsClient = new AWSSecurityTokenServiceClient(credentials); GetFederationTokenRequest getFederationTokenRequest = new GetFederationTokenRequest(); getFederationTokenRequest.setDurationSeconds(1800); getFederationTokenRequest.setName("UserName"); // A sample policy for accessing Amazon Simple Notification Service (Amazon SNS) in the console. String policy = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"sns:*\"," + "\"Effect\":\"Allow\",\"Resource\":\"*\"}]}"; getFederationTokenRequest.setPolicy(policy); GetFederationTokenResult federationTokenResult = stsClient.getFederationToken(getFederationTokenRequest); Credentials federatedCredentials = federationTokenResult.getCredentials(); // The issuer parameter specifies your internal sign-in // page, for example https://mysignin.internal.mycompany.com/. // The console parameter specifies the URL to the destination console of the // AWS Management Console. This example goes to Amazon SNS. // The signin parameter is the URL to send the request to. String issuerURL = "https://mysignin.internal.mycompany.com/"; String consoleURL = "https://console.aws.amazon.com/sns"; String signInURL = "https://signin.aws.amazon.com/federation"; // Create the sign-in token using temporary credentials, // including the access key ID, secret access key, and session token. String sessionJson = String.format( "{\"%1$s\":\"%2$s\",\"%3$s\":\"%4$s\",\"%5$s\":\"%6$s\"}", "sessionId", federatedCredentials.getAccessKeyId(), "sessionKey", federatedCredentials.getSecretAccessKey(), "sessionToken", federatedCredentials.getSessionToken()); // Construct the sign-in request with the request sign-in token action, a // 12-hour console session duration, and the JSON document with temporary // credentials as parameters. String getSigninTokenURL = signInURL + "?Action=getSigninToken" + "&DurationSeconds=43200" + "&SessionType=json&Session=" + URLEncoder.encode(sessionJson,"UTF-8"); URL url = new URL(getSigninTokenURL); // Send the request to the AWS federation endpoint to get the sign-in token URLConnection conn = url.openConnection (); BufferedReader bufferReader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String returnContent = bufferReader.readLine(); String signinToken = new JSONObject(returnContent).getString("SigninToken"); String signinTokenParameter = "&SigninToken=" + URLEncoder.encode(signinToken,"UTF-8"); // The issuer parameter is optional, but recommended. Use it to direct users // to your sign-in page when their session expires. String issuerParameter = "&Issuer=" + URLEncoder.encode(issuerURL, "UTF-8"); // Finally, present the completed URL for the AWS console session to the user String destinationParameter = "&Destination=" + URLEncoder.encode(consoleURL,"UTF-8"); String loginURL = signInURL + "?Action=login" + signinTokenParameter + issuerParameter + destinationParameter;

以下範例顯示如何使用 Ruby 以程式設計方式構建授予聯合身分使用者直接存取 AWS Management Console 權限的 URL。此程式碼片段使用 AWS SDK for Ruby

require 'rubygems' require 'json' require 'open-uri' require 'cgi' require 'aws-sdk' # Create a new STS instance # # Note: Calls to AWS STS API operations must be signed using an access key ID # and secret access key. The credentials can be in EC2 instance metadata # or in environment variables and will be automatically discovered by # the default credentials provider in the AWS Ruby SDK. sts = Aws::STS::Client.new() # The following call creates a temporary session that returns # temporary security credentials and a session token. # The policy grants permissions to work # in the AWS SNS console. session = sts.get_federation_token({ duration_seconds: 1800, name: "UserName", policy: "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"sns:*\",\"Resource\":\"*\"}}", }) # The issuer value is the URL where users are directed (such as # to your internal sign-in page) when their session expires. # # The console value specifies the URL to the destination console. # This example goes to the Amazon SNS console. # # The sign-in value is the URL of the AWS STS federation endpoint. issuer_url = "https://mysignin.internal.mycompany.com/" console_url = "https://console.aws.amazon.com/sns" signin_url = "https://signin.aws.amazon.com/federation" # Create a block of JSON that contains the temporary credentials # (including the access key ID, secret access key, and session token). session_json = { :sessionId => session.credentials[:access_key_id], :sessionKey => session.credentials[:secret_access_key], :sessionToken => session.credentials[:session_token] }.to_json # Call the federation endpoint, passing the parameters # created earlier and the session information as a JSON block. # The request returns a sign-in token that's valid for 15 minutes. # Signing in to the console with the token creates a session # that is valid for 12 hours. get_signin_token_url = signin_url + "?Action=getSigninToken" + "&SessionType=json&Session=" + CGI.escape(session_json) returned_content = URI.parse(get_signin_token_url).read # Extract the sign-in token from the information returned # by the federation endpoint. signin_token = JSON.parse(returned_content)['SigninToken'] signin_token_param = "&SigninToken=" + CGI.escape(signin_token) # Create the URL to give to the user, which includes the # sign-in token and the URL of the console to open. # The "issuer" parameter is optional but recommended. issuer_param = "&Issuer=" + CGI.escape(issuer_url) destination_param = "&Destination=" + CGI.escape(console_url) login_url = signin_url + "?Action=login" + signin_token_param + issuer_param + destination_param