2014-11-04 214 views
0
Uri url = new Uri("https://login.live.com/oauth20_authorize.srf"); 

     using (var wb = new WebClient()) 
     { 
      var data = new NameValueCollection(); 
      data["client_id"] = "000000004012B29D"; 
      data["scope"] = "wl.signin%20wl.basic%20wl.offline_access"; 
      data["response_type"] = "code"; 
      data["redirect_uri"] = "https://login.live.com/oauth20_desktop.srf";  

      var response = wb.UploadValues(url, "POST", data); 


     } 

我最有可能認爲我的請求後是錯誤的,但不知道爲什麼,我唯一有疑問跟我與範圍增加,20%是一個簡單的空間,我不確定我是否可以這樣寫。 我應該收到結果嗎?但我得到的是這個html代碼:如何POST請求的授權碼OneDrive

"<!-- ServerInfo: BAYIDSLGN3A089 2014.10.28.00.06.35 Live1 ExclusiveNew LocVer:0 -->\r\n<!-- PreprocessInfo: BTSA007:RR1BLDA080, -- Version: 16,0,25347,0 -->\r\n<html dir=\"ltr\">\r\n <head>\r\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n  <base href=\"https://login.live.com/pp1600/\"/>\r\n  \r\n   \r\n    \t\r\n     \r\n           \r\n         \t\t\r\n       <title>Microsoft account</title>\r\n  <meta name=\"PageID\" content=\"i4400\">\r\n  <meta name=\"SiteID\" content=\"38936\">\r\n  <meta name=\"ReqLC\" content=\"1033\">\r\n  <meta name=\"LocLC\" content=\" \">\r\n  <link rel=\"stylesheet\" type=\"text/css\" href=\"CSS/WEBblue1033.css?x=16.0.25000.0\"/>\r\n  <script type=\"text/javascript\">\r\n   function EndPPCRL(rs, u) \r\n   {\r\n    if (external) \r\n    {\r\n     try \r\n     {\r\n      if (rs) \r\n      {\r\n       external.RequestStatus = rs;\r\n       external.WebFlowUrl = u;\r\n       external.NotifyIdentityChanged();\r\n       external.ReturnToApp();\r\n      }\r\n      else \r\n      {\r\n       external._b7(); external.BrowseToAuthUI();\r\n      }\r\n     } \r\n     catch (e) { }\r\n    }\r\n   } \r\n   function BodyLoad() \r\n   { \r\n    EndPPCRL(-2147186656); \r\n   }\r\n  </script>\r\n  <script type=\"text/javascript\">\r\n   WizardExternalHelper = function(){ };\r\n   WizardExternalHelper.prototype =\r\n   {\r\n    setProperty: function(key, value) \r\n    { \r\n     try\r\n     { \r\n      window.external.Property(key) = value;\r\n     }\r\n     catch (e) { }\r\n    },\r\n    finalNext: function()\r\n    { \r\n     try\r\n     { \r\n      window.external.FinalNext();\r\n     }\r\n     catch (e) { }\r\n    }\r\n   };\r\n  </script>\r\n    <script type=\"text/javascript\">\r\n   try \r\n   {\r\n    var externalHelper = new WizardExternalHelper();\r\n    externalHelper.setProperty(\"ExtendedErrorString\", \"\");\r\n    externalHelper.setProperty(\"ErrorCode\", parseInt(1));\r\n    externalHelper.setProperty(\"ErrorString\", \"This service isn't available right now—please try again later.\");\r\n    externalHelper.finalNext();\r\n   } catch (e) {};\r\n   function OnBack() {}; \r\n   function OnNext() {};\r\n  </script>\r\n </head>\r\n <body class=\"modern\" onLoad=\"BodyLoad()\">\r\n  <div class=\"header\" id=\"idHeaderTD9\">\r\n  <span>Microsoft account</span>\r\n  </div>\r\n  <div class=\"content\">\r\n   \r\n    \t\r\n     \r\n           <div style=\"padding:15px 0 0 0;font-size:1px;\">&nbsp;</div>\r\n      <h1 class=\"css0046\">We're unable to complete your request</h1>\r\n      <p class=\"css0005\">Microsoft account is experiencing technical problems. Please try again later.</p>\r\n         \t\t\r\n       </div>\r\n </body>\r\n</html>\r\n<!-- _h-Agent: -->\r\n\r\n" 

回答

1

你不能POST請求獲取第一個代碼(這看起來是你在做什麼)。流程是這樣的:

  • 將用戶發送到授權頁面,他們授權您的應用程序,並重定向到您的應用程序與code GET參數
  • 你把這些代碼,並與一堆其他的帖吧東西給微軟。他們迴應了一堆OAuth令牌。
  • 您現在可以使用這些令牌發出請求。

的文檔是非常糟糕的,但看看http://msdn.microsoft.com/en-us/library/dn659750.aspx

總結(這些是從文檔的例子):

  • 發送用戶https://login.live.com/oauth20_authorize.srf?client_id=0000000603DB0F&scope=wl.signin%20wl.basic&response_type=code&redirect_uri=http%3A%2F%2Fwww.contoso.com%2Fcallback.php
  • 等待用戶定向到http://www.contoso.com/callback.php?code=2bd12503-7e88-bfe7-c5c7-82274a740ff,提取code參數
  • POST codeclient_idclient_secretgrant_type(authorization_code)和redirect_urihttps://login.live.com/oauth20_token.srf

如果一切正常,你會得到你的令牌。

+0

謝謝,我會試試這個,很好的解釋。 – HTLCloudManager 2014-11-14 07:57:04

+0

是不是grant_type =「token」來接收令牌? – HTLCloudManager 2014-11-14 09:34:11

+0

@HTLCloudManager不,它絕對是'authorization_code',請查看[the docs](http://msdn.microsoft.com/zh-cn/library/)中的「獲取訪問令牌和身份驗證令牌」下的示例dn659750.aspx):) – user478250 2014-11-14 11:14:55