You need to enable JavaScript to run this app.
导航
控制台内嵌
最近更新时间:2024.07.02 10:17:39首次发布时间:2022.11.25 21:31:15

日志服务提供控制台内嵌功能,即支持将检索分析页面、仪表盘页面嵌入到外部系统的自建 Web 页面中,您可以在外部系统中免密登录日志服务控制台的部分页面并进行相关操作。本文介绍将日志服务控制台嵌入到外部系统的操作步骤。

背景信息

控制台内嵌功能通过安全令牌服务 STS 实现用户的自定义身份代理,您可以授予 IAM 用户相关数据和页面的访问权限,以此身份通过 STS 服务创建临时访问凭证,并获取临时登录 Token。您访问内嵌的日志服务控制台页面时,通过 URL 中封装的临时登录 Token 进行鉴权,访问过程无需使用 IAM 用户账密,且登录无感知。涉及的鉴权流程如下:
图片

操作步骤

1 获取临时安全令牌

登录自建的外部系统时,您需要通过外部系统的服务端访问火山引擎令牌服务(STS),获取 STS 下发的临时安全令牌。访问 STS 服务时,您需要创建一个 RAM 角色并指定 IAM 角色在被扮演时所拥有的日志服务资源访问权限,还需要创建一个 IAM 用户扮演指定的 IAM 角色,并以 IAM 用户身份发送 AssumeRole 请求,获取临时安全令牌。该临时安全令牌可用于访问该 IAM 角色权限范围内的日志服务资源。详细说明请参考通过 STS 访问日志服务
创建 IAM 角色、授权及获取临时安全令牌的操作流程如下。具体操作,请参考通过 STS 访问日志服务

  1. 创建 IAM 角色。
  2. 为 IAM 角色授予日志服务权限。
    在内嵌日志服务控制台页面的场景下,您可以为 IAM 角色授予系统默认权限 TLSReadOnlyAccess,表示该角色具备所有日志服务资源和页面的查看权限。您也可以根据日志服务可授权的操作与资源列表,创建自定义的授权策略。详细说明请参考可授权的操作可授权的资源
  3. 创建 IAM 用户。
  4. 为 IAM 用户授予扮演 IAM 角色的权限和调用 AssumeRole 的权限。
    1. 为 IAM 角色设置信任策略,即允许指定的 IAM 用户扮演该角色。
    2. 为 IAM 用户授予 STSAssumeRoleAccess 权限。
  5. 调用 AssumeRole 接口获取临时安全令牌。

    说明

    AssumeRole 接口的请求参数 DurationSeconds 用于指定临时安全令牌的有效期,过期之后需要重新调用此接口获取新的临时安全令牌,并以此请求获取登录 Token。

2 获取登录 Token

登录 Token(SigninToken)是 STS 服务提供的临时访问 Token,外部系统的服务端需要通过登录 Token 构建日志服务免密访问链接。
调用 STS 的接口 getSigninTokenWithSTS 获取登录 Token。在请求中需要指定临时 AK、SK 和 sessionToken,均为步骤 1 中获取的临时安全令牌。

说明

  • 登录 Token 的有效期默认为 15 分钟且不可更改,请在 Token 到期前完成访问链接的构建与鉴权登录,到期后需要重新请求 getSigninTokenWithSTS 获取新的登录 Token。
  • 通过登录 Token 完成一次登录后,登录 Token 随即失效,如果您刷新页面,则需要重新请求获取登录 Token。

请求示例:

https://console.volc-embed.com/api/passport/login/getSigninTokenWithSTS
                    &accessKeyId=<通过AssumeRole获取的临时AK>
                    &secretAccessKey=<通过AssumeRole获取的临时Secret>
                    &sessionToken=<通过AssumeRole获取的临时Token>
                    &sessionDuration=<登录态的持续时长,超期后需要重新登录。单位为秒,取值为 900~43200。>

3 构建免密访问链接

日志服务控制台的免密访问链接格式如下所示。

https://console.volc-embed.com/api/passport/login/loginWithSigninToken?signinToken=${signinToken}&redirectURI=${target_console_url}

链接中的参数说明如下表所示。

参数

说明

signinToken

步骤 2 中获取的登录 Token。

redirectURI

支持内嵌的日志服务页面访问链接。目前,支持内嵌日志服务的检索分析页面和仪表盘页面。

说明

  • 在使用如下 redirectURI 链接前,需先使用 encodeURL 转码链接。即您需要先根据实际值替换链接中的${regionId}${projectId}${dashboardId},再通过 encodeURL 转码链接。
  • 日志服务支持通过各种 UI 参数与第三方自建 Web 页面进行融合展示,详细说明请参考设置控制台内嵌参数
  • 检索分析页面

    https://console.volc-embed.com/tls/region:tls+${regionId}/project/${projectId}/search?
    
  • 仪表盘页面

    https://console.volc-embed.com/tls/region:tls+${regionId}/project/${projectId}/dashboard/${dashboardId}
    

4 在外部系统中嵌套页面

