【问题标题】:Google Provisioning API no longer allowing restore(unsuspend) of userGoogle Provisioning API 不再允许恢复(取消挂起)用户
【发布时间】:2012-11-21 18:27:10
【问题描述】:

还有人看到这个吗? Google 多域配置 API 似乎发生了一些变化。我有长时间运行的代码可以恢复已停止工作的暂停用户。我使用 Python 和 Python GData 库的 2.0.17 以及 UpdateUser 方法来执行此操作。我还注意到同一个库中的 RetrieveUser 不再返回暂停用户的名字和姓氏。我已在 Google apps-api-issues 提交了一个问题,如果您看到此问题,请加注星标。

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

【问题讨论】:

  • 我已确认 GAM 存在名字、姓氏问题,但 GAM 在恢复已暂停的用户帐户时没有问题。听起来库发送的 XML 有问题,GAM 使用多域 API 调用,但它有自己的多域库。你能分享一个有 unsuspend 问题的代码示例吗?

标签: google-provisioning-api


【解决方案1】:

这是一个解决问题的简单示例。请注意,从暂停用户的 RetrieveUser() 返回的 user_entry 对象将没有名字或姓氏的属性值。修改后的 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))

【讨论】:

    【解决方案2】:

    感谢 user1803418,这解释了为什么恢复用户可以使用 GAM 而不是您的代码。 RetrieveUser API 调用中缺少 firstName 和 lastName 绝对是 Google 需要解决的问题。但是,我会将取消挂起问题描述为客户端库缺陷,该缺陷会因 firstName/lastName 问题而加剧。

    API 只要求在更新用户 API 调用中提交正在更新的属性。无需指定用户的名字、姓氏和其他对象详细信息。这意味着检索用户以执行更新只会使更新过程花费更长的时间,实际上只需要一次 API 调用。

    GAM 使用它自己的多域 API 调用实现,这是我在发布 multidomain/client.py 之前编写的。 GAM 的实现不需要设置所有用户属性来执行更新。您可以通过以下方式看到这一点: http://code.google.com/p/google-apps-manager/source/browse/trunk/gdata/apps/multidomain/service.py#69

    只有在调用 UpdateUser() 时设置的属性才会发送给 Google。您可以通过安装 GAM 并在使用 GAM 命令取消暂停用户之前创建一个名为 debug.gam 的文件来亲眼看到这一点:

    游戏更新用户暂停

    向 Google 发出的 XML 请求将是最小的,只显示几个字段,包括用户的暂停状态。 firstName 和 lastName 不会包含在请求中。

    所以我认为您在这里有 3 个选项:

    1) 等待 Google 解决 firstName/lastName 问题。这也应该解决取消挂起的问题。

    2) 重写 multidomain/client.py UpdateUser() 函数,使其不需要设置所有用户属性即可执行更新。

    3) 切换您的代码以使用 GAM 的自定义 multidomain/service.py 库,因为它只支持更新用户提供的属性。

    【讨论】:

    • 感谢您的检查。我想我现在要做的是在多域客户​​端中修改 UpdateUser。
    【解决方案3】:

    我希望 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多