Log Service支援將查詢分析頁面和儀錶盤頁面嵌入自建Web應用,方便您將查詢分析和儀錶盤頁面免密共用給其他使用者。
基本原理
免密分享推薦使用Ticket方案,具體操作請參見控制台內嵌及分享(新版)。
登入服務signin.aliyun.com
支援通過在URL中拼接登入Token,當使用者訪問免登入連結時,首先會訪問登入服務,登入服務檢測到有效登入Token後,會重新導向到目標頁面,實現控制台頁面的免密訪問。整體的流程如下。
使用者訪問您的Web服務。
Web服務端使用RAM使用者的AK存取權杖服務(STS)擷取安全性權杖(STS Token)。
令牌服務(STS)返回安全性權杖(STS Token)。
Web服務端使用安全性權杖訪問RAM的登入服務SSO,擷取登入Token。
登入服務返回登入Token。
Web服務端拼接免登入連結,返回給用戶端,用戶端根據拼接的免登入連結訪問Log Service頁面。
注意事項
在使用控制台分享功能的過程中,請注意以下事項:
該功能僅支援通過扮演RAM角色身份進行訪問。
由於令牌服務(STS)產生的登入Token為臨時憑證,所以共用連結僅支援在瀏覽器中開啟一次;重複開啟該連結會提示SigninToken錯誤。
由於後端存在校正邏輯,建議您在SigninToken失效期前5分鐘重建控制台分享連結以持續使用免登的頁面。否則SigninToken失效將導致免登入頁面上報SigninToken錯誤。
當前僅支援完整查詢和分析頁面、查詢頁面、儀錶盤頁面進行控制台分享,不支援警示頁面分享。
操作流程
準備分享連結
準備好待分享的查詢分析頁面或者儀錶盤連結。
說明當前僅支援完整查詢和分析頁面、查詢頁面、儀錶盤頁面進行控制台分享,不支援警示頁面分享。
完整查詢分析頁面:
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
替換分享連結的Host為
sls4service.console.aliyun.com
。例如,您待分享的儀錶盤控制台連結如下:
https://sls.console.aliyun.com/lognext/project/project_name/dashboard/dashboard-1651116703628-54041
替換Host
sls.console.aliyun.com
為sls4service.console.aliyun.com
,則待分享連結頁面地址為:https://sls4service.console.aliyun.com/lognext/project/project_name/dashboard/dashboard-1651116703628-54041
建立RAM使用者&RAM角色
建立RAM使用者,並授予扮演RAM角色的許可權,然後建立一個RAM角色,並授予訪問儀錶盤等待分享頁面的查看許可權。
建立RAM使用者
建立RAM使用者的操作步驟請參見建立RAM使用者及授權,建立時勾選通過OpenAPI 呼叫訪問選項,建立完成後記錄下AccessKey。
給RAM使用者授予扮演角色的許可權。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "*" } ] }
建立RAM角色
建立一個允許當前雲帳號的RAM使用者或RAM角色扮演的RAM角色,詳細操作步驟請參見建立可信實體為阿里雲帳號的RAM角色及授權。
給RAM角色授權,允許其訪問分享連結。如授予SLS的唯讀許可權。
{ "Version": "1", "Statement": [ { "Action": [ "log:Get*", "log:List*", "log:Query*" ], "Resource": "*", "Effect": "Allow" } ] }
記錄下RAM角色的角色ARN,格式如
acs:ram::137******44:role/role-name
。
擷取免登入連結
製作免登入Log Service控制台的連結。Java、Python等多種語言的程式碼範例請參考程式碼範例。
通過使用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);
調用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****" }
將返回的登入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代碼的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>
常見問題
問題現象
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/。