Google Provisioning API больше не позволяет восстановить (приостановить) пользователя

Кто-нибудь еще видел это? Похоже, что были внесены некоторые изменения в API обеспечения Google для нескольких доменов. У меня давно работает код, который может восстановить приостановленного пользователя, который перестал работать. Я использую Python и 2.0.17 библиотек Python GData и метод UpdateUser для этого. Я также отметил, что RetrieveUser в той же библиотеке больше не возвращает имя и фамилию приостановленных пользователей. Я подал сообщение об ошибке в Google Apps-Api-Issues, пожалуйста, отметьте, если вы видите это.

http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=3281

3 ответа

Это простой пример, который поможет решить проблему. Обратите внимание, что объект user_entry, возвращенный из RetrieveUser() для приостановленного пользователя, не будет иметь значения свойства ни для имени, ни для фамилии. Модифицированный объект user_entry передается в UpdateUser(), который не позволяет пропустить значения для имени и фамилии.

#!/usr/bin/python
import sys
import gdata.apps.multidomain.client

if len(sys.argv) < 4:
  print "\nUsage:"
  print sys.argv[0], "admin_email admin_password user_email\n"
  sys.exit(0)

admin = sys.argv[1]
password = sys.argv[2]
email = sys.argv[3]
domain = ""
if '@' in admin:
  admin_name,domain = admin.split('@', 1)
else:
  print "Specify full email address of administrator.\n"
  print "\nUsage:"
  print sys.argv[0], "admin_email admin_password user_email\n"
  sys.exit(0)
if '@' not in email:
  print "Specify full email address of user.\n"
  print "\nUsage:"
  print sys.argv[0], "admin_email admin_password user_email\n"
  sys.exit(0)

md_client = gdata.apps.multidomain.client.MultiDomainProvisioningClient(
  domain=domain)
md_client.ClientLogin(email=admin, password=password, source='MDPROVISIONING')
print "Retrieve user: %s\n" %(email)
user_entry = md_client.RetrieveUser(email)
print user_entry
print ('\nRetrieve results: email: %s, suspended: %s,'
  ' first name: %s, last name: %s\n' 
  %(user_entry.email,user_entry.suspended,
    user_entry.first_name,user_entry.last_name))
print "Update user (suspend): %s\n" %(email)
user_entry.suspended = 'true'
updated_user_entry = md_client.UpdateUser(email, user_entry)
print updated_user_entry
print ('\nSuspend results: email: %s, suspended: %s,'
  ' first name: %s, last name: %s\n' 
  %(updated_user_entry.email,updated_user_entry.suspended,
    updated_user_entry.first_name,updated_user_entry.last_name))
print "Retrieve user: %s\n" %(email)
user_entry = md_client.RetrieveUser(email)
print user_entry
print ('\nRetrieve results: email: %s, suspended: %s,'
  ' first name: %s, last name: %s\n' 
  %(user_entry.email,user_entry.suspended,
    user_entry.first_name,user_entry.last_name))
print "Update user (restore): %s\n" %(email)
user_entry.suspended = 'false'
updated_user_entry = md_client.UpdateUser(email, user_entry)
print updated_user_entry
print ('\nRestore results: email: %s, suspended: %s,'
  ' first name: %s, last name: %s\n' 
  %(updated_user_entry.email,updated_user_entry.suspended,
    updated_user_entry.first_name,updated_user_entry.last_name))

Спасибо user1803418, это объясняет, почему восстановление пользователя работает с GAM, а не с вашим кодом. Отсутствие firstName и lastName в вызове API RetrieveUser определенно является проблемой со стороны Google, которую они должны будут исправить. Тем не менее, я бы описал проблему unsuspend как недостаток клиентской библиотеки, который усугубляется проблемой firstName/lastName.

API требует, чтобы только атрибуты, которые обновляются, были отправлены в вызове API обновления пользователя. Нет необходимости указывать firstName пользователя, lastName и другие подробности объекта. Это означает, что извлечение пользователя для выполнения обновления просто делает процесс обновления более длительным, на самом деле необходим только один вызов API.

GAM использует свою собственную реализацию многодоменных API-вызовов, которые я написал до выпуска multidomain/client.py. Реализация GAM не требует, чтобы все пользовательские атрибуты были установлены для выполнения обновления. Вы можете увидеть это, просмотрев: http://code.google.com/p/google-apps-manager/source/browse/trunk/gdata/apps/multidomain/service.py

в Google отправляются только те атрибуты, которые установлены при вызове UpdateUser(). Вы можете убедиться в этом сами, установив GAM и создав файл с именем debug.gam, прежде чем отменить приостановку пользователя с помощью команды GAM:

Gam обновление пользователя приостановлено

XML-запрос к Google будет минимальным, показывая только несколько полей, включая статус приостановленного пользователя. firstName и lastName не будут включены в запрос.

Поэтому я думаю, что у вас есть 3 варианта здесь:

1) дождаться исправления от Google для проблемы firstName/lastName. Это также должно решить проблему с приостановкой.

2) переписать multidomain/client.py функцию UpdateUser(), чтобы не требовалось устанавливать все пользовательские атрибуты для выполнения обновления.

3) переключите свой код, чтобы использовать настраиваемую библиотеку GAM multidomain / service.py, поскольку она поддерживает обновление только предоставленных атрибутов для пользователя.

Я надеюсь, что Google исправит пропущенные имена в ближайшее время. Модификация UpdateUser в многодоменном клиенте (gdata.apps.multidomain.client), кажется, продолжает работать:

def update_user(self, email, user_entry, **kwargs):

    user_entry = gdata.apps.multidomain.data.UserEntry(
        email=email,first_name=user_entry.first_name,
        last_name=user_entry.last_name,password=user_entry.password,
        change_password=user_entry.change_password_at_next_login,
        suspended=user_entry.suspended, is_admin=user_entry.is_admin,
        ip_whitelisted=user_entry.ip_whitelisted, quota=user_entry.quota)

    return self.update(user_entry,
                   uri=self.MakeMultidomainUserProvisioningUri(email),
                   **kwargs)
Другие вопросы по тегам