如何使用 Windows 推播通知服務 (WNS) 進行驗證 (Windows 執行階段應用程式)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
這個主題說明如何使用 Windows 推播通知服務 (WNS) 來驗證雲端伺服器並接收存取權杖。
先決條件
- Windows 市集開發人員帳戶。
- 要註冊的 Windows 市集應用程式。
- 磚、通知詞彙、概念以及 XML 的實用知識。
- 熟悉推播通知、WNS 概念、需求以及操作。
指示
步驟 1: 使用儀表板註冊您的應用程式
您必須註冊應用程式,才能透過 WNS 傳送通知。這項操作可透過儀表板進行;這個開發人員入口網站可讓您送出、認證和管理您的 Windows 市集應用程式。當您透過儀表板註冊應用程式時,會收到認證—一個封裝安全性識別碼 (SID) 及祕密金鑰—,讓您的雲端服務用來向 WNS 驗證自己。
若要註冊:
移至 Windows 開發人員中心的 Windows 市集應用程式頁面,使用您的 Microsoft 帳戶登入。
登入之後,按一下 [儀表板] 連結。
在儀表板上,選取 [送出應用程式]****。
在 [送出應用程式] 頁面上,選取 [應用程式名稱]****。
為您的應用程式提供一個唯一名稱。輸入名稱並按一下 [保留名稱] 按鈕。如果為可用的名稱,就會保留給您的應用程式使用。成功保留您應用程式的名稱後,就會顯示其他詳細資料,此時您即可選擇修改這些資料。
步驟 2: 取得您應用程式的識別值
保留您應用程式的名稱後,Windows 市集會建立相關的認證。它也會指派相關聯的識別值—名稱和發行者—這些識別值必須出現在您應用程式的資訊清單檔案 (package.appxmanifest) 中。如果您已經將應用程式上傳至 Windows 市集,則這些值會自動新增到您的資訊清單中。如果您尚未上傳應用程式,則需要手動將識別值新增至資訊清單。
選取 [服務]**** 連結。
在 [服務] 頁面上,選取可在 [Microsoft Azure 行動服務]**** 區段下找到的 [Live 服務] 連結。
在 [推播通知和 Live Connect 服務資訊]**** 頁面上,選取 [識別您的應用程式]。
[識別您的應用程式]**** 頁面會提供您一個 identity 元素,以包含在應用程式資訊清單中。以文字編輯器開啟資訊清單,並按照頁面指示新增該元素。
步驟 3: 取得您應用程式的認證
在同一個 [識別您的應用程式] 頁面底部按一下 [驗證您的服務]**** 連結。
[驗證您的服務] 頁面可提供安全性識別碼和用戶端密碼。若要將推播通知傳送至此應用程式,您的雲端服務必須明確使用這些認證。您不能使用另一個雲端服務的認證將通知傳送到此應用程式,也不能使用這些認證將通知傳送到另一個應用程式。
注意 這個頁面也可以用來產生新的認證。
將 SID 與用戶端祕密金鑰上傳到您的雲端伺服器。
重要 SID 與用戶端祕密金鑰應該儲存在安全的地方,並由您的雲端服務存取。公開此資訊或此資訊被偷竊,會讓攻擊者在未經您的允許或您不知情的情況下將通知傳送給您的使用者。
步驟 4: 將雲端伺服器的認證傳送給 WNS
雲端服務會透過使用 "application/x-www-for-urlencoded" 格式的 HTTPS 驗證要求,提供其認證 (SID 和用戶端密碼)。
這個範例示範 HTTPS 驗證要求範例。它會在 grant_type 中包含封裝 SID 和祕密金鑰。請確定會在 "client_id" 欄位中提供您自己的封裝 SID,並在 "client_secret" 欄位中提供您自己的祕密金鑰 (如果您複製了這個代碼)。如需語法的相關資訊,請參閱推播通知服務要求和回應標頭。
POST /accesstoken.srf HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: https://login.live.com
Content-Length: 211
grant_type=client_credentials&client_id=ms-app%3a%2f%2fS-1-15-2-2972962901-2322836549-3722629029-1345238579-3987825745-2155616079-650196962&client_secret=Vex8L9WOFZuj95euaLrvSH7XyoDhLJc7&scope=notify.windows.com
WNS 會將伺服器的回應傳送到驗證要求。如果回應碼是 "200 OK",表示驗證成功,且回應包含雲端伺服器必須儲存的存取權杖,並且可用於它傳送的所有通知,直到該存取權杖到期為止。
以下展示成功驗證的 WNS 回覆範例。
HTTP/1.1 200 OK
Cache-Control: no-store
Content-Length: 422
Content-Type: application/json
{
"access_token":"EgAcAQMAAAAALYAAY/c+Huwi3Fv4Ck10UrKNmtxRO6Njk2MgA=",
"token_type":"bearer"
}
下列範例提供傳送驗證要求和接收回覆時所需的程式碼。只要您包含下列指示詞,就可以將這個範例直接複製到您自己的雲端伺服器程式碼:
using System.Runtime.Serialization.Json;
System.Runtime.Serialization.Json;
using System.IO;
[DataContract]
public class OAuthToken
{
[DataMember(Name = "access_token")]
public string AccessToken { get; set; }
[DataMember(Name = "token_type")]
public string TokenType { get; set; }
}
private OAuthToken GetOAuthTokenFromJson(string jsonString)
{
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
{
var ser = new DataContractJsonSerializer(typeof(OAuthToken));
var oAuthToken = (OAuthToken)ser.ReadObject(ms);
return oAuthToken;
}
}
protected OAuthToken GetAccessToken(string secret, string sid)
{
var urlEncodedSecret = HttpUtility.UrlEncode(secret);
var urlEncodedSid = HttpUtility.UrlEncode(sid);
var body =
String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.windows.com", urlEncodedSid, urlEncodedSecret);
string response;
using (var client = new WebClient())
{
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
response = client.UploadString("https://login.live.com/accesstoken.srf", body);
}
return GetOAuthTokenFromJson(response);
}