如何使用 Windows 推送通知服务 (WNS) 进行验证(Windows 运行时应用)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
本主题介绍如何通过 Windows 推送通知服务 (WNS) 对云服务器进行身份验证以及如何接收返回的访问令牌。
先决条件
- Windows 应用商店开发人员帐户。
- 要注册的 Windows 应用商店应用。
- 了解磁贴和通知术语及概念,以及 XML。
- 熟悉推送通知和 WNS 概念、要求及操作。
说明
步骤 1: 使用仪表板注册应用
通过 WNS 发送通知之前,必须注册你的应用。可通过仪表板完成此操作,也可通过支持你提交、认证和管理 Windows 应用商店应用的开发人员门户完成此操作。通过仪表板注册应用时,你需要提供云服务将用来通过 WNS 对自身进行身份验证的凭据—程序包安全标识符 (SID) 和密钥—。
若要注册:
转到 Window 开发人员中心的 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;
using System.Runtime.Serialization;
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);
}