You need to enable JavaScript to run this app.
文档中心
云服务器

云服务器

复制全文
下载 pdf
实例配置
控制台内嵌--在外部系统中使用ECS Terminal登录实例
复制全文
下载 pdf
控制台内嵌--在外部系统中使用ECS Terminal登录实例
云服务器ECS提供控制台内嵌功能,支持将实例登录页面嵌入到外部系统的自建Web页面中,您可以在外部系统中通过ECS Terminal登录云服务器实例并进行相关操作。本文介绍如何将实例登录页面嵌入到外部系统。
背景信息
控制台内嵌功能通过安全令牌服务STS实现用户的自定义身份代理,您可以授予IAM用户相关数据和页面的访问权限,以此身份通过STS服务创建临时访问凭证,并获取临时登录Token。您访问内嵌的云服务器控制台页面时,通过URL中封装的临时登录Token进行鉴权,访问过程无需使用IAM用户账密,且登录无感知。涉及的鉴权流程如下:
操作步骤
步骤一:获取临时安全令牌
  1. 创建IAM角色并授权。
  1. 为IAM角色授予ECS服务权限。根据业务需求,为IAM角色授予的权限策略如下所示。如何新建权限策略并授权
  • {
    "Statement": [
    {
    "Effect": "Allow",
    "Action": [
    "ecs:DescribeInstanceECSTerminalUrl",
    "ecs:DescribeInstanceVncUrl",
    "ecs:DescribeInstancesIamRoles",
    "ecs:CheckPermissionForKeepLogin"
    ],
    "Resource": [
    "*"
    ]
    }
    ]
    }
  1. 创建IAM用户并授权。
  1. 创建IAM用户,用于扮演IAM角色,便于后续获取临时安全令牌。
  1. 为IAM用户添加以下权限:
  • 扮演IAM角色的权限:创建IAM角色时,默认的可信实体为云平台账号,您需要修改IAM角色的信任策略,将Principal(信任身份)中的账号配置修改为您在上一步中创建的IAM账号ID,表示该角色可以被指定的IAM用户扮演。
  • {
    "Statement": [
    {
    "Effect": "Allow",
    "Action": [
    "sts:AssumeRole"
    ],
    "Principal": {
    "IAM": [
    "trn:iam::Account ID:user/Role name"
    ]
    }
    }
    ]
    }
  • 调用AssumeRole的权限:为IAM角色授予STSAssumeRoleAccess系统策略后,您才能使用IAM用户的访问密钥调用AssumeRole接口申请临时安全令牌。
  1. 调用AssumeRole接口获取临时安全令牌。
说明
AssumeRole接口的请求参数DurationSeconds用于指定临时安全令牌的有效期,过期之后需要重新调用此接口获取新的临时安全令牌,并以此请求获取登录Token。
步骤二:获取登录Token
调用STS(临时安全凭证)的getSigninTokenWithSTS接口获取登录Token,调用时需要指定accessKeyIdsecretAccessKeysessionToken,均为步骤一中获取的临时安全令牌。
登录Token(SigninToken)是STS服务提供的临时访问Token,外部系统的服务端需要通过登录Token构建ECS服务免密访问链接。
说明
  • 登录Token的有效期默认为15分钟且不可更改,请在Token到期前完成访问链接的构建与鉴权登录,到期后需要重新请求getSigninTokenWithSTS获取新的登录Token。
  • 通过登录Token完成一次登录后,登录Token随即失效,如果您刷新页面,则需要重新请求获取登录Token。
请求示例:
https://console.volc-embed.com/api/passport/login/getSigninTokenWithSTS
&accessKeyId=<Temporary AK obtained via AssumeRole>
&secretAccessKey=<Temporary SK obtained via AssumeRole>
&sessionToken=<Temporary Token obtained via AssumeRole>
&sessionDuration=<The duration of the login state. After expiration, re-login is required. The unit is seconds, with a value range of 900 ~ 43200.>
步骤三:构建免密访问链接
ECS云服务器控制台的免密访问链接格式如下所示。
const target_url = https://console.volc-embed.com/api/passport/login/loginWithSigninToken?signinToken=${signinToken}&redirectURI=${target_console_url}
参数
说明
signinToken
步骤二中获取的登录Token。
redirectURI
支持内嵌的ECS实例登录页面的URL,如下所示:
https://iaas-api.console.volc-embed.com/ecs/connect/xterm/?Id=${Instance ID}&Region=${Region}&Name=${Instance name}&Ip=${Instance private IP}&Env=volc&lang=zh
参数介绍:
  • xterm支持非Windows实例使用。如果是Windows实例,请将xterm替换为guac
