[英]SAS token generation for calling azure rest API in JAVA
I am trying to generate an SAS token using the code snippet given in the azure IoT Hub documentation, to call a GET devices API in IoT Hub( https://iot-hub-name.azure-devices.net/devices?api-版本=2020-03-13 )。 代碼是
private static String GetSASToken(String resourceUri, String keyName, String key)
{
long epoch = System.currentTimeMillis()/1000L;
int week = 60*60*24*7;
String expiry = Long.toString(epoch + week);
String sasToken = null;
try {
String stringToSign = URLEncoder.encode(resourceUri, "UTF-8") + "\n" + expiry;
String signature = getHMAC256(key, stringToSign);
sasToken = "SharedAccessSignature sr=" + resourceUri +"&sig=" +
URLEncoder.encode(signature, "UTF-8") + "&se=" + expiry + "&skn=" + keyName;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return sasToken;
}
public static String getHMAC256(String key, String input) {
Mac sha256_HMAC = null;
String hash = null;
try {
sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
Encoder encoder = Base64.getEncoder();
hash = new String(encoder.encode(sha256_HMAC.doFinal(input.getBytes("UTF-8"))));
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return hash;
}
然后我將生成 SAS 令牌方法稱為,
String sasToken= GetSASToken("https://<iot-hub-name>.azure-devices.net", "shared access policy name", "primary key of the shared access policy");
但是生成的 SAS 令牌給出了 401 Unauthorized,這意味着生成的令牌不正確。 誰能幫我解決這個問題?
我認為您正在使用本文檔中的代碼? 雖然 IoT 中心確實公開了 EventHub,但這不是調用 API 的正確 SAS 令牌。
您可以使用Java SDK生成您的令牌。 如果您堅持自己編寫代碼, 這個 class包含您正在尋找的代碼。 class 將從服務連接字符串中檢索您需要的值,但您可以輕松地將其省略。 連接字符串僅具有您還具有的值:
HostName=<hub-name>;SharedAccessKeyName=<policy-name>;SharedAccessKey=<access-key>
我鏈接的 class 從該字符串中提取值並在private String buildToken()
方法中使用它們,該方法包含您正在重新實現的代碼。
另請注意,在您的問題中,您使用https://<iot-hub-name>.azure-devices.net
作為資源名稱,對於此令牌(就像在連接字符串中一樣),您可以https://
要完成我的回答,您可以將構造函數更改為此,您將獲得令牌:
public IotHubServiceSasToken(String hubName, String keyValue, String keyName)
{
this.resourceUri = hubName;
this.keyValue = keyValue;
this.keyName = keyName;
this.expiryTime = buildExpiresOn();
this.token = buildToken();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.