步骤 2:获取附带身份验证代码的 URL - Amazon QuickSight

步骤 2:获取附带身份验证代码的 URL

重要

Amazon QuickSight 推出了用于嵌入分析的新 API:GenerateEmbedUrlForAnonymousUserGenerateEmbedUrlForRegisteredUser

您仍然可以使用 GetDashboardEmbedUrlGetSessionEmbedUrl API 来嵌入控制面板和 QuickSight 控制台,但其不包含最新的嵌入功能。有关最新的嵌入体验,请参阅 将 QuickSight 分析嵌入到您的应用程序中

在下节中,您可以了解如何对用户进行身份验证,并获取应用程序服务器上的可嵌入控制台会话 URL。

用户访问您的应用程序时,该应用程序代表用户代入 IAM 角色。然后,其会将用户添加到 QuickSight 中(如果该用户尚不存在)。接下来,其会将标识符作为唯一角色会话 ID 进行传递。

执行上述步骤可确保在 QuickSight 中唯一地预置每个控制台会话查看者。它还实施每个用户的设置,例如,行级别安全性和参数的动态默认值。

以下示例展示了代表用户执行 IAM 身份验证。此代码在您的应用程序服务器上运行。

Java
import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.quicksight.AmazonQuickSight; import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder; import com.amazonaws.services.quicksight.model.GetSessionEmbedUrlRequest; import com.amazonaws.services.quicksight.model.GetSessionEmbedUrlResult; /** * Class to call QuickSight AWS SDK to get url for session embedding. */ public class GetSessionEmbedUrlQSAuth { private final AmazonQuickSight quickSightClient; public GetSessionEmbedUrlQSAuth() { this.quickSightClient = AmazonQuickSightClientBuilder .standard() .withRegion(Regions.US_EAST_1.getName()) .withCredentials(new AWSCredentialsProvider() { @Override public AWSCredentials getCredentials() { // provide actual IAM access key and secret key here return new BasicAWSCredentials("access-key", "secret-key"); } @Override public void refresh() {} } ) .build(); } public String getQuicksightEmbedUrl( final String accountId, // YOUR AWS ACCOUNT ID final String userArn // REGISTERED USER ARN TO USE FOR EMBEDDING. REFER TO GETEMBEDURL SECTION IN DEV PORTAL TO FIND OUT HOW TO GET USER ARN FOR A QUICKSIGHT USER ) throws Exception { GetSessionEmbedUrlRequest getSessionEmbedUrlRequest = new GetSessionEmbedUrlRequest() .withAwsAccountId(accountId) .withEntryPoint("/start") .withUserArn(userArn); GetSessionEmbedUrlResult sessionEmbedUrl = quickSightClient.getSessionEmbedUrl(getSessionEmbedUrlRequest); return sessionEmbedUrl.getEmbedUrl(); } }
JavaScript
global.fetch = require('node-fetch'); const AWS = require('aws-sdk'); function getSessionEmbedURL( accountId, // YOUR AWS ACCOUNT ID userArn, // REGISTERED USER ARN TO USE FOR EMBEDDING. REFER TO GETEMBEDURL SECTION IN DEV PORTAL TO FIND OUT HOW TO GET USER ARN FOR A QUICKSIGHT USER getEmbedUrlCallback, // GETEMBEDURL SUCCESS CALLBACK METHOD errorCallback // GETEMBEDURL ERROR CALLBACK METHOD ) { const getSessionParams = { AwsAccountId: accountId, EntryPoint: "/start", UserArn: userArn, SessionLifetimeInMinutes: 600, }; const quicksightGetSession = new AWS.QuickSight({ region: process.env.AWS_REGION, }); quicksightGetSession.getSessionEmbedUrl(getSessionParams, function(err, data) { if (err) { console.log(err, err.stack); errorCallback(err); } else { const result = { "statusCode": 200, "headers": { "Access-Control-Allow-Origin": "*", // USE YOUR WEBSITE DOMAIN TO SECURE ACCESS TO GETEMBEDURL API "Access-Control-Allow-Headers": "Content-Type" }, "body": JSON.stringify(data), "isBase64Encoded": false } getEmbedUrlCallback(result); } }); }
Python3
import json import boto3 from botocore.exceptions import ClientError import time # Create QuickSight and STS clients qs = boto3.client('quicksight',region_name='us-east-1') sts = boto3.client('sts') # Function to generate embedded URL # accountId: YOUR AWS ACCOUNT ID # userArn: REGISTERED USER ARN TO USE FOR EMBEDDING. REFER TO GETEMBEDURL SECTION IN DEV PORTAL TO FIND OUT HOW TO GET USER ARN FOR A QUICKSIGHT USER def getSessionEmbedURL(accountId, userArn): try: response = qs.get_session_embed_url( AwsAccountId = accountId, EntryPoint = "/start", UserArn = userArn, SessionLifetimeInMinutes = 600 ) return { 'statusCode': 200, 'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"}, 'body': json.dumps(response), 'isBase64Encoded': bool('false') } except ClientError as e: print(e) return "Error generating embeddedURL: " + str(e)
Node.js

以下示例演示了可以在应用程序服务器上使用以获取嵌入式控制台会话 URL 的 JavaScript(Node.js)。您可以在网站或应用程序中使用该 URL 来显示控制台会话。

const AWS = require('aws-sdk'); const https = require('https'); var quicksight = new AWS.Service({ apiConfig: require('./quicksight-2018-04-01.min.json'), region: 'us-east-1', }); quicksight.GetSessionEmbedUrl({ 'AwsAccountId': '111122223333', 'EntryPoint': 'https://url-for-console-page-to-open', 'SessionLifetimeInMinutes': 600, 'UserArn': 'USER_ARN' }, function(err, data) { console.log('Errors: '); console.log(err); console.log('Response: '); console.log(data); });
//The URL returned is over 900 characters. For this example, we've shortened the string for //readability and added ellipsis to indicate that it's incomplete. { Status: 200, EmbedUrl: 'https://dashboards.example.com/embed/620bef10822743fab329fb3751187d2d… RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713' }
.NET/C#

以下示例演示了可以在应用程序服务器上使用以获取嵌入式控制台会话 URL 的 .NET/C# 代码。您可以在网站或应用程序中使用该 URL 来显示控制台。

var client = new AmazonQuickSightClient( AccessKey, SecretAccessKey, sessionToken, Amazon.RegionEndpoint.USEast1); try { Console.WriteLine( client.GetSessionEmbedUrlAsync(new GetSessionEmbedUrlRequest { 'AwsAccountId': '111122223333', 'EntryPoint': 'https://url-for-console-page-to-open', 'SessionLifetimeInMinutes': 600, 'UserArn': 'USER_ARN' AwsAccountId = 111122223333, EntryPoint = https://url-for-console-page-to-open, SessionLifetimeInMinutes = 600, UserArn = 'USER_ARN' }).Result.EmbedUrl ); } catch (Exception ex) { Console.WriteLine(ex.Message); }
AWS CLI

要担任该角色,请选择以下 AWS Security Token Service (AWS STS) API 操作之一:

  • AssumeRole – 在使用 IAM 身份代入角色时使用该操作。

  • AssumeRoleWithWebIdentity – 在使用 Web 身份提供者对用户进行身份验证时使用该操作。

  • AssumeRoleWithSaml – 在使用 SAML 对用户进行身份验证时使用此操作。

以下示例显示了用于设置 IAM 角色的 CLI 命令。该角色需要为 quicksight:GetSessionEmbedUrl 启用权限。如果您在用户首次打开 QuickSight 时采用即时方法添加用户,则该角色还需要为 quicksight:RegisterUser 启用权限。

aws sts assume-role \ --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \ --role-session-name john.doe@example.com

assume-role 操作返回三个输出参数:访问密钥、私有密钥和会话令牌。

注意

如果在调用 AssumeRole 操作时遇到 ExpiredToken 错误,可能是因为之前的 SESSION TOKEN 仍在环境变量中。通过设置以下变量可以解决这一问题:

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

以下示例说明了如何在 CLI 中设置这三个参数。如果您使用 Microsoft Windows 计算机,请使用 set 而不是 export

export AWS_ACCESS_KEY_ID = "access_key_from_assume_role" export AWS_SECRET_ACCESS_KEY = "secret_key_from_assume_role" export AWS_SESSION_TOKEN = "session_token_from_assume_role"

如果运行这些命令,则会将访问您的网站的用户的角色会话 ID 设置为 embedding_quicksight_console_session_role/john.doe@example.com。角色会话 ID 由 role-arn 中的角色名称和 role-session-name 值组成。每个用户使用唯一的角色会话 ID 可以确保为每个用户设置相应的权限。此外,它还能避免任何用户访问限制。节流是一项安全功能,可防止同一用户从多个位置访问 QuickSight。

角色会话 ID 还会在 QuickSight 中变为用户名。您可以使用该模式在 QuickSight 中提前预置用户,或者在用户首次访问控制台会话时进行预置。

以下示例显示了可用于预置用户的 CLI 命令。有关 RegisterUserDescribeUser 和其他 QuickSight API 操作的更多信息,请参阅 QuickSight API reference

aws quicksight register-user \ --aws-account-id 111122223333 \ --namespace default \ --identity-type IAM \ --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \ --user-role READER \ --user-name jhnd \ --session-name "john.doe@example.com" \ --email john.doe@example.com \ --region us-east-1 \ --custom-permissions-name TeamA1

如果用户通过 Microsoft AD 进行身份验证,则无需使用 RegisterUser 进行设置。他们应在首次访问 QuickSight 时自动订阅。对于 Microsoft AD 用户,您可以使用 DescribeUser 获取用户 ARN。

用户首次访问 QuickSight 时,您也可以将该用户添加到相应的组中。以下示例显示了将用户添加到组的 CLI 命令。

aws quicksight create-group-membership \ --aws-account-id=111122223333 \ --namespace=default \ --group-name=financeusers \ --member-name="embedding_quicksight_dashboard_role/john.doe@example.com"

您的应用程序现在有一个用户,该用户也是 QuickSight 用户,且有权访问 QuickSight 控制台会话。

最后,要获取控制台会话的签名 URL,请从应用程序服务器中调用 get-session-embed-url。此操作会返回可嵌入控制台会话 URL。以下示例演示了如何使用服务器端调用为通过 AWS Managed Microsoft AD 或单点登录(IAM Identity Center)进行身份验证的用户获取嵌入式控制台会话的 URL。

aws quicksight get-dashboard-embed-url \ --aws-account-id 111122223333 \ --entry-point the-url-for--the-console-session \ --session-lifetime-in-minutes 600 \ --user-arn arn:aws:quicksight:us-east-1:111122223333:user/default/embedding_quicksight_dashboard_role/embeddingsession

有关使用该操作的更多信息,请参阅 GetSessionEmbedUrl。您可以在自己的代码中使用该 API 操作和其他操作。