步骤 2:获取附带身份验证代码的 URL
重要
Amazon QuickSight 推出了用于嵌入分析的新 API:GenerateEmbedUrlForAnonymousUser
和 GenerateEmbedUrlForRegisteredUser
。
您仍然可以使用 GetDashboardEmbedUrl
和 GetSessionEmbedUrl
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-namejohn.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 命令。有关 RegisterUser、DescribeUser 和其他 QuickSight API 操作的更多信息,请参阅 QuickSight API reference。
aws quicksight register-user \ --aws-account-id
111122223333
\ --namespacedefault
\ --identity-typeIAM
\ --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role
" \ --user-roleREADER
\ --user-namejhnd
\ --session-name "john.doe@example.com
" \ --emailjohn.doe@example.com
\ --regionus-east-1
\ --custom-permissions-nameTeamA1
如果用户通过 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-pointthe-url-for--the-console-session
\ --session-lifetime-in-minutes600
\ --user-arn arn:aws:quicksight:us-east-1
:111122223333
:user/default/embedding_quicksight_dashboard_role
/embeddingsession有关使用该操作的更多信息,请参阅 GetSessionEmbedUrl。您可以在自己的代码中使用该 API 操作和其他操作。
-