簡體   English   中英

REST API Azure事件中心ExpiredToken

[英]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>

在使用它之前,已重新生成密鑰。 我如何才能在沒有放置密鑰過期時間的情況下得到該錯誤或發出請求?

謝謝

根據我的經驗,如果se146480684正確地張貼在這里,我認為問題是由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM