如果您需要將Log Service的查詢分析結果、儀錶盤等頁面,分享給其他人或者嵌入到第三方系統,可以通過CreatTicket介面產生ticket,然後拼接成免密且免登入的連結進行分享。但通過CreatTicket介面產生的ticket只有短暫的有效期間,如果需要重新整理可免密且免登入連結的有效時間,可以使用RefreshToken介面。本文介紹詳細的操作步驟。
工作原理
前提條件
已經已產生免密且免登入連結,操作步驟請參見控制台內嵌及分享(新版)。
操作步驟
步驟一:為RAM使用者授權
如果使用阿里雲主帳號,可跳過這步,直接前往步驟二。
使用產生內嵌的RAM使用者登入RAM控制台。
為RAM使用者授予調用RefreshToken介面許可權。具體操作步驟請參見為RAM使用者授權和建立自訂權限原則。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "log:RefreshToken", "Resource": "acs:log:*:*:ticket/*" } ] }
步驟二:內嵌連結增加參數
控制台內嵌及分享(新版)產生的連結拼接supportRefreshToken
參數,該參數用於指示第三方是否支援重新整理權杖(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代碼請參見程式碼範例。調用RefreshToken擷取
accessToken
,服務地址只能是華東2(上海)或新加坡,但擷取的accessToken
可以在各個地區使用。RefreshToken的兩個入參:
ticket
是CreateTicket產生的票據。accessTokenExpirationTime
表示調用介面產生的存取權杖到期時間(秒),預設86400秒(一天),最大86400秒(一天)。該票據最多延長到期時間為30天(RefreshToken每天在到期之前調用一次),30天后該票據到期。
程式碼範例
RefreshToken程式碼範例如下:
Java
添加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 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); } } }
Python
# -*- 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
config.endpoint = f'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:])