👉点击这里申请火山引擎VIP帐号,立即体验火山引擎产品>>>
云服务器ECS提供控制台内嵌功能,支持将实例登录页面嵌入到外部系统的自建Web页面中,您可以在外部系统中通过ECS Terminal登录云服务器实例并进行相关操作。本文介绍如何将实例登录页面嵌入到外部系统。
背景信息
控制台内嵌功能通过安全令牌服务STS实现用户的自定义身份代理,您可以授予IAM用户相关数据和页面的访问权限,以此身份通过STS服务创建临时访问凭证,并获取临时登录Token。您访问内嵌的火山引擎控制台页面时,通过URL中封装的临时登录Token进行鉴权,访问过程无需使用IAM用户账密,且登录无感知。涉及的鉴权流程如下:
操作步骤
步骤一:获取临时安全令牌
创建IAM角色并授权。
创建IAM角色。
为IAM角色授予ECS服务权限。根据业务需求,为IAM角色授予的权限策略如下所示。如何新建权限策略并授权。
{ "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DescribeInstanceECSTerminalUrl", "ecs:DescribeInstanceVncUrl", "ecs:DescribeInstancesIamRoles" ], "Resource": [ "*" ] } ]}
创建IAM用户并授权。
创建IAM用户,用于扮演IAM角色,便于后续获取临时安全令牌。
为IAM用户添加以下权限:
扮演IAM角色的权限:创建IAM角色时,默认的可信实体为火山引擎账号,您需要修改IAM角色的信任策略,将Principal(信任身份)中的账号配置修改为您在上一步中创建的IAM账号ID,表示该角色可以被指定的IAM用户扮演。
{ "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Principal": { "IAM": [ "trn:iam::账号ID:user/角色名" ] } } ]}
调用AssumeRole的权限:为IAM角色授予STSAssumeRoleAccess系统策略后,您才能使用IAM用户的访问密钥调用AssumeRole接口申请临时安全令牌。
调用AssumeRole接口获取临时安全令牌。
说明AssumeRole接口的请求参数DurationSeconds用于指定临时安全令牌的有效期,过期之后需要重新调用此接口获取新的临时安全令牌,并以此请求获取登录Token。
步骤二:获取登录Token
调用STS(临时安全凭证)的getSigninTokenWithSTS接口获取登录Token,调用时需要指定accessKeyId、secretAccessKey 和sessionToken,均为步骤一中获取的临时安全令牌。登录Token(SigninToken)是STS服务提供的临时访问Token,外部系统的服务端需要通过登录Token构建ECS服务免密访问链接。说明
登录Token的有效期默认为15分钟且不可更改,请在Token到期前完成访问链接的构建与鉴权登录,到期后需要重新请求getSigninTokenWithSTS获取新的登录Token。
通过登录Token完成一次登录后,登录Token随即失效,如果您刷新页面,则需要重新请求获取登录Token。
请求示例:
https://console.volc-embed.com/api/passport/login/getSigninTokenWithSTS &accessKeyId=<通过AssumeRole获取的临时AK> &secretAccessKey=<通过AssumeRole获取的临时SK> &sessionToken=<通过AssumeRole获取的临时Token> &sessionDuration=<登录态的持续时长,超期后需要重新登录。单位为秒,取值为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=${实例ID}&Region=${Region}&Name=${实例名称}&Ip=${实例私网 IP}&Env=volc&lang=zh 参数介绍: 注意在使用如上redirectURI链接前,需先使用encodeURL转码链接。即您需要先根据实际值替换链接中的xterm、Id、Region、Name、IP等参数,再通过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">远程连接</a></body>
常见问题
如何设置内嵌页面的登录态时长?通过第三方系统的Web页面免密登录ECS服务控制台页面之后,登录状态会维持一段时间,超期之后应用服务端需要重新获取并刷新Token,以便用户侧重新登录。
示例代码(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/${角色名}', 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();