![](/img/trans.png)
[英]how to create a Azure Event hub using Rest API or some SDK Api
[英]REST API Azure Event Hub ExpiredToken
我正在使用Rest工具Chrome客戶端測試API,以驗證我發出的POST請求正確無誤,以便可以在Java應用程序中使用它。 我的請求采用以下格式:
POST /androidhub/publishers/android/messages?timeout=60&api-version=2014-01
HTTP/1.1 HOST: androidhub-124.servicebus.windows.net
authorization: SharedAccessSignature sr=androidhub-124.servicebus.windows.net&sig=mykeySAS=&se=146480684&skn=RootManageSharedAccessKey
content-type: application/json, application/atom+xml;type=entry;charset=utf-8
content-length: 45 { "DeviceId":"dev-01", "Temperature":"37.0" }
但是我有以下錯誤。
<Error>
<Code>401</Code>
<Detail>ExpiredToken: . TrackingId:2f6d284e-d7d2-4c9c-81a5-79c542ce8eee_G7, SystemTracker:androidhub-124.servicebus.windows.net:androidhub/publishers/android/messages, Timestamp:5/25/2016 7:13:33 PM</Detail>
</Error>
在使用它之前,已重新生成密鑰。 我如何才能在沒有放置密鑰過期時間的情況下得到該錯誤或發出請求?
謝謝
根據我的經驗,如果se
值146480684
正確地張貼在這里,我認為問題是由於se
密鑰的expiry
時間引起的,該密鑰以當前時間和1970年1月1日午夜之間的秒數來度量。
因此, expiry
時間作為se
鍵的值應使用下面的Java代碼獲取。
long now = System.currentTimeMillis();
int expiry = (int)(now/1000) + 3600;
作為參考,您可以參考C#的官方文檔,請參閱https://msdn.microsoft.com/en-us/library/azure/mt652140.aspx 。
除了設置正確的se
值外,您還必須確保sig
是使用SAS密鑰進行加密簽名(使用HMAC 256)base64字符串,該字符串由名稱空間(在您的情況下為androidhub-124
)和se
簽名。
Microsoft 在此處提供了在Java中生成sig
示例代碼:
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=" + URLEncoder.encode(resourceUri, "UTF-8") +"&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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.