【问题标题】:Calling Google API after having access Token to fetch profiledata访问 Token 后调用 Google API 获取 profiledata
【发布时间】:2012-04-12 17:45:46
【问题描述】:

我对 OAuth Arena 和 Google ApI 非常陌生,但我想要在这里实现的目标非常简单。

用户点击 Google Connect 按钮和我的网络服务应该能够从 Google 服务器获取所有用户个人资料信息:

我已经编写了获取 AccessToken 的代码(我还没有测试它)但是假设它工作正常,现在我应该如何要求 Google API 给我用户配置文件?我确实在 GoogleConsumer 类中看到了名为 Get Contacts 的静态函数,但我没有看到任何获取 profiledata 的选项。可能有什么我想念的吗?

这是我用来获取 accessToken 的代码:

IConsumerTokenManager tokenManager = 
                              new LocalTokenManager(consumerKey,consumerSecret);
var googleConsumer = 
               new WebConsumer(GoogleConsumer.ServiceDescription, tokenManager);
var tokenResult = googleConsumer.ProcessUserAuthorization();
return tokenResult.AccessToken;

现在,我如何从中获取用户个人资料?

【问题讨论】:

  • 大家好,我不知道为什么没有人接触过这个问题。如果我缺少任何信息,请告诉我。基本上,令我惊讶的是,所有这些 WebConsumer(GoogleConsumer 和 TwitterConsumer)都具有 getContacts 和 UpdateStatus 和 PostBlog 等所有复杂功能,但没有像 GetProfile 这样的基本功能。我在网上看到的所有示例实际上都让 USerprofile gy 在 Google 的网络服务 URL 上调用 GET,但我没有看到任何演示如何使用 GoogleWebConsume 检索 userProfile 的内容。是不是不可能?
  • this SO post 不回答你的问题吗?
  • 好吧,这篇文章说我们可以使用googleapis.com/auth/userinfo.profile 作为范围。这个范围究竟适用于哪里?我是否在 RequestAuthorization 调用中使用它?因为我试图把这个 URL 放在上面,但它不接受字符串参数。

标签: c# oauth google-api


【解决方案1】:

一旦您获得了 Access_Token(访问类型离线;并且设置了范围/权限以便您可以获取用户信息),您可以尝试以下操作(未经测试,如果出现任何错误请告诉我):

string userInfo = "";

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(action);
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        StreamReader sr = new StreamReader(resp.GetResponseStream());
        userInfo = "https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + "YOUR_ACCESSTOKEN";
        sr.Close();

            JObject jsonResp = JObject.Parse(userInfo);
            string info="";
            info += "<h3>" + jsonResp.Root["name"] + "</h3>";
            info += "<img src='" + jsonResp.Root["picture"] + "' width='120'/><br/>";
            info += "<br/>ID : " + jsonResp.Root["id"];
            info += "<br/>Email : " + jsonResp.Root["email"];
            info += "<br/>Verified_email : " + jsonResp.Root["verified_email"];
            info += "<br/>Given_name : " + jsonResp.Root["given_name"];
            info += "<br/>Family_name : " + jsonResp.Root["family_name"];
            info += "<br/>Link : " + jsonResp.Root["link"];
            info += "<br/>Gender : " + jsonResp.Root["gender"];

Response.Write(info);

流程:使用访问令牌请求 google userinfo url,获取响应并显示信息。

【讨论】:

  • 好吧,我目前没有mu visual studio,我会在一个小时左右尝试但只是想让您知道我在Web服务环境中而不是在WEB应用程序环境中.这行得通吗?
  • 如果用户已经登录(因为他们应该是因为你有访问令牌),那么应该没问题。只需仔细检查您是否有登录用户并设置所有范围/权限。告诉我。
  • 我认为您的代码非常有用,一旦我拥有 accessToken,我就可以使用它。我实际上正在研究获取请求令牌的逻辑(稍微落后于时间表)。一旦我实施它,我会及时通知您。
  • 很高兴它可以帮助您,如果您遇到困难,请告诉我。干杯哥们
  • @MarcUberstein 您发送给 HttpWebRequest 的“动作”是什么
【解决方案2】:

让我知道您对使用他们的 GET 方法访问个人资料的 google 信息有何看法,此处描述为 https://developers.google.com/+/api/latest/people/get? 这是我的 C# 示例。

string urlGoogle = "https://www.googleapis.com/plus/v1/people/me";
HttpWebRequest client = HttpWebRequest.Create(urlGoogle) as HttpWebRequest;
client.Method = "GET";
client.Headers.Add("Authorization", "Bearer " + accessToken);
            
using (HttpWebResponse response = (HttpWebResponse)client.GetResponse())
{
     using (Stream dataStream = response.GetResponseStream())
     {
           using (StreamReader reader = new StreamReader(dataStream))
           {
                 if (response.StatusCode == HttpStatusCode.OK)
                 {
                     var json = new JavaScriptSerializer();
                     var data = json.Deserialize<IDictionary<string, object>>(reader.ReadToEnd());
    //....... here in data you have all json fields for the profile

【讨论】:

  • 您的代码 sn-p 的格式似乎不正确。您可能希望删除一些缩进。
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多