2015-07-07 6 views
2

Я сделал приложение для вставки, отображения и удаления контактов из моей учетной записи Google. Он функционировал до 2 недель назад, но после того, как Google прекратил поддержку входа в систему (доступ пользователя/пароля), заставляя использовать OAuth2 для доступа к токену, здесь огромная проблема (я не профессионал в разработка программного обеспечения).API контактов Google с доступом к учетной записи службы

С обширным поиском после обновления, я адаптировано моего код ниже логиков:

Const service_id = "My_Service_ID.apps.googleusercontent.com" 
Const service_email = "[email protected]" 
Const nome_aplicacao = "My_Application_Name" 
Const user_id = service_email 

1.Create Токен с учетными данными, полученных из ключа p12 и возвращает contactsRequest с этим маркером:

Private Function CriaContactRequest() As ContactsRequest 
    Try 
     Dim certificate As New X509Certificate2(Server.MapPath("/chave/key.p12"), "notasecret", X509KeyStorageFlags.Exportable) 
     Dim credential As New ServiceAccountCredential(New ServiceAccountCredential.Initializer(service_email) With { _ 
      .Scopes = New String() {"https://www.google.com/m8/feeds https://www.google.com/m8/feeds/groups/default/full"} 
     }.FromCertificate(certificate)) 
     credential.RequestAccessTokenAsync(System.Threading.CancellationToken.None).Wait() 
     Dim rs = New RequestSettings(nome_aplicacao) With { _ 
       .OAuth2Parameters = New OAuth2Parameters() With { _ 
        .AccessToken = credential.Token.AccessToken, .RefreshToken = "6000" _ 
       } _ 
      } 
     Dim cr As New ContactsRequest(rs) 
     Return cr 
    Catch ex As Exception 
     Throw ex 
    End Try 
End Function 

2.To показать все контакты:

Public Sub ExibeContatos() 
    Try 
     Dim f As Feed(Of Contact) = CriaContactRequest().GetContacts() 
     If f.Entries.Count > 0 Then 
      ' Loop to show contacts here.... 
     Else 
      Response.Write("Não existem contatos.") 
     End If 
    Catch ex As HttpException 
     Response.Write("Erro Exibe Contatos: " & ex.Message) 
    End Try 
End Sub 

3.to вставных контактов:

Public Sub InsereContatoGoogle(oContato As Contact) 
    Try 
     Dim feedUri As New Uri(ContactsQuery.CreateContactsUri(user_id)) 
     InserenNoGrupoPrincipal(oContato) 
     CriaContactRequest().Insert(feedUri, oContato) 
    Catch ex As Exception 
     Response.Write("Erro Insere Contato Google: " & ex.Message) 
    End Try 
End Sub 

4.Before вставки контакта, присвоить "My Contacs" (1-я группа на корма все группы):

Private Function InserenNoGrupoPrincipal(oContato As Contact) As Contact 
    Try    
     Dim f As Feed(Of Group) = CriaContactRequest().GetGroups(user_id) 
     Dim GrupoPrincipal As New GroupMembership 
     GrupoPrincipal.HRef = f.Entries.ElementAt(0).Id 
     oContato.GroupMembership.Add(GrupoPrincipal) 
    Catch ex As Exception 
     Response.Write("Erro Insere Grupo Principal: " & ex.Message) 
    End Try 
    Return oContato 
End Function 

5.Code удалить контакт на основе вектора заселенной с электронной почтой:

Public Sub ApagaContato(emailToExclude As String()) 
    Dim query As ContactsQuery = New ContactsQuery(ContactsQuery.CreateContactsUri(user_id)) 
    query.BaseAddress = emailToExclude(0) 
    Dim feed As Feed(Of Contact) 
    Try 
     Dim cr As ContactsRequest = CriaContactRequest() 
     feed = cr.GetContacts() 
     For Each c As Contact In feed.Entries 
      For x As Integer = 0 To c.Emails.Count - 1 
       For y As Integer = 0 To emailToExclude.Length - 1 
        If c.Emails.Item(x).Address = emailToExclude(y) Then 
         cr.Delete(c) 
        End If 
       Next 
      Next 
     Next 
    Catch ex As Exception 
     Response.Write("Erro Apaga Contato: " & ex.Message) 
    End Try 
End Sub 

Эти функции работают, но не как ожидалось: Я могу вставить новые записи, удалять и просматривать записи, как правило, но в моем Google счет «[email protected]» ничего не происходит. После некоторого поиска в foruns, я подозреваю, что они находятся в служебной учетной записи «[email protected]», так вот в чем проблема:

Кто-то может назначить то, что не так в области, учетных данных или другой части этого кода, и как я могу сделать учетную запись службы доступ сохранить изменения в моих "[email protected]" контакты?

ответ

0

Я не думаю, что вы сможете использовать учетную запись службы для этого. Учетная запись службы - это собственный пользователь SUDO, у нее есть учетная запись на накопителе в учетной записи календаря Google и, возможно, учетная запись контактов, а также как и любой другой пользователь.

Сообщалось, что он не имеет доступа к вашим личным контактам Google, если вы не предоставите ему доступ, и насколько я вижу, нет возможности предоставить другому человеку доступ к вашим контактам. То, что вы делаете, - это вставка пользователей в учетную запись службы учетных записей Google Contacts.

Предлагаю вам использовать Oauth2, аутентифицировать свой код один раз с помощью своей учетной записи Google, а затем сохранить токен обновления. В следующий раз, когда он запустит ваш код, вы можете использовать токен обновления, чтобы получить новый токен доступа. Сначала вам придется пройти процесс аутентификации.

+0

Спасибо Я попробовал с учетной записью службы вместо клиентского доступа, потому что я не хотел запросить, и я подумал, что это лучший вариант, но это не так, как это работает. С обновлением токена, созданного на игровой площадке OAuth, все эти задачи функционируют и улучшаются: с меньшим количеством кода, чем этот начальный пост, и нет необходимости в p12 key –

0

Решенный с этой областью:

Private Function CriaContactRequest(Optional scope As String = "https://www.google.com/m8/feeds https://www.google.com/m8/feeds/groups/default/full") As ContactsRequest 
    Try 
     Dim rs = New RequestSettings(nome_aplicacao) With { _ 
         .OAuth2Parameters = New OAuth2Parameters() With { _ 
         .AccessToken = refresh_token, _ 
         .RefreshToken = refresh_token, _ 
         .ClientId = client_id, _ 
         .ClientSecret = client_secret, _ 
         .RedirectUri = redirect_uri, _ 
         .Scope = scope _ 
        } _ 
       } 
     Dim cr As New ContactsRequest(rs) 
     Return cr 
    Catch ex As Exception 
     Throw ex 
    End Try 
End Function 

я ошибочно думал, что refresh_token имущество должны было быть использовано для указания маркеров времени обновления, не то, что это был код, который может быть сохранен.

Смежные вопросы