以 iFrame 方式将日志服务控制台嵌入到第三方自建 Web 页面中。您可以参考以下示例,在外部系统中嵌入日志服务控制台页面。其中 src 的值应指定为步骤 3 中构建的免密访问链接。

说明

为避免因浏览器兼容性导致访问失败,推荐使用 Chrome 浏览器访问该页面。

<body>   
    <iframe src="target_url" width="1200" height="800" id="tlsIframePage"></iframe> 
</body>

常见问题

如何设置内嵌页面的登录态时长

通过第三方系统的 Web 页面免密登录日志服务控制台页面之后,登录状态会维持一段时间,超期之后应用服务端需要重新获取并刷新 Token,以便用户侧重新登录。
内嵌页面的登录态时长由 getSigninTokenWithSTS 接口参数 sessionDuration 指定。调用接口 getSigninTokenWithSTS 时,通过请求参数 sessionDuration 设置内嵌页面的登录态时长。sessionDuration 单位为秒,取值范围为 900~43200。
内嵌页面的登录态时长(sessionDuration)默认维持 AssumeRole 接口的 DurationSeconds 参数设置,而 DurationSeconds 默认为 1 小时。即默认情况下,AssumeRole 接口返回的 ExpiredTime 是既是临时安全令牌的有效期截止时间,也是登录状态的结束时间。

示例代码

Node.js

const {Service} = require('@volcengine/openapi');
const axios= require("axios");

class StsService extends Service {
    constructor(props) {
        super({
            ...props,
            defaultVersion: "2018-01-01",
            serviceName: "sts",
        });
    }
}

async function main() {
    const  stsService = new StsService()
    stsService.setAccessKeyId('xxx');
    stsService.setSecretKey('yy')
    stsService.setHost('sts.volcengineapi.com')

    // 调用 assumeRole 获取临时安全令牌。
    const assumeRole = stsService.createAPI('AssumeRole', {
        method: 'GET',
    });

    const  token = await assumeRole({
        RoleTrn: 'trn:iam::${accountId}:role/${角色名}',
        RoleSessionName: 'tlsiframe'
    })

    const { AccessKeyId, SecretAccessKey, SessionToken } = token.Result.Credentials;


    // 根据临时安全令牌获取登录 token。
    const  signinResp = await axios.post('https://console.volc-embed.com/api/passport/login/getSigninTokenWithSTS', {
        "accessKeyId": AccessKeyId,
        "secretAccessKey": SecretAccessKey,
        "sessionToken": SessionToken
    })

    const  signinToken = signinResp.data.Result.SigninToken;

    // 根据登录 signinToken 生成免登录连接。
    const url = `https://console.volc-embed.com/api/passport/login/loginWithSigninToken?signinToken=${signinToken}&redirectURI=${encodeURIComponent('https://console.volc-embed.com/tls/region:tls+cn-beijing/project/${projectId}/search')}`
    console.log(url)
}
main();

Python

# coding=utf-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import json
import requests

from urllib.parse import quote
from volcengine.sts.StsService import StsService


if __name__ == "__main__":
    # 初始化客户端,推荐通过环境变量动态获取火山引擎密钥等身份认证信息,以免 AccessKey 硬编码引发数据安全风险。详细说明请参考 https://www.volcengine.com/docs/6470/1166455。
    access_key_id = os.environ["VOLCENGINE_ACCESS_KEY_ID"]
    access_key_secret = os.environ["VOLCENGINE_ACCESS_KEY_SECRET"]

    sts_service = StsService()
    sts_service.set_ak(access_key_id)
    sts_service.set_sk(access_key_secret)

    role_trn = "trn:iam::yourAccountID:role/yourRole"
    role_session_name = "tlsiframe"
    target_console_url = "https://console.volc-embed.com/tls/region:tls+cn-beijing"

    # 调用 AssumeRole 接口获取临时安全令牌。
    assume_role_params = {
        "DurationSeconds": "900",
        "RoleSessionName": role_session_name,
        "RoleTrn": role_trn
    }
    assume_role_resp = sts_service.assume_role(assume_role_params)

    assume_rule_ak = assume_role_resp["Result"]["Credentials"]["AccessKeyId"]
    assume_role_sk = assume_role_resp["Result"]["Credentials"]["SecretAccessKey"]
    session_token = assume_role_resp["Result"]["Credentials"]["SessionToken"]

    # 获取登录 Token。
    url_str = "https://console.volc-embed.com/api/passport/login/getSigninTokenWithSTS"
    url_str = url_str + "?accessKeyId=" + quote(assume_rule_ak)
    url_str = url_str + "&secretAccessKey=" + quote(assume_role_sk)
    url_str = url_str + "&sessionToken=" + quote(session_token)
    url_str = url_str + "&sessionDuration=3600"

    get_signin_token_with_sts_resp = json.loads(requests.post(url_str).content)
    signin_token = get_signin_token_with_sts_resp["Result"]["SigninToken"]

    # 构建免密访问链接。
    result = "https://console.volc-embed.com/api/passport/login/loginWithSigninToken"
    result = result + "?signinToken=" + quote(signin_token)
    result = result + '&redirectURI=' + quote(target_console_url)

    print(result)

Go

tls_sts_demo.go
2.13KB