You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将QuickSight仪表盘集成到React+NestJS应用(Cognito认证)

解决QuickSight集成React+NestJS(Cognito免重复登录)问题

核心思路

通过后端(NestJS)调用AWS QuickSight API生成带身份认证的嵌入URL,直接复用Cognito用户的身份,避免单独登录QuickSight。

前提准备

  • Cognito用户池已与QuickSight关联,且目标用户/组拥有指定仪表盘的访问权限(可在QuickSight控制台配置)
  • NestJS服务的IAM角色需具备quicksight:GetDashboardEmbedUrl权限

后端(NestJS)实现

  1. 安装依赖

    npm install @aws-sdk/client-quicksight @aws-sdk/credential-provider-node
    
  2. 编写QuickSight服务
    创建服务类生成嵌入URL,传入Cognito用户ID关联身份:

    import { Injectable } from '@nestjs/common';
    import { QuickSightClient, GetDashboardEmbedUrlCommand } from '@aws-sdk/client-quicksight';
    
    @Injectable()
    export class QuicksightService {
      private readonly client: QuickSightClient;
    
      constructor() {
        this.client = new QuickSightClient({
          region: '你的AWS区域',
          credentials: {
            accessKeyId: process.env.AWS_ACCESS_KEY_ID,
            secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
          },
        });
      }
    
      async generateEmbedUrl(dashboardId: string, cognitoUserId: string): Promise<string> {
        const command = new GetDashboardEmbedUrlCommand({
          AwsAccountId: '你的AWS账号ID',
          DashboardId: dashboardId,
          IdentityType: 'IAM',
          SessionLifetimeInMinutes: 60,
          UserArn: `arn:aws:cognito-idp:你的区域:你的账号ID:userpool/你的用户池ID/${cognitoUserId}`,
          EmbedType: 'VIEWER', // 限制为查看权限,按需改为'INTERACTIVE'
        });
    
        const { EmbedUrl } = await this.client.send(command);
        return EmbedUrl;
      }
    }
    
  3. 暴露API接口
    新增接口供前端调用,需从请求中获取当前Cognito用户的ID(通过认证中间件解析token获取):

    import { Controller, Get, Param, Request, UseGuards } from '@nestjs/common';
    import { AuthGuard } from './auth/auth.guard'; // 你的Cognito认证守卫
    import { QuicksightService } from './quicksight.service';
    
    @Controller('quicksight')
    @UseGuards(AuthGuard)
    export class QuicksightController {
      constructor(private readonly service: QuicksightService) {}
    
      @Get('embed/:dashboardId')
      async getEmbedUrl(@Param('dashboardId') id: string, @Request() req) {
        const cognitoUserId = req.user.sub; // 从认证后的请求中取用户ID
        return this.service.generateEmbedUrl(id, cognitoUserId);
      }
    }
    

前端(React)实现

  1. 安装嵌入SDK

    npm install amazon-quicksight-embedding-sdk
    
  2. 编写嵌入组件
    调用后端接口获取嵌入URL,加载仪表盘:

    import React, { useEffect, useRef } from 'react';
    import { embedDashboard } from 'amazon-quicksight-embedding-sdk';
    
    export default function QuicksightEmbed({ dashboardId }) {
      const containerRef = useRef(null);
      let embedInstance = null;
    
      useEffect(() => {
        const loadDashboard = async () => {
          if (!containerRef.current) return;
    
          try {
            // 调用后端接口,携带Cognito的idToken做认证
            const res = await fetch(`/api/quicksight/embed/${dashboardId}`, {
              headers: {
                Authorization: `Bearer ${localStorage.getItem('cognitoIdToken')}`,
              },
            });
            const embedUrl = await res.text();
    
            embedInstance = embedDashboard({
              url: embedUrl,
              container: containerRef.current,
              width: '100%',
              height: '700px',
              scrolling: 'no',
            });
          } catch (err) {
            console.error('加载仪表盘失败:', err);
          }
        };
    
        loadDashboard();
    
        return () => embedInstance?.close();
      }, [dashboardId]);
    
      return <div ref={containerRef}></div>;
    }
    

权限排查要点

  • IAM角色:确保NestJS的IAM角色有quicksight:GetDashboardEmbedUrl权限,且信任策略允许服务调用
  • QuickSight权限:在QuickSight控制台的「仪表盘权限」中,添加Cognito用户池对应的IAM角色或用户
  • Cognito映射:若使用Cognito身份池,需配置身份池的角色映射,让认证用户获得访问QuickSight的临时权限

常见问题解决

  • 连接被拒绝:检查UserArn格式是否正确,后端IAM权限是否齐全,QuickSight是否授权了对应身份
  • 仍弹出登录框:确认IdentityType设为IAM,嵌入URL是后端生成的临时链接,而非QuickSight公开链接

内容的提问来源于stack exchange,提问作者Buddhika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:38:12