3

我尝试使用新的谷歌联系人 API。我的任务很简单 - 从静态(我的个人)域帐户中检索联系人。我在 API 控制台注册我的应用程序并获取 ClientId,ClientSecret 所以我尝试通过 .net(google SDK) 对我的应用程序进行身份验证

 RequestSettings settings = new RequestSettings(appName,login,password);
 ContactsRequest cr = new ContactsRequest(settings);
 Feed<Contact> contacts = cr.GetContacts();
 foreach (Contact entry in contacts.Entries)
 {
      ....
 }

这段代码运行良好,但谷歌表示我们应该在生产场景中使用 OAuth2 身份验证。我尝试不同的参数,RequestSettings但在其他变体中我得到 401(拒绝访问)。所以我的问题是在已安装的桌面应用程序中通过 google API v3 进行身份验证而不使用其他帐户凭据的正确方法是什么。

4

1 回答 1

0

在开始工作之前,您应该获得身份验证令牌。为此,您应该创建链接,用户应该打开并访问您的应用程序。比您应该使用稍后获得的代码女巫请求令牌。https://developers.google.com/accounts/docs/OAuth2Login中描述的这种机制 是这样的:

        private const string GetTokenUrl = "https://accounts.google.com/o/oauth2/token";    
        private new bool Auth(bool needUserCredentionals = true)
        {
            var dic = new Dictionary<string, string>();
            dic.Add("grant_type", "authorization_code");
            dic.Add("code", ResponseCode);
            dic.Add("client_id", ApplicationId);
            dic.Add("client_secret", ApplicationSecret);
            dic.Add("redirect_uri", HttpUtility.UrlEncode(AppRedirectUrl));
            var str = String.Join("&", dic.Select(item => item.Key + "=" + item.Value).ToArray());
            var client = new WebClient();
            client.Headers.Add("Content-type", "application/x-www-form-urlencoded");
            string s;
            try { s = client.UploadString(GetTokenUrl, str); }
            catch (WebException) { return false; }
            catch (Exception) { return false; }
            AuthResponse response;
            try { response = JsonConvert.DeserializeObject<AuthResponse>(s); }
            catch (Exception) { return false; }
            Token = response.access_token;
            SessionTime = DateTime.Now.Ticks + response.expires_in;
            if (needUserCredentionals)
                if (!GetUserInfo()) return false;
            return true;
        }

        public class AuthResponse
        {
            public string access_token { get; set; }
            public string token_type { get; set; }
            public long expires_in { get; set; }
        }

ResponseCode 这是用户从“访问授权页面”重定向后应该捕获的代码但我猜这个方法是 api 2... 也许我错了,谁知道

于 2012-03-14T00:04:38.700 回答