【问题标题】:Importing google contacts导入谷歌联系人
【发布时间】:2017-04-07 07:17:50
【问题描述】:

您好,我想在我的默认 MVC5 应用程序中检索 Google 联系人。 我使用下面的代码成功登录。

 GoogleOAuth2AuthenticationOptions googleOptions = new GoogleOAuth2AuthenticationOptions()
 {
                ClientId = "<ClientId>",
                ClientSecret = "<ClientSecret>",
                AccessType = "offline",
                Provider = new GoogleOAuth2AuthenticationProvider()
                {
                    OnAuthenticated = (context) =>
                    {                        
                        context.Identity.AddClaim(new Claim("accessToken", context.AccessToken))

                        if (context.RefreshToken != null)
                        {
                            context.Identity.AddClaim(new Claim("refreshToken", context.RefreshToken));
                        }                      
                        context.Identity.AddClaim(new Claim("EmailAddressFieldName", context.Email));
                        context.Identity.AddClaim(new Claim("NameFieldName", context.Name));
                        context.Identity.AddClaim(new Claim("TokenIssuedFieldName", DateTime.Now.ToString()));
                        context.Identity.AddClaim(new Claim("TokenExpiresInFieldName",
                            ((long)context.ExpiresIn.Value.TotalSeconds).ToString()));

                        return Task.FromResult(0);
                    }
                }
            };


            //googleOptions.Scope.Add("https://www.google.com/m8/feeds");
            app.UseGoogleAuthentication(googleOptions);

确认身份验证后,我将 AccessToken 和 RefreshToken 保存到 Account Controller 的回调方法中的 ASPNetUserClaims 表中

public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
        {
            if (User.Identity.IsAuthenticated)
            {
                return RedirectToAction("Index", "Manage");
            }

            if (ModelState.IsValid)
            {
                // Get the information about the user from the external login provider
                var info = await AuthenticationManager.GetExternalLoginInfoAsync();
        //one things to be noted is when i use googleOptions.Scope.Add("https://www.google.com/m8/feeds"); as commented above this info is null
        //not sure why
                if (info == null)
                {
                    return View("ExternalLoginFailure");
                }
                var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
                var result = await UserManager.CreateAsync(user);
                if (result.Succeeded)
                {
                    result = await UserManager.AddLoginAsync(user.Id, info.Login);
                    if (result.Succeeded)
                    {
                        var accessToken = info.ExternalIdentity.Claims.FirstOrDefault(x => x.Type == "accessToken");
                        var refreshToken = info.ExternalIdentity.Claims.FirstOrDefault(x => x.Type == "refreshToken");
                        await UserManager.AddClaimAsync(user.Id, accessToken);
                        await UserManager.AddClaimAsync(user.Id, refreshToken);
                        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                        return RedirectToLocal(returnUrl);
                    }
                }
                AddErrors(result);
            }

            ViewBag.ReturnUrl = returnUrl;
            return View(model);
        }

无论如何,当我现在使用谷歌凭据登录时,我想使用谷歌客户端库在联系人方法中的 HomeController 中检索谷歌联系人,如下面的代码所示。

public ActionResult Contact()
        {          
            var user= UserManager.FindByEmailAsync(User.Identity.Name);
            var claim = ClaimsPrincipal.Current.Claims;          
            OAuth2Parameters parameters = new OAuth2Parameters();
            parameters.AccessToken = claim.Where(i => i.Type == "accessToken").Select(i => i.Value).SingleOrDefault();
            parameters.RefreshToken = claim.Where(i => i.Type == "refreshToken").Select(i => i.Value).SingleOrDefault();
            //parameters.Scope = "https://www.google.com/m8/feeds";           
            GetGoogleContacts(parameters);
            return View();
        }

        private static void GetGoogleContacts(OAuth2Parameters parameters)
        {
           try {
               RequestSettings settings = new RequestSettings("MvcAuth",parameters); 
               ContactsRequest cr = new ContactsRequest(settings);
               Feed<Contact> f = cr.GetContacts(); 
               foreach (Contact c in f.Entries) 
               { 
                   Console.WriteLine(c.Name.FullName); 
               } 
           } 
           catch (Exception a) 
           { 
               Console.WriteLine("A Google Apps error occurred."); 
               Console.WriteLine(); 
           }

        }

但是我得到了异常 “请求执行失败:https://www.google.com/m8/feeds/contacts/default/full” 远程服务器返回错误:(401) Unauthorized。 这意味着我的访问令牌不是有效的,如果它比为什么无效。我怎样才能得到我的谷歌联系人。请帮助我已经花了将近5天的时间 但没有成功。我只想在使用 Owin 中间件组件 UseGoogleAuthentication() 登录时检索 google 联系人

【问题讨论】:

  • 什么是 ContactsRequest 你如何应用访问令牌?
  • 我正在为 ContactsRequest 使用 .Net 客户端库,请参阅下面的链接 developers.google.com/google-apps/contacts/v3,我将 accessToken 作为 OAuth2Parameters 传递
  • 实际上我正在关注本教程daimto.com/google-contacts-with-c 但我从 Aspnet 获得 accessToken 声称我在使用 owin 中间件组件 usegoogleauthentication() 成功进行身份验证时存储在外部回调函数中
  • 你需要从 asp 获取刷新令牌。网络然后将其提供给图书馆
  • 实际上我在库中同时提供 accessToken 和 refreshToken ,就像这样 OAuth2Parameters parameters = new OAuth2Parameters(); parameters.AccessToken = claim.Where(i => i.Type == "accessToken").Select(i => i.Value).SingleOrDefault(); parameters.RefreshToken = claim.Where(i => i.Type == "refreshToken").Select(i => i.Value).SingleOrDefault();

标签: c# asp.net-mvc google-api google-oauth google-contacts-api


【解决方案1】:

首先,您必须确保访问令牌和引用令牌已保存在 cliam 表中, 其次,你应该知道 Access Token 的日期是 1 小时

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多