无法授权我的服务帐户使用域共享联系人 API

Cannot Authorize my Service Account to use the Domain Shared contacts API

我正在尝试模拟超级管理员帐户以使用共享联系人 API 在目录中创建新联系人,在使用 gdata 客户端库后我无法授权我的请求,即使我使用我用来授权另一个 API 调用的相同方法,但用于目录 API 而不是域共享联系人。

这是我的代码:

from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
import gdata.contacts
import gdata.contacts.data
import gdata.contacts.client
import atom

class TestView(APIView):

    SERVICE_ACCOUNT_EMAIL = (
        "x-serviceaccount@x.iam.gserviceaccount.com"
    )
    SERVICE_ACCOUNT_PKCS12_FILE_PATH = "C:\Users\Hoda\Desktop\xtools\x\Backend\x-x.p12"

    def get(self, request, *args, **kwargs):

        credentials = ServiceAccountCredentials.from_p12_keyfile(
            self.SERVICE_ACCOUNT_EMAIL,
            self.SERVICE_ACCOUNT_PKCS12_FILE_PATH,
            "notasecret",
            scopes=[
                'https://www.googleapis.com/auth/admin.directory.user',
                'https://www.googleapis.com/auth/admin.directory.user.security',
                'https://www.googleapis.com/auth/admin.directory.group',
                'https://www.google.com/m8/feeds/contacts/'
            ],
        )

        gd_client = gdata.contacts.client.ContactsClient()
        credentials = credentials.create_delegated('admin@admin.com')
        service = build('admin', 'something', credentials=credentials) 
        #while using the directory API I wrote directory_v1 instead of 
        #something and now I have no 
        #idea what to write and is that even the right way to authorize 
        #the service account here or not

        new_contact = gdata.contacts.data.ContactEntry()
        new_contact.name = gdata.data.Name(
            given_name=gdata.data.GivenName(text="Mohamed"),
            family_name=gdata.data.FamilyName(text="Safi"),
            full_name=gdata.data.FullName(text="Mohamed Safi"),
        )
        new_contact.content = atom.data.Content(text="Notes")
        new_contact.email.append(
            gdata.data.Email(
                address="liz@gmail.com",
                primary="true",
                rel=gdata.data.WORK_REL,
                display_name="E. Bennet",
            )
        )
        new_contact.email.append(
            gdata.data.Email(address="liz@example.com", rel=gdata.data.HOME_REL)
        )
        new_contact.phone_number.append(
            gdata.data.PhoneNumber(
                text="(206)555-1212", rel=gdata.data.WORK_REL, primary="true"
            )
        )
        new_contact.phone_number.append(
            gdata.data.PhoneNumber(text="(206)555-1213", rel=gdata.data.HOME_REL)
        )
        new_contact.im.append(
            gdata.data.Im(
                text="liz@gmail.com",
                primary="true",
                rel=gdata.data.HOME_REL,
                protocol=gdata.data.GOOGLE_TALK_PROTOCOL,
            )
        )
        new_contact.structured_postal_address.append(
            gdata.data.PostalAddress(
            rel=gdata.data.WORK_REL,
            primary="true",
            street=gdata.data.Street(text="1600 Amphitheatre Pkwy"),
            city=gdata.data.City(text="Mountain View"),
            region=gdata.data.Region(text="CA"),
            postcode=gdata.data.Postcode(text="94043"),
            country=gdata.data.Country(text="United States"),)
        )
        contact_entry = gd_client.create_contact(new_contact) 
        print("Contact's ID: %s" % contact_entry.id.text)
        return Response(contact_entry)

所以,现在我只想知道如何授权该服务帐户将数据写入我的目录

旁注:我已在我的管理控制台中为服务帐户提供了所需的所有授权

我发现使用发现 build 函数并不是调用与域共享联系人 API 关联的 create_contact() 函数的正确方法。我发现我可以使用位于 gdata 库中的 gauth 模块授权我的服务帐户,您可以 import 如下所示:

import gdata.gauth

之后,

  1. 您创建服务帐户凭据的方式与中所示的方式相同 问题代码。
  2. 使用位于里面的OAuth2TokenFromCredentials class gauth 模块为您提供使用 OAuth 2.0 的方法 获得用于 google-api-python-client 的凭证 gdata-python-client 中的凭据,您可以按如下方式使用它: auth2token = gdata.gauth.OAuth2TokenFromCredentials(credentials)

credentials in the code above refer to the credentials you just created using your service account email and key file.

  1. 授权您的 gdata 客户端gd_client = auth2token.authorize(gd_client)

然后,恭喜您可以使用您的 gdata 客户端通过您的服务帐户发出授权请求,在任何工作区模拟任何管理员。