全部產品
Search
文件中心

Simple Log Service:控制台內嵌及分享

更新時間:Jun 30, 2024

Log Service支援將查詢分析頁面和儀錶盤頁面嵌入自建Web應用,方便您將查詢分析和儀錶盤頁面免密共用給其他使用者。

基本原理

重要

免密分享推薦使用Ticket方案,具體操作請參見控制台內嵌及分享(新版)

登入服務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服務端拼接免登入連結,返回給用戶端,用戶端根據拼接的免登入連結訪問Log Service頁面。

注意事項

在使用控制台分享功能的過程中,請注意以下事項:

  • 該功能僅支援通過扮演RAM角色身份進行訪問。

  • 由於令牌服務(STS)產生的登入Token為臨時憑證,所以共用連結僅支援在瀏覽器中開啟一次;重複開啟該連結會提示SigninToken錯誤。

  • 由於後端存在校正邏輯,建議您在SigninToken失效期前5分鐘重建控制台分享連結以持續使用免登的頁面。否則SigninToken失效將導致免登入頁面上報SigninToken錯誤。

  • 當前僅支援完整查詢和分析頁面、查詢頁面、儀錶盤頁面進行控制台分享,不支援警示頁面分享。

操作流程

準備分享連結

  1. 準備好待分享的查詢分析頁面或者儀錶盤連結。

    說明

    當前僅支援完整查詢和分析頁面、查詢頁面、儀錶盤頁面進行控制台分享,不支援警示頁面分享。

    • 完整查詢分析頁面:

      https://sls.console.aliyun.com/lognext/project/<Project名稱>/logsearch/<日誌庫名稱>?slsRegion=<Project所在地區>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
    • 查詢頁面:

      https://sls.console.aliyun.com/lognext/project/<Project名稱>/logsearch/<日誌庫名稱>?slsRegion=<Project所在地區>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
    • 儀錶盤頁面:

      https://sls.console.aliyun.com/lognext/project/<Project名稱>/dashboard/<儀錶盤ID>?slsRegion=<Project所在地區>&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

擷取免登入連結

製作免登入Log Service控制台的連結。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=<實際訪問Log Service頁面,支援查詢頁面和儀錶盤頁面。如果有參數,則需要使用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/