无法为Google个人资料生成GET请求

时间:2015-08-03 01:23:00

标签: google-plus google-plus-signin

我感谢你的时间。在向Google Profile API发送GET请求时,我突然碰到了一堵砖墙,其中服务器始终响应401 Unauthorized错误。我正在使用C#进行编码,并尝试实现用于验证用户的手动流程。我的Windows应用程序使用浏览器控件进行初始登录过程,然后在后台处理其余部分。

一切都很好:我可以使用HttpWebRequest / HttpWebResponse从服务器获取授权码,处理响应,发送另一个访问令牌请求,并处理该响应。我的问题出现在下一步:将GET请求发送到Profile API URL以接收用户的配置文件信息。我不会厌倦你的整个代码,我只会告诉你重要的事情:

这可能是问题的一部分,所以......

初始身份验证URL字符串:

https://accounts.google.com/o/oauth2/auth?scope=profile%20email&redirect_uri={my redirect uri}&response_type=code&client_id={my client id}&approval_prompt=force&access_type=offline

也许我使用错误的指定网址范围的方式,因此收到的访问令牌不符合我正在使用的API网址?

下一步...

GET请求如下所示:

string RequestString = "https://www.googleapis.com/plus/v1/people/me?access_token=" + AccessToken;

WebRequest GGLRequest = WebRequest.Create(RequestString);
GGLRequest.Method = "GET";
// I've already tried alternating use of
// these next 4 lines without improvement:
GGLRequest.ContentLength = 0;
GGLRequest.ContentType="application/json";
GGLRequest.Headers.Add("Authorization", "Bearer");
GGLRequest.UseDefaultCredentials = true;

WebResponse GGLResponse = GGLRequest.GetResponse();

代码在最后一行爆炸,发出401 Unauthorized错误。

现在,也许我正在请求错误的网址?如果是这样,那么正确的是什么?

1)我的项目在控制台网站上激活了Google+ API。

2)从Google获取的客户端ID /密码和重定向URI均为“已安装的应用”设置,因为它是Windows窗体应用程序。

3)使用相同格式的先前GET请求正在执行而没有问题。那个从tokeninfo URL获取响应,其中包含有关Google发送的访问令牌的信息,以便我检查绑定到它的用户ID。看起来很奇怪,一个工作正常而另一个工作没有。

再一次,我感谢你的时间!干杯!

1 个答案:

答案 0 :(得分:1)

我解决了我面临的情况!

当您向Google发出GET请求时(我想象其他任何公司服务),您必须使用安全线(SSL / TLS等)执行此操作。不这样做会根据您的特定架构触发许多错误。在我的情况下,相同的代码在.GetResponse行上给了我不同类型的错误,一种类型在工作,一种在家里(显然因为我在公司的Active Directory工作后面) 。我提到这个小细节,因为这是让我的灯泡打开并开始朝某个方向看的因素; - )

现在,在之前的研究中,我偶然发现了一篇文章(我道歉因为我可耻地丢失了链接而不包括链接),并解释说当“https”是URL中指定的协议时,WebRequest会自动使用SSL。不幸的是,这还不够。

您必须以某种方式在代码中强制使用SSL / TLS

最后我在Stack Overflow上偶然发现了This Article,这给了我所需要的光。我只需在发出WebRequest之前添加以下代码行

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; // Tls for Facebook
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

所以它就是......它完美无缺!我希望将来可以帮助任何有同样问题的人。

祝你有美好的一天!