日志服务支持将查询分析页面和仪表盘页面嵌入自建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/。