2015-07-02 47 views
0

試圖生成Azure SAS令牌以便能夠使用Service Bus REST Api。在Android上生成Azure SAS令牌

發現這個鏈接:

http://blog.simontimms.com/2015/01/30/sending-message-to-azure-service-bus-using-rest/

如何實現Android上的一樣嗎?

我現在的嘗試是這樣的:

private String generateSasToken(String uri, String keyName, String key){ 
    String ret = ""; 

    long tokenExpirationTime = (System.currentTimeMillis()/1000) + (10 * 365 * 24 * 60 * 60); 

    try { 
     String stringToSign = new URL(uri).toString() + "\n" + tokenExpirationTime; 
     SecretKey secretKey = null; 

     byte[] keyBytes = key.getBytes("UTF-8"); 

     Mac mac = Mac.getInstance("HMACSHA256"); 

     secretKey = new SecretKeySpec(keyBytes, mac.getAlgorithm()); 

     mac.init(secretKey); 

     String signature = Base64.encodeToString(mac.doFinal(stringToSign.getBytes("UTF-8")), Base64.DEFAULT); 
     ret = String.format("SharedAccessSignature sr=%s&sig=%s&se=%s&skn=%s", 
       URLEncoder.encode(uri), 
       URLEncoder.encode(signature), 
       String.valueOf(tokenExpirationTime), 
       keyName); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 

    return ret; 
} 

我得到以下使用郵差呼叫服務總線的REST API後:

401 40103:授權令牌無效簽名 時間261毫秒


向上日期:發現這個鏈接

https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-android-get-started/

根據第6的代碼爲Android

回答

0

我不知道如果這能幫助你,但這裏是在C#中的例子:

class Program 
{ 

    static void Main(string[] args) 
    { 

     var sasToken = createToken("yournamespace.servicebus.windows.net」, 
      "device_send_listen", "xxxxxxx"); 
    } 

    private static string createToken(string resourceUri, string keyName, string key) 
    { 

     TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1); 
     var expiry = Convert.ToString((int)sinceEpoch.TotalSeconds + 3600); //EXPIRES in 1h 
     string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry; 
     HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key)); 
     var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign))); 

     var sasToken = String.Format(CultureInfo.InvariantCulture, 
     "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}", 
      HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName); 

     return sasToken; 
    } 
} 
+0

什麼意思是「xxxxxxx」作爲參數,我應該在那裏使用什麼值? device_send_listen是設備資源管理器添加的設備的名稱?我的連接設備是CC3200 ti launchpad,我想確保我做的一切正常。 – Adela

1

我沒有Android環境測試,我只在java環境中有類似的情況,它工作正常,以下是我的代碼:

private static String generateSasToken(String uri, String keyName, String key){ 
     String ret = ""; 

     // long tokenExpirationTime = (System.currentTimeMillis()/1000) + (10 * 365 * 24 * 60 * 60); 

     Date now = new Date(); 
     Date previousDate=new Date(1970); 
     long tokenExpirationTime = ((now.getTime() - previousDate.getTime())/1000)+3600; 

     try { 
      String stringToSign = URLEncoder.encode(new URL(uri).toString(),java.nio.charset.StandardCharsets.UTF_8.toString()) + "\n" + tokenExpirationTime; 

      System.out.println(stringToSign); 
      SecretKey secretKey = null; 

      byte[] keyBytes = key.getBytes("UTF-8"); 

      Mac mac = Mac.getInstance("HMACSHA256"); 

      secretKey = new SecretKeySpec(keyBytes, mac.getAlgorithm()); 

      mac.init(secretKey); 

      byte[] digest = mac.doFinal(stringToSign.getBytes()); 
      //We then use the composite signing key to create an oauth_signature from the signature base string 
      String signature = Base64.encodeBase64String(digest); 
      System.out.println(URLEncoder.encode(signature, java.nio.charset.StandardCharsets.UTF_8.toString())); 
      // String signature = Base64.encodeBase64String(mac.doFinal(stringToSign.getBytes("UTF-8"))); 
      ret = String.format("SharedAccessSignature sr=%s&sig=%s&se=%s&skn=%s", 
        URLEncoder.encode(uri, java.nio.charset.StandardCharsets.UTF_8.toString()), 
        URLEncoder.encode(signature, java.nio.charset.StandardCharsets.UTF_8.toString()), 
        String.valueOf(tokenExpirationTime), 
        keyName); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (InvalidKeyException e) { 
      e.printStackTrace(); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 

     return ret; 
    } 

我改變了兩個地方,1)tokenExpirationTime 2)URLEncoder.encode字符串stringTosign,請試試我的建議,希望這可以給你一些提示。

+0

Jambor,你可以請更新這個答案。我正試圖在Android設備上生成一個令牌。這是我今天早些時候提出的問題:http://stackoverflow.com/questions/42005370/azure-event-hub-authorization-from-android – MadProgrammer