全部产品
Search
文档中心

日志服务:控制台内嵌及分享

更新时间:Mar 13, 2024

日志服务支持将查询分析页面和仪表盘页面嵌入自建Web应用,方便您将查询分析和仪表盘页面免密共享给其他用户。

基本原理

登录服务signin.aliyun.com支持通过在URL中拼接登录Token,当用户访问免登录链接时,首先会访问登录服务,登录服务检测到有效的登录Token后,会重定向到目标页面,实现控制台页面的免密访问。整体的流程如下。

访问流程

  1. 用户访问您的Web服务。

  2. Web服务端使用RAM用户的AK访问令牌服务(STS)获取安全令牌(STS Token)。

  3. 令牌服务(STS)返回安全令牌(STS Token)。

  4. Web服务端使用安全令牌访问RAM的登录服务SSO,获取登录Token。

  5. 登录服务返回登录Token。

  6. Web服务端拼接免登录链接,返回给客户端,客户端根据拼接的免登录链接访问日志服务页面。

注意事项

在使用控制台分享功能的过程中,请注意以下事项:

  • 该功能仅支持通过扮演RAM角色身份进行访问。

  • 由于令牌服务(STS)生成的登录Token为临时凭证,所以共享链接仅支持在浏览器中打开一次;重复打开该链接会提示SigninToken错误。

  • 由于后端存在校验逻辑,建议您在SigninToken失效期前5分钟重新生成控制台分享链接以持续使用免登的页面。否则SigninToken失效将导致免登录页面上报SigninToken错误。

  • 当前仅支持完整查询和分析页面、查询页面、仪表盘页面进行控制台分享,不支持告警页面分享。

操作流程

准备分享链接

  1. 准备好待分享的查询分析页面或者仪表盘链接。

    说明

    当前仅支持完整查询和分析页面、查询页面、仪表盘页面进行控制台分享,不支持告警页面分享。

    • 完整查询分析页面:

      https://sls4service.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
    • 查询页面:

      https://sls4service.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
    • 仪表盘页面:

      https://sls4service.console.aliyun.com/lognext/project/<Project名称>/dashboard/<仪表盘ID>?isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
      说明

      上述链接中仪表盘ID为网页链接上的ID,并非仪表盘的展示名称。

    • 全栈可观测应用页面

      此处以Trace分析页面为例。更多信息,请参见全栈可观测内嵌

      https://sls4service.console.aliyun.com/lognext/app/observability/trace/<Project名称>/<全栈可观测实例id>?resource=/trace/<全栈可观测实例id>/explorer&hideTopbar=true&isShare=true
  2. 替换分享链接的Host为sls4service.console.aliyun.com

    例如,您待分享的仪表盘控制台链接如下:

    https://sls.console.aliyun.com/lognext/project/project_name/dashboard/dashboard-1651116703628-54041

    替换Hostsls.console.aliyun.comsls4service.console.aliyun.com,则待分享链接页面地址为:

    https://sls4service.console.aliyun.com/lognext/project/project_name/dashboard/dashboard-1651116703628-54041

创建RAM用户&RAM角色

创建RAM用户,并授予扮演RAM角色的权限,然后创建一个RAM角色,并授予访问仪表盘等待分享页面的查看权限。

创建RAM用户

  1. 创建RAM用户的操作步骤请参见创建RAM用户及授权,创建时勾选通过OpenAPI 调用访问选项,创建完成后记录下AccessKey。

  2. 给RAM用户授予扮演角色的权限。

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "*"
            }
        ]
    }

创建RAM角色

  1. 创建一个允许当前云账号的RAM用户或RAM角色扮演的RAM角色,详细操作步骤请参见创建可信实体为阿里云账号的RAM角色及授权

  2. 给RAM角色授权,允许其访问分享链接。如授予SLS的只读权限。

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "log:Get*",
                    "log:List*",
                    "log:Query*"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }
  3. 记录下RAM角色的角色ARN,格式如acs:ram::137******44:role/role-name

获取免登录链接

制作免登录日志服务控制台的链接。Java、Python等多种语言的代码示例请参考代码示例

  1. 通过使用RAM用户的AccessKey访问STS服务换取安全令牌(STS Token),可根据业务的实际需要指定令牌的有效期。获取STS Token的示例代码如下。

    DefaultProfile.addEndpoint("", "", "Sts", stsHost);
    IClientProfile profile = DefaultProfile.getProfile("", <AccessKeyId>, <AccessKeySecret>);
    DefaultAcsClient client = new DefaultAcsClient(profile);
    AssumeRoleRequest assumeRoleReq = new AssumeRoleRequest();
    assumeRoleReq.setRoleArn(roleArn); // RAM角色的ARN
    assumeRoleReq.setRoleSessionName(roleSession);
    assumeRoleReq.setMethod(MethodType.POST);
    assumeRoleReq.setDurationSeconds(3600L);
    AssumeRoleResponse assumeRoleRes = client.getAcsResponse(assumeRoleReq);
  2. 调用RAM单点登录SSO,获取登录Token。拼接链接的形式如下。注意:TicketType必须指定为mini

    http://signin.aliyun.com/federation?Action=GetSigninToken
                        &AccessKeyId=<STS返回的临时AK>
                        &AccessKeySecret=<STS返回的临时Secret>
                        &SecurityToken=<STS返回的安全Token>
                        &TicketType=mini

    返回的结构如下:

    {
        "RequestId": "02b47c77c5fd48789d23773af853e9f7_936be_1706585994094_1.229",
        "SigninToken": "svX6LGcBbWLExKD5hcwdLu6RsLQbv36fWZN36WhxkTXpTcDpmzs2K6X8uFvCqGsBTU4KWJMffYz2rAVbdJXHMECgUfyzS869wh2DBdFEQo3e2fJgZ5YtcMSVnoX7pterS2f7926jFvdBXVFEF54JkUCMrDAutNRv1u7ZReC7v8oQoG5UmjJBbHUyvLTn5UDDvDfNowMVyRskrZRFUKT2qAMZ4Gnc****"
    }
  3. 将返回的登录Token拼接到准备好的链接中,生成免密访问链接。

    http://signin.aliyun.com/federation?Action=Login
                                &LoginUrl=<登录失效跳转的地址,一般配置为自建Web配置302跳转的URL。需要使用encodeURL对LoginUrl进行转码。>
                                &Destination=<实际访问日志服务页面,支持查询页面和仪表盘页面。如果有参数,则需要使用encodeURL对参数进行转码。>
                                &SigninToken=<获取的登录Token,需要使用encodeURL对Token进行转码。>

以Iframe方式嵌入

以iframe方式将链接嵌入到其他Web页面。

重要

此处测试即为首次在浏览器中打开免登录链接,测试完成后,登录Token会失效,您需要重新生成免登录链接。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>控制台链接分享</title>
</head>
<body>
<iframe width="1280" height="720" src="免登录访问链接"> </iframe>
</body>
</html>

代码示例

您可以参考以下PHP、Python、Go代码示例生成控制台分享免登录链接。

  • Java 示例代码

    其中Java代码的Maven依赖如下。

    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-sts</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.5</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.68.noneautotype</version>
    </dependency>
  • PHP 示例代码

  • Python 示例代码

  • Go 示例代码

常见问题

  • 问题现象

    iframe嵌套免登录链接时,出现如下报错:

    Refused to frame 'https://signin.aliyun.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' *.aliyun.com"
  • 问题根因

    iframe存在安全限制,导致无法加载域外网站。

  • 解决方案

    请修改Content-Security-Policy Header。

    您可以通过在CSP指令中添加特定的域名或通配符来允许特定的网站嵌入。例如,可以使用以下CSP指令允许来自aliyun.com*.aliyun.com的网站嵌入:

    Content-Security-Policy: frame-ancestors 'self' aliyun.com *.aliyun.com;

    如果要允许所有网站嵌入,可以使用通配符*,例如:

    Content-Security-Policy: frame-ancestors *;

    需要注意的是,允许所有网站嵌入可能存在安全风险,因此建议仅在特定情况下使用。更多信息,请参见https://content-security-policy.com/