2017-10-10 4 views
1

저는 C# MVC 프로젝트가 있습니다. Google에서 사용자 정보를 검색하여 사용자 등록 프로세스를 지원하려고합니다. 성, 성, 이메일 및 휴대폰 번호에 액세스하고 싶습니다. 모두 필수 입력란입니다. Google People API를 사용해야한다고 생각합니다. Google+ API는 정상적으로 작동하지만 휴대 전화 번호가 없습니다. 나는이 데이터를 얻는 방법을 확신하지 못한다.MVC 외부 로그인 - Google People API 사용

 var googleOptions = new GoogleOAuth2AuthenticationOptions() 
     { 
      ClientId = ConfigurationManager.AppSettings["GoogleClientId"], 
      ClientSecret = ConfigurationManager.AppSettings["GoogleClientSecret"], 
      Provider = new GoogleOAuth2AuthenticationProvider 
      { 
       OnAuthenticated = context => 
       { 
        context.Identity.AddClaim(new Claim("urn:google:accesstoken", context.AccessToken, ClaimValueTypes.String, "Google")); 
        context.Identity.AddClaim(new Claim(ClaimTypes.Email, context.Email)); 
        context.Identity.AddClaim(new Claim(ClaimTypes.Uri, context.User["image"]["url"].ToString())); 
        return Task.FromResult(true); 
       } 
      } 
     }; 
     googleOptions.Scope.Add("https://www.googleapis.com/auth/user.phonenumbers.read"); 
     googleOptions.Scope.Add("https://www.googleapis.com/auth/userinfo.email"); 
     googleOptions.Scope.Add("https://www.googleapis.com/auth/userinfo.profile"); 
     app.UseGoogleAuthentication(googleOptions); 

을 그리고 내 컨트롤러에서 나는이 : 현재 startup.auth에 내가 가진

 if (loginInfo.Login.LoginProvider == "Google") 
     { 
      if (loginInfo.Email == null) 
       loginInfo.Email = GetSchemasClaimValue(loginInfo, "emailaddress"); 
      firstName = GetSchemasClaimValue(loginInfo, "givenname"); 
      lastName = GetSchemasClaimValue(loginInfo, "surname"); 
      mobilePhone = loginInfo.ExternalIdentity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.MobilePhone); 


      //proPic = GetSchemasClaimValue(loginInfo, "uri"); 
     } 

모든 정보를 원하는대로 휴대 전화에 액세스 할 수 있으며 작동 외에. 이 데이터를 검색하는 방법을 모르겠습니다. loginInfo에 클레임으로 표시되기를 기대했지만이 경우에는 클레임이 없습니다. 사용자는 휴대 전화에 액세스 할 수있는 권한을 앱에 제공하라는 메시지가 표시되므로 손해 배상 청구가없는 이유에 대해 다소 혼란 스럽습니다. 내 신생 업체에 소유권 주장을 추가해야합니까? 어떻게 작동할까요? 어떤 도움을 주시면 감사하겠습니다.

답변

0

Azure 모바일 앱 (App Services라고도 함)에서 호스팅되는 백엔드와 유사한 기능, 즉 Google People API에서 데이터를 가져 오는 my sample Xamarin project의 데이터를 가져 왔습니다. 나는 그것을 다음과 같이했다.

using (HttpClient client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Authorization = 
     AuthenticationHeaderValue.Parse("Bearer " + accessToken); 

    using (HttpResponseMessage response = await client.GetAsync("https://www.googleapis.com/plus/v1/people/me")) 
    { 
     var googlePlusUserInfo = 
      JsonConvert.DeserializeObject<GooglePlusUserInfo>(await response.Content.ReadAsStringAsync()); 

     googlePlusUserInfo.Email = googlePlusUserInfo.Emails.Count() > 0 ? 

     googlePlusUserInfo.Emails.First().EmailAddress : ""; 

     googlePlusUserInfo.ProfilePicure.ImageUrl = 
     googlePlusUserInfo.ProfilePicure.ImageUrl.Split(new char[] { '?' })[0]; 

     return googlePlusUserInfo; 
    } 
} 

Complete code on Github. 전화 번호를 검색 할 필요

경우, 우리가 사용하여 얻을 수 있습니다 : 물론

googlePlusUserInfo.PhoneNumbers.CanonicalForm 

, the model GooglePlusUserInfo json으로 구조가 먼저 반환 일치하기 위해도 업데이트해야합니다. 반환 전화 번호와 Google 사용자 프로파일의 JSON이 도움이와 내가 틀렸다면 수정하시기 바랍니다

{ 
    "resourceName": "people/...", 
    "etag": "...", 
    "phoneNumbers": [ 
    { 
     "metadata": { 
     "primary": true, 
     "source": { 
      "type": "CONTACT", 
      "id": "1" 
     } 
     }, 
     "value": "88880000", 
     "canonicalForm": "+65888800000", 
     "type": "mobile", 
     "formattedType": "Mobile" 
    } 
    ] 
} 

희망입니다.

+0

안녕하세요, 시도 한이 방법을, 그러나 내 JSON 결과는 같다 "플러스 # 사람", "ETAG": "\"Sh4n9u6xxxNdphy12JkxmY을 \ "" "이메일"[ { "값": "[email protected]" "타입": "계정" } ] "objectType의": "사람" , "ID": "114157772521111131101" "나 displayName": "닉 체", "이름": { "familyName": "체", "givenName과": "닉",363,210}, "이미지": { "URL": "https : //로 XXX = 50", "isDefault"거짓 }, "isPlusUser"거짓, "언어" "엉" "확인 됨": false, "도메인": "xxx" } 전화 번호를 찾을 수 없습니다. 번호 : –

+0

이 답변은 [Google+ API] (https://developers.google.co.kr/+/web/api/rest/latest/people)이며 [Google People API] (https://developers.google.com/people/api/rest/)와는 다릅니다. –

+0

@ NicolasChetty https://developers.google.com/people/api/rest/v1/people/get을 참조하십시오. personFields에서 "phoneNumbers"를 지정해야 할 필요가있는 것처럼 보입니다. 필드 마스크는 사람의 필드를 반환하도록 제한합니다. – ChunLin

0

https://www.googleapis.com/auth/user.phonenumbers.read 범위는 Google People API에서만 작동합니다. 로그인 정보에서 해당 정보를 가져올 수 없습니다.

원하는 정보를 얻으려면 Google People API에 로그인 한 후 요청해야합니다. 자신의 설명서의 예를 참조하십시오 {{ "종류": https://developers.google.com/people/v1/read-people