日志服務支持將查詢分析頁面和儀表盤頁面嵌入自建Web應用,方便您將查詢分析和儀表盤頁面免密共享給其他用戶。
基本原理
免密分享推薦使用Ticket方案,具體操作請參見控制臺內嵌及分享(新版)。
登錄服務signin.aliyun.com
支持通過在URL中拼接登錄Token,當用戶訪問免登錄鏈接時,首先會訪問登錄服務,登錄服務檢測到有效的登錄Token后,會重定向到目標頁面,實現控制臺頁面的免密訪問。整體的流程如下。
用戶訪問您的Web服務。
Web服務端使用RAM用戶的AK訪問令牌服務(STS)獲取安全令牌(STS Token)。
令牌服務(STS)返回安全令牌(STS Token)。
Web服務端使用安全令牌訪問RAM的登錄服務SSO,獲取登錄Token。
登錄服務返回登錄Token。
Web服務端拼接免登錄鏈接,返回給客戶端,客戶端根據拼接的免登錄鏈接訪問日志服務頁面。
注意事項
在使用控制臺分享功能的過程中,請注意以下事項:
該功能僅支持通過扮演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
。
獲取免登錄鏈接
制作免登錄日志服務控制臺的鏈接。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=<實際訪問日志服務頁面,支持查詢頁面和儀表盤頁面。如果有參數,則需要使用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/。
相關文檔
儀表盤免密分享可以在控制臺操作,具體操作請參見儀表盤免密分享。