如果您需要将日志服务的查询分析结果、仪表盘等页面,分享给其他人或者嵌入到第三方系统,可以通过本文生成免密且免登录的链接进行分享。
注意事项
生成单个免密免登录链接
当您临时需要分享页面给他人时,使用以下方式将快速获取一个免密免登录链接。
步骤一:准备链接
查询分析页面:
https://sls.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
Project名称参见管理Project,日志库名称参见管理Logstore,Project所在地域参见服务接入点的地域ID。
查询页面:
https://sls.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
仪表盘页面:
仪表盘ID为网页链接上的ID,并非仪表盘的展示名称。日志服务控制台也提供了方便的交互式仪表盘免密分享功能,请参见仪表盘免密分享。
https://sls.console.aliyun.com/lognext/project/<Project名称>/dashboard/<仪表盘ID>?slsRegion=<Project所在地域>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
步骤二:获取Ticket凭证
调用CreateTicket获取Ticket,服务地址只能选择华东2(上海)或新加坡,但获取的Ticket可以在各个地域使用。且每个生成的Ticket只能被同一个浏览器或主机访问,有效期默认一天,最长30天。
步骤三:拼接生成链接
将步骤二的链接与Ticket拼接,生成免密且免登录访问链接。
https://sls.console.aliyun.com/lognext/project/<Project名称>/dashboard/<仪表盘ID>?slsRegion=<Project所在地域>&sls_ticket=eyJ***************.eyJ******************.KUT****************&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
链接测试。您可以将生成的链接输入浏览器的地址栏进行测试。若可正常打开日志服务控制台分享页面,则说明已成功生成免登录链接。
此处测试即为首次在浏览器中打开免登录链接,测试完成后,Ticket会失效。需要重新获取Ticket。
建议将链接复制到文件中,然后传输文件。如果直接在第三方软件中发送链接,可能因为被第三方软件读取而失效。
嵌入第三方系统,如何动态生成链接
如果在第三方系统中嵌入控制台页面,由于Ticket会过期导致链接失效,因此需要在应用程序中动态调用CreateTicket
接口,以定期获取Ticket。此时如果使用某RAM用户的密钥调用接口,虽然简单,但安全风险较高,建议使用具有临时身份凭证(STS Token)的某RAM角色调用接口,凭证到期后该RAM角色无法访问,可以降低安全风险。
Ticket默认有效时长为24小时,最长为30天。
生成Ticket的总数没有限制,CreateTicket QPS限制为每用户10次/s。
使用RAM角色调用CreateTicket接口。
使用RAM用户调用AssumeRole接口,获取SecurityToken、AccessKeySecret和AccessKeyId。
RAM用户使用这三个参数扮演RAM角色,从而调用CreateTicket接口获取Ticket。
根据返回的Ticket拼接出不同权限范围的免密链接。
Ticket过期如何延长链接访问时间
已经生成免密且免登录链接,但通过CreatTicket接口生成的ticket只有短暂的有效期。如果需要刷新可免密且免登录链接的有效时间,可以使用RefreshToken接口。
步骤一:链接增加参数
生成的链接拼接supportRefreshToken=true
,表示允许链接延长访问时间。
https://sls.console.aliyun.com/lognext/project/<Project名称>/dashboard/<仪表盘ID>?sls_ticket=eyJ***************.eyJ******************.KUT****************&supportRefreshToken=true&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
步骤二:客户端增加监听事件
客户端监听message
事件,将最新的accessToken
传给iframe
。
window.addEventListener('message', async (e) => {
if (e?.data?.type === 'refreshToken') {
const accessToken = await callApi()
document.querySelector('#myIframe').contentWindow.postMessage(
{
// 固定为applyAccessToken
type: 'applyAccessToken',
// 调用callApi返回的accessToken
accessToken,
// createTicket接口返回的ticket
ticket: e.data.ticket,
},
'*'
)
}
})
客户端中callApi()
为自定义方法,用于调用服务端API,服务端API作用是调用RefreshToken获取accesstoken
,示例参考如下:
RefreshToken的两个入参:ticket
是CreateTicket生成的票据。accessTokenExpirationTime
表示调用接口生成的访问令牌过期时间(秒),默认86400秒(一天),最大86400秒(一天)。该ticket
最多延长至30天,30天后该ticket
过期。
添加Maven依赖。
在Java项目的根目录下,打开pom.xml文件,添加以下代码:
<dependency> <groupId>com.aliyun</groupId> <artifactId>sls20201230</artifactId> <version>5.2.1</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>tea-openapi</artifactId> <version>0.3.2</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>tea-console</artifactId> <version>0.0.1</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>tea-util</artifactId> <version>0.2.21</version> </dependency>
生成
accessToken
。// This file is auto-generated, don't edit it. Thanks. package com.aliyun.sample; import com.aliyun.sls20201230.Client; import com.aliyun.tea.*; public class Sample { /** * 使用AK&SK初始化账号Client * @return Client * @throws Exception */ public static Client createClient() throws Exception { // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。 // 建议使用更安全的 STS 方式。 com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config() // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。 .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // Endpoint 请参考 https://api.aliyun.com/product/Sls,服务地址只能是华东2(上海)或新加坡 config.endpoint = "cn-shanghai.log.aliyuncs.com"; return new Client(config); } public static void main(String[] args_) throws Exception { java.util.List<String> args = java.util.Arrays.asList(args_); com.aliyun.sls20201230.Client client = Sample.createClient(); com.aliyun.sls20201230.models.RefreshTokenRequest refreshTokenRequest = new com.aliyun.sls20201230.models.RefreshTokenRequest() .setTicket("eyJ***************.eyJ******************.KUT****************") .setAccessTokenExpirationTime(60L); com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); java.util.Map<String, String> headers = new java.util.HashMap<>(); try { com.aliyun.sls20201230.models.RefreshTokenResponse resp = client.refreshTokenWithOptions(refreshTokenRequest, headers, runtime); com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(resp)); } catch (TeaException error) { // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message System.out.println(error.getMessage()); // 诊断地址 System.out.println(error.getData().get("Recommend")); com.aliyun.teautil.Common.assertAsString(error.message); } catch (Exception _error) { TeaException error = new TeaException(_error.getMessage(), _error); // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message System.out.println(error.getMessage()); // 诊断地址 System.out.println(error.getData().get("Recommend")); com.aliyun.teautil.Common.assertAsString(error.message); } } }
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import os
import sys
from typing import List
from alibabacloud_sls20201230.client import Client as Sls20201230Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_sls20201230 import models as sls_20201230_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> Sls20201230Client:
"""
使用AK&SK初始化账号Client
@return: Client
@throws Exception
"""
# 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
# 建议使用更安全的 STS 方式。
config = open_api_models.Config(
# 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。,
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# Endpoint 请参考 https://api.aliyun.com/product/Sls,服务地址只能是华东2(上海)或新加坡
config.endpoint = 'cn-shanghai.log.aliyuncs.com'
return Sls20201230Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client()
refresh_token_request = sls_20201230_models.RefreshTokenRequest(
ticket='eyJ***************.eyJ******************.KUT****************',
access_token_expiration_time=60
)
runtime = util_models.RuntimeOptions()
headers = {}
try:
# 复制代码运行请自行打印 API 的返回值
client.refresh_token_with_options(refresh_token_request, headers, runtime)
except Exception as error:
# 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
# 错误 message
print(error.message)
# 诊断地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
@staticmethod
async def main_async(
args: List[str],
) -> None:
client = Sample.create_client()
refresh_token_request = sls_20201230_models.RefreshTokenRequest(
ticket='eyJ***************.eyJ******************.KUT****************',
access_token_expiration_time=60
)
runtime = util_models.RuntimeOptions()
headers = {}
try:
# 复制代码运行请自行打印 API 的返回值
await client.refresh_token_with_options_async(refresh_token_request, headers, runtime)
except Exception as error:
# 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
# 错误 message
print(error.message)
# 诊断地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])
调整页面显示效果
通过设置日志服务控制台内嵌参数,可调整内嵌页面的显示效果。日志服务提供了一系列UI参数与第三方自建Web页面进行融合展示。详细参数请参考配置控制台内嵌参数。
设置仪表盘大屏展示
若想把仪表盘制作成大屏长期展示,可以使用免密分享与集成仪表盘功能。
在日志服务控制台快速创建仪表盘。
创建免密分享,时间选择“长期有效”。
打开分享链接,选择显示器全屏。也可以设置刷新时间,实时刷新数据。
仪表盘分享协作
仪表盘分享支持在PC端、钉钉、企业微信或阿里钉查看。也支持分享给其他阿里云账号和RAM用户、钉钉账号、企业微信账号或阿里钉用户。
团队有多个阿里云账号,账号A下的RAM-User-A
想要分享仪表盘给账号B下的RAM-User-B
查看。
RAM-User-A
在日志服务控制台快速创建仪表盘,并创建免密分享。访问限制选择“阿里云账号”,阿里云账号ID填入RAM-User-B
的账号ID。RAM-User-B
登录后打开分享链接查看仪表盘。
公司使用钉钉或企业微信办公,运维团队在控制台创建仪表盘后分享给开发人员在钉钉账号或企业微信账号查看。
内嵌页面权限分离
将查询分析结果、仪表盘嵌入第三方系统,可支持用户权限分离。下面通过两个场景为您介绍控制台内嵌操作步骤。
使用场景:内嵌同一个Project中的两个Logstore,所有用户具有指定Logstore的只读权限及Project中快速查询和仪表盘的只读权限。
操作步骤
创建一个RAM用户
sls-user
作为分享者,具体操作,请参见创建RAM用户。为RAM用户
sls-user
授权。创建访问指定资源(Project、Logstore)的权限
Allow-AccessLogstore
。权限策略如下所示,具体操作,请参见创建自定义权限策略。实际操作中,请使用具体Project和Logstore替换代码中<指定的Project名称>和<指定的Logstore名称A>、<指定的Logstore名称B>。
{ "Version": "1", "Statement": [ { "Action": [ "log:ListProject" ], "Resource": "acs:log:*:*:project/*", "Effect": "Allow" }, { "Action": [ "log:List*" ], "Resource": "acs:log:*:*:project/<指定的Project名称>/logstore/*", "Effect": "Allow" }, { "Action": [ "log:Get*", "log:List*" ], "Resource": [ "acs:log:*:*:project/<指定的Project名称>/logstore/<指定的Logstore名称A>", "acs:log:*:*:project/<指定的Project名称>/logstore/<指定的Logstore名称B>" ], "Effect": "Allow" }, { "Action": [ "log:Get*", "log:List*" ], "Resource": [ "acs:log:*:*:project/<指定的Project名称>/dashboard", "acs:log:*:*:project/<指定的Project名称>/dashboard/*" ], "Effect": "Allow" }, { "Action": [ "log:Get*", "log:List*" ], "Resource": [ "acs:log:*:*:project/<指定的Project名称>/savedsearch", "acs:log:*:*:project/<指定的Project名称>/savedsearch/*" ], "Effect": "Allow" } ] }
为RAM用户
sls-user
授予Allow-AccessLogstore
权限,用户访问内嵌页面继承该权限。具体操作,请参见RAM自定义授权示例。创建调用CreateTicket接口的权限
Allow-CreateTicket
。权限策略如下所示,具体操作,请参见创建自定义权限策略。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "log:CreateTicket", "Resource": "acs:log:*:*:ticket/*" } ] }
为RAM用户授予调用CreateTicket接口的权限
Allow-CreateTicket
。具体操作,请参见为RAM用户授权。
您可在自己的前端页面自行制作Logstore Select框/Tab,用于切换Logstore。
进入内嵌页面,使用RAM用户
sls-user-a
调用CreateTicket接口获取票据Ticket,此处以Java SDK为例。您可在CreateTicket页面调试接口,获取票据Ticket。将获取的Ticket拼接在查询页URL中访问。
添加Maven依赖。
在Java项目的根目录下,打开pom.xml文件,添加以下代码:
<dependency> <groupId>com.aliyun</groupId> <artifactId>sls20201230</artifactId> <version>5.5.0</version> </dependency>
-
将获取的Ticket拼接在查询页URL中。同时您可隐藏左侧导航栏、顶部导航栏、关闭Tab访问历史记录等(hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true)。关于控制台内嵌参数的具体用法,请参见配置控制台内嵌参数。
https://sls.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true&sls_ticket=eyJ***************.eyJ******************.KUT****************
切换Logstore,在同一个浏览器中可以重复使用上述生成的Ticket,拼接在URL中。
同一个浏览器中无需重复调用,不同用户(不同浏览器)还是需要重新调用CreateTicket的,Ticket仅限一个浏览器或主机访问。
使用场景:内嵌两个project,用户A仅能只读访问Project-A
,用户B仅能只读访问Project-B
。
操作步骤
创建一个RAM用户
sls-user
作为分享者,具体操作,请参见创建RAM用户。为RAM用户
sls-user
授予调用STS服务AssumeRole接口的权限(AliyunSTSAssumeRoleAccess)。具体操作,请参见为RAM用户授权。创建RAM角色
sls-role
,具体操作,请参见创建可信实体为阿里云账号的RAM角色。为RAM角色
sls-role
授予指定资源(Project)的权限,以及调用CreateTicket接口的权限。创建访问指定资源(Project)的权限
Allow-AccessProject
,权限为所有用户权限的并集。具体操作,请参见创建自定义权限策略。这里需要只读访问Project-A
和Project-B
的权限,权限策略如下所示:实际操作中,请使用具体Project替换代码中<指定的Project名称A>和<指定的Project名称B>。
{ "Version": "1", "Statement": [ { "Action": [ "log:Get*", "log:List*" ], "Resource": [ "acs:log:*:*:project/<指定的Project名称A>/*", "acs:log:*:*:project/<指定的Project名称A>", "acs:log:*:*:project/<指定的Project名称B>/*", "acs:log:*:*:project/<指定的Project名称B>" ], "Effect": "Allow" } ] }
为RAM角色
sls-role
授予访问指定资源(Project)的权限Allow-AccessProject
,具体操作,请参见为RAM角色授权。创建调用CreateTicket接口的权限
Allow-CreateTicket
。权限策略如下所示,具体操作,请参见创建自定义权限策略。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "log:CreateTicket", "Resource": "acs:log:*:*:ticket/*" } ] }
为RAM角色
sls-role
授予调用CreateTicket接口的权限Allow-CreateTicket
,具体操作,请参见为RAM角色授权。
设置RAM角色最大会话时间,默认为1小时,内嵌有效时间会小于这个时间。
当用户进入内嵌页面时,使用RAM用户
sls-user
扮演的RAM角色sls-role
调用AssumeRole接口。主要设置四个参数。字段名称
字段说明
RoleArn
要扮演的RAM角色ARN。从RAM角色中复制。
RoleSessionName
角色会话名称。任意字符串,设置为用户ID或名称等,用于审计时区分不同用户。
DurationSeconds
Token有效期。可设置为最小900秒,最大为RAM角色最大会话时间,默认3600秒。
Policy
为 STS Token 额外添加的一个权限策略。
如果指定该权限策略,则 STS Token 最终的权限策略取 RAM 角色权限策略与该权限策略的交集。
如果不指定该权限策略,则 STS Token 最终的权限策略取 RAM 角色的权限策略。
调用时按照不同用户设置不同的policy,为STS Token额外添加的一个权限策略(STS Token 最终的权限策略取RAM角色权限策略与该权限策略的交集)。比如用户A进入内嵌页面时设置RoleSessionName为
UserA
,policy为:{ "Version": "1", "Statement": [ { "Action": [ "log:Get*", "log:List*" ], "Resource": [ "acs:log:*:*:project/<指定的Project名称A>/*", "acs:log:*:*:project/<指定的Project名称A>" ], "Effect": "Allow" }, { "Effect": "Allow", "Action": "log:CreateTicket", "Resource": "acs:log:*:*:ticket/*" } ] }
用户B进入内嵌页面时设置RoleSessionName为
UserB
,policy为:{ "Version": "1", "Statement": [ { "Action": [ "log:Get*", "log:List*" ], "Resource": [ "acs:log:*:*:project/<指定的Project名称B>/*", "acs:log:*:*:project/<指定的Project名称B>" ], "Effect": "Allow" }, { "Effect": "Allow", "Action": "log:CreateTicket", "Resource": "acs:log:*:*:ticket/*" } ] }
获取STS临时身份凭证SecurityToken、AccessKeySecret和AccessKeyId后,再使用这个STS调用CreateTicket获取票据Ticket,以Java为例:
package com.aliyun.sls20201230; import com.aliyun.sls20201230.models.CreateTicketRequest; import com.aliyun.sls20201230.models.CreateTicketResponse; import com.aliyun.sls20201230.models.CreateTicketResponseBody; import com.aliyun.sts20150401.models.AssumeRoleResponse; import com.aliyun.sts20150401.models.AssumeRoleResponseBody; import com.aliyun.tea.TeaException; import com.aliyun.teaopenapi.models.Config; import java.util.List; public class StsSample { public static void main(String[] args_) throws Exception { List<String> args = java.util.Arrays.asList(args_); String roleArn = "xxxx"; String roleSession = "UserA"; String policy = "{\n" + " \"Version\": \"1\",\n" + " \"Statement\": [\n" + " {\n" + " \"Action\": [\n" + " \"log:Get*\",\n" + " \"log:List*\"\n" + " ],\n" + " \"Resource\": [\n" + " \"acs:log:*:*:project/<指定的Project名称A>/*\",\n" + " \"acs:log:*:*:project/<指定的Project名称A>\"\n" + " ],\n" + " \"Effect\": \"Allow\"\n" + " },\n" + " {\n" + " \"Effect\": \"Allow\",\n" + " \"Action\": \"log:CreateTicket\",\n" + " \"Resource\": \"acs:log:*:*:ticket/*\"\n" + " }\n" + " ]\n" + "}"; Client client = StsSample.createClient(roleArn, roleSession, policy); try { CreateTicketRequest createTicketRequest = new CreateTicketRequest(); CreateTicketResponse response = client.createTicket(createTicketRequest); CreateTicketResponseBody embedded = response.getBody(); System.out.println(embedded.getTicket()); } catch (TeaException e) { e.printStackTrace(); } } public static Client createClient(String roleArn, String roleSession, String policy) throws Exception { com.aliyun.sts20150401.Client client = createStsClient(); com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest(); assumeRoleRequest.setRoleArn(roleArn); assumeRoleRequest.setRoleSessionName(roleSession); assumeRoleRequest.setDurationSeconds(3600L); assumeRoleRequest.setPolicy(policy); com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); AssumeRoleResponse assumeRoleResponse = client.assumeRoleWithOptions(assumeRoleRequest, runtime); AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials credentials = assumeRoleResponse.getBody().getCredentials(); Config config = new Config() .setAccessKeyId(credentials.getAccessKeyId()) .setAccessKeySecret(credentials.getAccessKeySecret()) .setSecurityToken(credentials.getSecurityToken()) // Endpoint 请参考 https://api.aliyun.com/product/Sls .setEndpoint("cn-shanghai.log.aliyuncs.com"); return new Client(config); } public static com.aliyun.sts20150401.Client createStsClient() throws Exception { String accessKeyId = "xxx"; String accessKeySecret = "xxx"; com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config() .setAccessKeyId(accessKeyId) .setAccessKeySecret(accessKeySecret); // Endpoint 请参考 https://api.aliyun.com/product/Sts config.endpoint = "sts.cn-shanghai.aliyuncs.com"; return new com.aliyun.sts20150401.Client(config); } }
将获取的Ticket拼接在查询页URL中。同时您可隐藏左侧导航栏、顶部导航栏、关闭Tab访问历史记录等(hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true)。关于控制台内嵌参数的具体用法,请参见配置控制台内嵌参数。
https://sls.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true&sls_ticket=eyJ***************.eyJ******************.KUT****************
多个内嵌页面权限设置
可以生成一个Ticket,然后在同一个浏览器中刷新页面。当Ticket过期时,重新生成新的Ticket,然后替换所有Tab页的Ticket。
不同浏览器或电脑会被视为不同的用户,因为一个ticket仅支持在浏览器中打开一次,所以会报错:
{"code":"TicketUnavailable","message":"There are no more tickets available.","requestId":"xxxxxx","success":false}
可以生成多个Ticket,每个Ticket关联不同的权限,但只有最后一个Ticket对应的内嵌页面可以刷新,原因是只能记录一个cookie作为当前使用者的凭证,对应最后生成的Ticket,每次刷新会根据该cookie作为当前的使用者。
在不刷新页面的情况下,不需要用到cookie,仍然可以切换标签页并操作不同内嵌页面的内容,对应的权限也不同。
此时刷新非最后一个ticket对应的内嵌页面,会报错:
{"code":"TicketUnavailable","message":"There are no more tickets available.","requestId":"xxxxxx","success":false}
生成免密免登录链接(旧版)
生成链接还可以使用如下方式,但新版操作更简单,且不需要依赖第三方cookie,相比旧版,有更高的加载速度,因此推荐使用新版,详情请参考生成单个免密免登录链接,且本文中其他使用场景均是以新版为例。
该功能仅支持通过扮演RAM角色进行访问。
由于后端存在校验逻辑,建议您在SigninToken失效期前5分钟重新生成控制台分享链接以持续使用免登的页面。否则SigninToken失效将导致免登录页面上报SigninToken错误。
步骤一:创建RAM角色&RAM用户
创建并授予RAM角色访问分享页面的查看权限。然后创建并授予RAM用户扮演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
。创建RAM用户的操作步骤请参见创建RAM用户及授权,创建时勾选通过OpenAPI 调用访问选项,创建完成后记录下AccessKey。
给RAM用户授予扮演角色的权限。
Resource指定创建的RAM角色的ARN。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "acs:ram::137******44:role/role-name" } ] }
步骤二:准备分享链接
查询分析页面:
https://sls4service.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
查询页面:
https://sls4service.console.aliyun.com/lognext/project/<Project名称>/logsearch/<日志库名称>?slsRegion=<Project所在地域>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
仪表盘页面:
https://sls4service.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
步骤三:生成免登录链接
制作免登录链接。Java、Python等多种语言的代码示例请参考代码示例。
使用RAM用户的
AccessKey
访问STS服务换取安全令牌(STS Token),一个Token只能使用一次,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会失效,您需要重新生成免登录链接。
若iframe嵌套链接出现报错,可能是存在安全限制,无法加载域外网站,请修改Content-Security-Policy Header。例如,可以使用以下CSP指令允许来自
aliyun.com
和*.aliyun.com
的网站嵌入:Content-Security-Policy: frame-ancestors 'self' aliyun.com *.aliyun.com;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>控制台链接分享</title>
</head>
<body>
<iframe width="1280" height="720" src="免登录访问链接"> </iframe>
</body>
</html>
- 本页导读 (1)
- 注意事项
- 生成单个免密免登录链接
- 嵌入第三方系统,如何动态生成链接
- Ticket过期如何延长链接访问时间
- 调整页面显示效果
- 设置仪表盘大屏展示
- 仪表盘分享协作
- 内嵌页面权限分离
- 多个内嵌页面权限设置
- 生成免密免登录链接(旧版)