開源客戶端訪問云消息隊(duì)列 RabbitMQ 版服務(wù)端時,需要傳入用戶名和密碼進(jìn)行權(quán)限認(rèn)證,認(rèn)證通過才允許訪問服務(wù)端。云消息隊(duì)列 RabbitMQ 版支持通過阿里云訪問控制(RAM)的AccessKey和AccessKey Secret生成用戶名和密碼。
接口說明
背景信息
開源客戶端訪問云消息隊(duì)列 RabbitMQ 版服務(wù)端時,需要傳入用戶名和密碼進(jìn)行權(quán)限認(rèn)證,認(rèn)證通過才允許訪問服務(wù)端。 云消息隊(duì)列 RabbitMQ 版支持通過阿里云訪問控制(RAM)的 AccessKey 和 AccessKey Secret 生成用戶名和密碼。
注意事項(xiàng)
- 創(chuàng)建靜態(tài)用戶名密碼所屬的實(shí)例需處于服務(wù)中狀態(tài)。
- 一個實(shí)例下的 AccessKey 和靜態(tài)用戶名密碼一一對應(yīng),即一個實(shí)例下的一個 AccessKey 只能創(chuàng)建一個靜態(tài)用戶名密碼。
- 如果需要更新靜態(tài)用戶名密碼,您可以刪除該靜態(tài)用戶名密碼后重新創(chuàng)建。
用戶名計算示例代碼
請求參數(shù)中的 userName 的參數(shù)值,需要由實(shí)例 ID 和 AccessKey ID 構(gòu)造字符串并進(jìn)行 Base64 編碼得出。具體的計算方法如下:
public class Base64Utils {
public static final Charset UTF8 = Charset.forName("UTF-8");
/\*\*
*解碼 base64 字符串
\* @param str
\* @return
\*/
public static String decode(String str) {
return new String(Base64.getDecoder().decode(str.getBytes(UTF8)), UTF8);
}
public static String encode(String bytes) {
return new String(Base64.getEncoder().encode(bytes.getBytes(UTF8)), UTF8);
}
public static void main(String[] args) {
String example = "this is a example";
System.out.println(encode(example));
System.out.println(decode(encode(example)));
}
public static void main(String[] args) {
//使用您的實(shí)例 ID 以及購買該實(shí)例的賬號 AK,組成字符串。
String str = "2:${instanceId}:${ak}";
//生成 API 使用的 userName。
String userName = encode(example);
System.out.println("userName=" + userName);
String decodeStr = decode(userName);
System.out.println("originStr=" + decodeStr);
}
}
簽名算法示例代碼
請求參數(shù)中 signature 和 secretSign 的參數(shù)值,需要由指定的靜態(tài)用戶名的創(chuàng)建時間戳和 AccessKey Secret 進(jìn)行加密算法計算得出。具體的算法和示例代碼如下:
public static String hamcsha1(byte[] data, byte[] key) throws NoSuchAlgorithmException, InvalidKeyException {
SecretKeySpec signingKey = new SecretKeySpec(key, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
return byte2hex(mac.doFinal(data));
}
public static String byte2hex(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1) {
hs.append('0');
}
hs.append(stmp);
}
return hs.toString().toUpperCase();
}
public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException {
//createTimestamp 即是 API 的 createTimestamp 參數(shù)。
String createTimestamp = String.valueOf(System.currentTimeMillis());
System.out.println("timestamp:" + createTimestamp);
//您賬號的 sk。
String sk = "${sk}";
//生成 API 使用的 SecretSign。
String SecretSign = hamcsha1(sk.getBytes(), timestamp.getBytes());
System.out.println("SecretSign:" + SecretSign);
//生成 API 使用的 signature。
String signature = hamcsha1(timestamp.getBytes(), sk.getBytes());
System.out.println("signature:" + signature);
}
調(diào)試
您可以在OpenAPI Explorer中直接運(yùn)行該接口,免去您計算簽名的困擾。運(yùn)行成功后,OpenAPI Explorer可以自動生成SDK代碼示例。
授權(quán)信息
下表是API對應(yīng)的授權(quán)信息,可以在RAM權(quán)限策略語句的Action
元素中使用,用來給RAM用戶或RAM角色授予調(diào)用此API的權(quán)限。具體說明如下:
- 操作:是指具體的權(quán)限點(diǎn)。
- 訪問級別:是指每個操作的訪問級別,取值為寫入(Write)、讀?。≧ead)或列出(List)。
- 資源類型:是指操作中支持授權(quán)的資源類型。具體說明如下:
- 對于必選的資源類型,用背景高亮的方式表示。
- 對于不支持資源級授權(quán)的操作,用
全部資源
表示。
- 條件關(guān)鍵字:是指云產(chǎn)品自身定義的條件關(guān)鍵字。
- 關(guān)聯(lián)操作:是指成功執(zhí)行操作所需要的其他權(quán)限。操作者必須同時具備關(guān)聯(lián)操作的權(quán)限,操作才能成功。
操作 | 訪問級別 | 資源類型 | 條件關(guān)鍵字 | 關(guān)聯(lián)操作 |
---|---|---|---|---|
amqp:FetchStaticAccount | create | *Instance acs:amqp:{#regionId}:{#accountId}:/instances/{#instanceId} |
|
|
請求參數(shù)
名稱 | 類型 | 必填 | 描述 | 示例值 |
---|---|---|---|---|
instanceId | string | 是 | 消息隊(duì)列 RabbitMQ 版實(shí)例的 ID,表示您需要為哪個實(shí)例創(chuàng)建靜態(tài)用戶名密碼。 | amqp-cn-********* |
accountAccessKey | string | 是 | 您的阿里云賬號或 RAM 用戶的 AccessKey ID。獲取方式,請參見創(chuàng)建 AccessKey。 說明
如果您使用 RAM 用戶的 AccessKey 創(chuàng)建的靜態(tài)用戶名密碼接入消息隊(duì)列 RabbitMQ 版并收發(fā)消息,請確保該 RAM 用戶已被授予收發(fā)消息權(quán)限。更多信息,請參見 RAM 權(quán)限策略。
| LTAI5t8be*******tEJ6vfo |
userName | string | 是 | 待創(chuàng)建的靜態(tài)用戶名。 該參數(shù)值由實(shí)例 ID 和 AccessKey ID 構(gòu)造的字符串經(jīng)過 Base64 編碼得出,具體計算方法,請參見本文中的用戶名計算示例代碼。 | LTAI5***********eRZtEJ6vfo |
signature | string | 是 | 簽名,系統(tǒng)將根據(jù)請求參數(shù)中的簽名、AccessKey Secret 簽名和用戶名計算出靜態(tài)用戶密碼。 簽名由指定的用戶名創(chuàng)建時間戳和 AccessKey ID 進(jìn)行 HmacSHA1 加密算法計算得出。具體計算方法,請參見本文中的簽名算法示例代碼。 | 22c2d7d1769cb53c5a6d9213248e2de524****** |
createTimestamp | long | 是 | 指定該用戶名密碼創(chuàng)建的時間戳。單位:毫秒。 說明
該時間戳用于計算靜態(tài)用戶密碼,由您自定義設(shè)置。不是系統(tǒng)生成用戶名密碼時的時間戳。
| 1671175303522 |
secretSign | string | 是 | AccessKey Secret 簽名,系統(tǒng)將根據(jù)請求參數(shù)中的簽名、AccessKey Secret 簽名和用戶名計算出靜態(tài)用戶密碼。 AccessKey Secret 簽名由指定的用戶名創(chuàng)建時間戳和 AccessKey ID 進(jìn)行 HmacSHA1 加密算法計算得出。具體計算方法,請參見本文中的簽名算法示例代碼。 | 4c1a6367ce4c4255e9617326f9133ac635****** |
返回參數(shù)
示例
正常返回示例
JSON
格式
{
"RequestId": "FEBA5E0C-50D0-4FA6-A794-4901E5465***",
"Code": 200,
"Message": "operation success",
"Success": true,
"Data": {
"AccessKey": "LTAI5***********eRZtEJ6vfo",
"Password": "OUYwQzM2QjZBRkUxNDRFM***************MzZCNzdDQzoxNjcxNDMwMzkyODI1",
"CreateTimeStamp": 1671175303522,
"InstanceId": "amqp-cn-*********",
"MasterUId": 0,
"UserName": "MjphbXFwLWNuLXVxbTJ6cjc2djAwMzpMVEFJNX*******ZNMWVSWnRFSjZ2Zm8="
}
}
錯誤碼
訪問錯誤中心查看更多錯誤碼。
控制臺操作
除了調(diào)用 CreateAccount 接口,您還可以通過云消息隊(duì)列 RabbitMQ 版控制臺創(chuàng)建靜態(tài)用戶名密碼。具體操作,請參見靜態(tài)用戶名密碼管理。