日志服务提供控制台内嵌功能,即支持将检索分析页面、仪表盘页面嵌入到外部系统的自建 Web 页面中,您可以在外部系统中免密登录日志服务控制台的部分页面并进行相关操作。本文介绍将日志服务控制台嵌入到外部系统的操作步骤。
控制台内嵌功能通过安全令牌服务 STS 实现用户的自定义身份代理,您可以授予 IAM 用户相关数据和页面的访问权限,以此身份通过 STS 服务创建临时访问凭证,并获取临时登录 Token。您访问内嵌的日志服务控制台页面时,通过 URL 中封装的临时登录 Token 进行鉴权,访问过程无需使用 IAM 用户账密,且登录无感知。涉及的鉴权流程如下:
登录自建的外部系统时,您需要通过外部系统的服务端访问火山引擎令牌服务(STS),获取 STS 下发的临时安全令牌。访问 STS 服务时,您需要创建一个 RAM 角色并指定 IAM 角色在被扮演时所拥有的日志服务资源访问权限,还需要创建一个 IAM 用户扮演指定的 IAM 角色,并以 IAM 用户身份发送 AssumeRole 请求,获取临时安全令牌。该临时安全令牌可用于访问该 IAM 角色权限范围内的日志服务资源。详细说明请参考通过 STS 访问日志服务。
创建 IAM 角色、授权及获取临时安全令牌的操作流程如下。具体操作,请参考通过 STS 访问日志服务。
TLSReadOnlyAccess
,表示该角色具备所有日志服务资源和页面的查看权限。您也可以根据日志服务可授权的操作与资源列表,创建自定义的授权策略。详细说明请参考可授权的操作与可授权的资源。STSAssumeRoleAccess
权限。说明
AssumeRole 接口的请求参数 DurationSeconds 用于指定临时安全令牌的有效期,过期之后需要重新调用此接口获取新的临时安全令牌,并以此请求获取登录 Token。
登录 Token(SigninToken)是 STS 服务提供的临时访问 Token,外部系统的服务端需要通过登录 Token 构建日志服务免密访问链接。
调用 STS 的接口 getSigninTokenWithSTS 获取登录 Token。在请求中需要指定临时 AK、SK 和 sessionToken,均为步骤 1 中获取的临时安全令牌。
说明
请求示例:
https://console.volc-embed.com/api/passport/login/getSigninTokenWithSTS &accessKeyId=<通过AssumeRole获取的临时AK> &secretAccessKey=<通过AssumeRole获取的临时Secret> &sessionToken=<通过AssumeRole获取的临时Token> &sessionDuration=<登录态的持续时长,超期后需要重新登录。单位为秒,取值为 900~43200。>
日志服务控制台的免密访问链接格式如下所示。
https://console.volc-embed.com/api/passport/login/loginWithSigninToken?signinToken=${signinToken}&redirectURI=${target_console_url}
链接中的参数说明如下表所示。
参数 | 说明 |
---|---|
signinToken | 步骤 2 中获取的登录 Token。 |
redirectURI | 支持内嵌的日志服务页面访问链接。目前,支持内嵌日志服务的检索分析页面和仪表盘页面。 说明
|
以 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 是既是临时安全令牌的有效期截止时间,也是登录状态的结束时间。
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();
# 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)