请帮助!!无法弄清楚为什么MSDN提供的这个简单代码不起作用....
我在this MSDN article中使用GetAccessToken()中的以下代码来获取在Windows通知中使用的访问令牌,但它返回“Bad Request 400”
PACKAGE_SECURITY_IDENTIFIER,CLIENT_SECRET是在Windows应用商店信息中心注册应用时获得的值
string urlEncodedSid = HttpUtility.UrlEncode(PACKAGE_SECURITY_IDENTIFIER);
string urlEncodedSecret = HttpUtility.UrlEncode(CLIENT_SECRET);
string body = String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.windows.com", urlEncodedSid, urlEncodedSecret);
string response;
using (WebClient client = new WebClient())
{
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
response = client.UploadString("https://login.live.com/accesstoken.srf", body);
}
任何帮助都将受到高度赞赏.......
答案 0 :(得分:3)
我怀疑问题与错误的包标识符和/或不正确的客户端密钥有关。
来自MSDN页面Push notification service request and response headers:
RESPONSE DESCRIPTION
--------------- --------------------------
200 OK The request was successful.
400 Bad Request The authentication failed.
更新 - 我使用FAKE凭据运行了问题中的代码。
以下是RAW HTTP请求:
POST https://login.live.com/accesstoken.srf HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: login.live.com
Content-Length: 88
Expect: 100-continue
Connection: Keep-Alive
grant_type=client_credentials&client_id=test&client_secret=test&scope=notify.windows.com
这是服务器的RAW响应:
HTTP/1.1 400 Bad Request
Cache-Control: no-store
Content-Length: 66
Content-Type: application/json
Server: Microsoft-IIS/7.5
X-WLID-Error: 0x80045A78
PPServer: PPV: 30 H: BAYIDSLGN2A055 V: 0
Date: Thu, 21 Mar 2013 12:34:19 GMT
Connection: close
{"error":"invalid_client","error_description":"Invalid client id"}
您会注意到响应为 400 。还有一些json指示错误的类型。在我的案例中,错误为Invalid client id
。你可能想看看你的回答 - 它会告诉你发生了什么。
我使用Fiddler来调试请求/响应。
答案 1 :(得分:2)
我找到了错误响应的原因。实际上它是错误的PACKAGE_SECURITY_IDENTIFIER和CLIENT_SECRET。
请勿键入值。因为关联的ASCII值不同。因此,直接复制和粘贴总是更好。
您可能会使用简单的代码段获取访问令牌。
干杯
答案 2 :(得分:0)
如果您正在使用新的HttpClient API并且确定已经正确复制并粘贴了SID /密码值,那么由于编码问题,您可能会遇到此问题,前提是您有&#39 ;使用FormUrlEncodedContent
类作为POST操作的内容。
与MSDN documentation中的示例相反,在将它们添加到KeyValuePair集合之前,您不希望对SID和机密值进行URL编码。这是因为FormUrlEncodedContent
类隐含了编码,但我没有看到此行为的任何documentation。希望这可以节省一些时间,因为我整夜都在努力挣扎......