開源客戶端訪問云消息隊列 RabbitMQ 版服務端時,需要傳入用戶名和密碼進行權限認證,認證通過才允許訪問服務端。云消息隊列 RabbitMQ 版支持通過阿里云訪問控制(RAM)的AccessKey和AccessKey Secret生成用戶名和密碼。
接口說明
背景信息
開源客戶端訪問云消息隊列 RabbitMQ 版服務端時,需要傳入用戶名和密碼進行權限認證,認證通過才允許訪問服務端。 云消息隊列 RabbitMQ 版支持通過阿里云訪問控制(RAM)的 AccessKey 和 AccessKey Secret 生成用戶名和密碼。
注意事項
- 創建靜態用戶名密碼所屬的實例需處于服務中狀態。
- 一個實例下的 AccessKey 和靜態用戶名密碼一一對應,即一個實例下的一個 AccessKey 只能創建一個靜態用戶名密碼。
- 如果需要更新靜態用戶名密碼,您可以刪除該靜態用戶名密碼后重新創建。
用戶名計算示例代碼
請求參數中的 userName 的參數值,需要由實例 ID 和 AccessKey ID 構造字符串并進行 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) {
//使用您的實例 ID 以及購買該實例的賬號 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);
}
}
簽名算法示例代碼
請求參數中 signature 和 secretSign 的參數值,需要由指定的靜態用戶名的創建時間戳和 AccessKey Secret 進行加密算法計算得出。具體的算法和示例代碼如下:
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 參數。
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);
}
調試
您可以在OpenAPI Explorer中直接運行該接口,免去您計算簽名的困擾。運行成功后,OpenAPI Explorer可以自動生成SDK代碼示例。
授權信息
下表是API對應的授權信息,可以在RAM權限策略語句的Action
元素中使用,用來給RAM用戶或RAM角色授予調用此API的權限。具體說明如下:
- 操作:是指具體的權限點。
- 訪問級別:是指每個操作的訪問級別,取值為寫入(Write)、讀取(Read)或列出(List)。
- 資源類型:是指操作中支持授權的資源類型。具體說明如下:
- 對于必選的資源類型,用背景高亮的方式表示。
- 對于不支持資源級授權的操作,用
全部資源
表示。
- 條件關鍵字:是指云產品自身定義的條件關鍵字。
- 關聯操作:是指成功執行操作所需要的其他權限。操作者必須同時具備關聯操作的權限,操作才能成功。
操作 | 訪問級別 | 資源類型 | 條件關鍵字 | 關聯操作 |
---|---|---|---|---|
amqp:GetInstance | create |
|
|
|
請求參數
名稱 | 類型 | 必填 | 描述 | 示例值 |
---|---|---|---|---|
instanceId | string | 是 | 消息隊列 RabbitMQ 版實例的 ID,表示您需要為哪個實例創建靜態用戶名密碼。 | amqp-cn-********* |
accountAccessKey | string | 是 | 您的阿里云賬號或 RAM 用戶的 AccessKey ID。獲取方式,請參見創建 AccessKey。 說明
如果您使用 RAM 用戶的 AccessKey 創建的靜態用戶名密碼接入消息隊列 RabbitMQ 版并收發消息,請確保該 RAM 用戶已被授予收發消息權限。更多信息,請參見 RAM 權限策略。
| LTAI5t8be*******tEJ6vfo |
userName | string | 是 | 待創建的靜態用戶名。 該參數值由實例 ID 和 AccessKey ID 構造的字符串經過 Base64 編碼得出,具體計算方法,請參見本文中的用戶名計算示例代碼。 | LTAI5***********eRZtEJ6vfo |
signature | string | 是 | 簽名,系統將根據請求參數中的簽名、AccessKey Secret 簽名和用戶名計算出靜態用戶密碼。 簽名由指定的用戶名創建時間戳和 AccessKey ID 進行 HmacSHA1 加密算法計算得出。具體計算方法,請參見本文中的簽名算法示例代碼。 | 22c2d7d1769cb53c5a6d9213248e2de524****** |
createTimestamp | long | 是 | 指定該用戶名密碼創建的時間戳。單位:毫秒。 說明
該時間戳用于計算靜態用戶密碼,由您自定義設置。不是系統生成用戶名密碼時的時間戳。
| 1671175303522 |
secretSign | string | 是 | AccessKey Secret 簽名,系統將根據請求參數中的簽名、AccessKey Secret 簽名和用戶名計算出靜態用戶密碼。 AccessKey Secret 簽名由指定的用戶名創建時間戳和 AccessKey ID 進行 HmacSHA1 加密算法計算得出。具體計算方法,請參見本文中的簽名算法示例代碼。 | 4c1a6367ce4c4255e9617326f9133ac635****** |
返回參數
示例
正常返回示例
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="
}
}
錯誤碼
訪問錯誤中心查看更多錯誤碼。
控制臺操作
除了調用 CreateAccount 接口,您還可以通過云消息隊列 RabbitMQ 版控制臺創建靜態用戶名密碼。具體操作,請參見靜態用戶名密碼管理。