1

PhoneGap アプリケーションに通知ハブを実装しようとしています。これは phonegap であるため、Notification Hubs REST API を使用する以外に選択肢はありません。SO私は次のものを持っています

var REQUEST_URI = "https://{namespace}.servicebus.windows.net/{NotificationHub}/registrations/?api-version=2013-08";

            var token = global_getSelfSignedToken(REQUEST_URI, 60);
            console.log("token: " + token);
            var data = '<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">\
<content type="application/xml">\
    <GcmRegistrationDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">\
        <Tags>myTag, myOtherTag</Tags>\
        <GcmRegistrationId>{GCM Registration Id}</GcmRegistrationId> \
    </GcmRegistrationDescription>\
</content>\
</entry>';
            $.ajax({
                type: "POST",
                url: REQUEST_URI,
                data: data,
                headers: {
                    "Authorization": token,
                    "Content-Type": 'application/atom+xml;type=entry;charset=utf-8',
                    "x-ms-version": "2013-08"
                },
                beforeSend: function() {
                    console.log("Trying to reach Notification Hub");
                },
                success: function(data, status, response) {
                    console.log("success!!!");
                },
                error: function(response, status, error) {
                    console.log("status: " + status);
                    console.log("error: " + error);
                }
            });

そしてglobal_getSelfSignedTokenメソッドとして

function global_getSelfSignedToken(targetUri,
        expiresInMins) {
    targetUri = encodeURIComponent(targetUri.toLowerCase()).toLowerCase();
    //prepare SAS key
    var parts = NOTOFICATION_HUB_FULL_ACCESS_KEY.split(';');
    if (parts.length != 3)
        throw "Error parsing connection string";

    parts.forEach(function(part) {
        if (part.indexOf('Endpoint') == 0) {
            endpoint = 'https' + part.substring(11);
        } else if (part.indexOf('SharedAccessKeyName') == 0) {
            sharedKey = part.substring(20);
        } else if (part.indexOf('SharedAccessKey') == 0) {
            ruleId = part.substring(16);
        }
    });

// Set expiration in seconds
    var expireOnDate = new Date();
    expireOnDate.setMinutes(expireOnDate.getMinutes() + expiresInMins);
    var expires = Date.UTC(expireOnDate.getUTCFullYear(), expireOnDate
            .getUTCMonth(), expireOnDate.getUTCDate(), expireOnDate
            .getUTCHours(), expireOnDate.getUTCMinutes(), expireOnDate
            .getUTCSeconds()) / 1000;
    var tosign = targetUri + '\n' + expires;

// using CryptoJS
    var signature = CryptoJS.HmacSHA256(tosign, sharedKey);
    var base64signature = signature.toString(CryptoJS.enc.Base64);
    var base64UriEncoded = encodeURIComponent(base64signature);

// construct autorization string
    var token = "SharedAccessSignature sr=" + targetUri + "&sig="
            + base64signature + "&se=" + expires + "&skn=" + ruleId;
// console.log("signature:" + token);
    return token;
}

参考文献: http://msdn.microsoft.com/en-us/library/windowsazure/dn223265.aspx http://msdn.microsoft.com/en-us/library/windowsazure/dn495631.aspx

問題: Unauthorized という応答が常に返されます

phonegap で NotificationHubs を試したことのある人はいますか?

4

1 に答える 1

0

targetUri パラメータは Http プロトコルで渡す必要があります。Https で渡しています。

于 2014-04-15T21:22:16.550 に答える