注意
在使用如上redirectURI链接前,需先使用encodeURL转码链接。即您需要先根据实际值替换链接中的xtermIdRegionNameIP等参数,再通过encodeURL转码链接。
转码后的链接示例如下:
https://iaas-api.console.volc-embed.com/ecs/connect/xterm/?Id=i-xxxxxxxxxxx&Region=cn-beijing&Name=terminal%E6%B5%8B%E8%AF%95&Ip=192.168.**.**&Env=volc&lang=zh
步骤四:在外部系统中嵌套页面
以iFrame方式或者直接跳转URL的方式将ECS服务控制台嵌入到第三方自建Web页面中。您可以参考以下示例,在外部系统中嵌入ECS服务控制台页面。其中src或者href的值应指定为步骤三中构建的免密访问链接(target_url)。
注意
为避免因浏览器兼容性导致访问失败,推荐使用Chrome浏览器访问该页面。
  • iFrame方式:
  • <body>
    <iframe src="target_url" width="1200" height="800" id="tlsIframePage"></iframe>
    </body>
  • URL方式:
  • <body>
    <a href="target_url" target="_blank">remote connection</a>
    </body>
常见问题
如何设置内嵌页面的登录态时长?
通过第三方系统的Web页面免密登录ECS服务控制台页面之后,登录状态会维持一段时间,超期之后应用服务端需要重新获取并刷新Token,以便用户侧重新登录。
内嵌页面的登录态时长由getSigninTokenWithSTS接口的可选参数sessionDuration 指定,单位为秒,取值范围为900 ~ 43200。不传入该参数时,将默认维持AssumeRole接口的DurationSeconds参数设置,而DurationSeconds默认为1 小时。即默认情况下,AssumeRole接口返回的ExpiredTime既是临时安全令牌的有效期截止时间,也是登录状态的结束时间。
示例代码(Node.js)
const {Service} = require('@volcengine/openapi');
const axios= require("axios");
class StsService extends Service {
constructor(props) {
super({
...props,
defaultVersion: "2018-01-01",
serviceName: "sts",
});
}
}
async function main() {
const stsService = new StsService()
stsService.setAccessKeyId('xxx');
stsService.setSecretKey('yy')
stsService.setHost('sts.volcengineapi.com')
// 调用 assumeRole 获取临时安全令牌。const assumeRole = stsService.createAPI('AssumeRole', {
method: 'GET',
});
const token = await assumeRole({
RoleTrn: 'trn:iam::${accountId}:role/${Role name}',
RoleSessionName: 'test'
})
const { AccessKeyId, SecretAccessKey, SessionToken } = token.Result.Credentials;
// 根据临时安全令牌获取登录 token。const signinResp = await axios.post('https://console.volc-embed.com/api/passport/login/getSigninTokenWithSTS', {
"accessKeyId": AccessKeyId,
"secretAccessKey": SecretAccessKey,
"sessionToken": SessionToken
})
const signinToken = signinResp.data.Result.SigninToken;
// 根据登录 signinToken 生成免登录连接。const url = `https://console.volc-embed.com/api/passport/login/loginWithSigninToken?signinToken=${signinToken}&redirectURI=${encodeURIComponent(`https://iaas-api.console.volc-embed.com/ecs/connect/xterm/?Id=${实例ID}&Region=${Region}&Name=${实例名称}&Ip=${实例私网 IP}&Env=volc&lang=zh`)}`
console.log(url)
}
main();
最近更新时间:2026.06.25 15:24:37
这个页面对您有帮助吗?
有用
有用
无用
无用