Google Open Auth 2.0在服务器端获得access_token(错误请求错误,ProtocolError)

我正在尝试通过Google Open Auth 2.0实现用户身份validation。 我已经成功获得了Google的“代码”,现在我正在尝试获取access_token来访问用户的信息。 这是控制器的代码:

public void Google(string code) { if (!string.IsNullOrWhiteSpace(code)) { var parameters = new Dictionary(); parameters["code"] = code; parameters["client_id"] = ConfigurationProvider.GoogleApplicationId; parameters["client_secret"] = ConfigurationProvider.GoogleClientSecret; parameters["redirect_uri"] = "http://localhost:1291" + Url.Action("GoogleAuth"); parameters["grant_type"] = "authorization_code"; var keyValuePairs = new string[parameters.Count]; var i = 0; const string keyValueTemplate = "{0}={1}"; foreach (var parameter in parameters) { keyValuePairs[i] = string.Format(keyValueTemplate, parameter.Key, parameter.Value); i++; } var parametersString = string.Join("&", keyValuePairs); // code=CODE&client_id=MY.apps.googleusercontent.com&client_secret=SECRET&redirect_uri=http://localhost:1291/Account/GoogleAuth&grant_type=authorization_code const string uri = "https://accounts.google.com/o/oauth2/token"; var webClient = new WebClient(); webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; webClient.UploadString(uri, "POST", parametersString); // Here I get Bad Request exception. } } 

此exception还包含等于“ProtocolError”的Status。 即使我尝试使用空parametersString进行POST,我也有同样的错误。

我会感激任何建议或意见。

谢谢

编辑:我也试过这个片段有和没有参数(有相同的错误):

 var data = new NameValueCollection { {"code", code}, {"client_id", ConfigurationProvider.GoogleApplicationId}, {"client_secret", ConfigurationProvider.GoogleClientSecret}, {"redirect_uri", "http://localhost:1291" + Url.Action("GoogleAuth")}, {"grant_type", "authorization_code"} }; var webClient = new WebClient(); webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; // with and without this header... var result = webClient.UploadValues(uri, "POST", data); 

您的redirect_uri必须正确转义,否则您会收到格式错误的url。

 parameters["redirect_uri"] = Uri.EscapeDataString(_redirectUri);