无法授权我的服务帐户使用域共享联系人 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
之后,
- 您创建服务帐户凭据的方式与中所示的方式相同
问题代码。
- 使用位于里面的
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.
- 授权您的 gdata 客户端
gd_client = auth2token.authorize(gd_client)
然后,恭喜您可以使用您的 gdata 客户端通过您的服务帐户发出授权请求,在任何工作区模拟任何管理员。
我正在尝试模拟超级管理员帐户以使用共享联系人 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
之后,
- 您创建服务帐户凭据的方式与中所示的方式相同 问题代码。
- 使用位于里面的
OAuth2TokenFromCredentials
classgauth
模块为您提供使用 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.
- 授权您的 gdata 客户端
gd_client = auth2token.authorize(gd_client)
然后,恭喜您可以使用您的 gdata 客户端通过您的服务帐户发出授权请求,在任何工作区模拟任何管理员。