Google 目录 API return 过时的值
Google Directory API return outdated values
我有大约 2 周的奇怪问题。我的 python 脚本重复(每 5 分钟)为 gsuite 用户询问 google 目录 api。 A 想找到已启用 2 因素身份验证 (isEnrolledIn2Sv) 的用户
不幸的是,当用户打开 2FA 时,我的脚本 returns isEnrolledIn2Sv=True 仅在几个小时后。
当我通过 gam ( https://github.com/jay0lee/GAM ) 询问时,立即得到正确答案。
这是怎么回事?某种缓存?为什么google return给我几个小时没有实际数据?可能是我的 python 库版本有错误?
我的python代码:
from google.oauth2 import service_account
import googleapiclient.discovery
...
...
...
#inside class:
def run(self):
log("Start no2faMonitor ")
while (True):
log("checking no2fa list")
self.get_google_token()
self.ask_google_user()
log("Users in no2fa with 2-step verification: {}".format(len(self.users)))
for u in self.users:
self.send_notify(u)
time.sleep(274)
#---------------------------------------------------------------------------------
def get_google_token(self):
credentials = service_account.Credentials.from_service_account_file(config.ServiceAccountFile, scopes=config.GoogleScopes).with_subject(config.SubjectAccount)
self.directory = googleapiclient.discovery.build('admin', 'directory_v1', credentials=credentials)
#---------------------------------------------------------------------------------
def ask_google_user(self):
results = self.directory.users().list(customer="my_customer", query="orgUnitPath=/no2fa", maxResults=500).execute()
self.userdata = json.loads(json.dumps(results))
for element in self.userdata['users']:
log("user: {}, 2fa: {}".format(element['primaryEmail'], element['isEnrolledIn2Sv']))
...
...
...
元素['isEnrolledIn2Sv'] 包含 "False" 用于启用 2FA 的用户。
**pip3 list | grep google**
google 2.0.1
google-api-python-client 1.7.4
google-auth 1.5.1
google-auth-httplib2 0.0.3
大约 2 周前,everythink 工作正常,我在 5 分钟后收到了很好的答案
我在 python 库中找到了缓存参数。 (默认为真)
build(serviceName, version, http=None, discoveryServiceUrl=DISCOVERY_URI, developerKey=None, model=None, requestBuilder=HttpRequest, credentials=None, cache_discovery=True, cache=None)
Construct a Resource for interacting with an API.
已验证补丁:
- self.directory = googleapiclient.discovery.build('admin', 'directory_v1', credentials=credentials)
+ self.directory = googleapiclient.discovery.build('admin', 'directory_v1', credentials=credentials, cache_discovery=False)
不幸的是,我最后的回答是不正确的。
我找到了解决这个问题的正确方法。
将方法从 list() 更改为 get() 后,所有返回的数据都是最新的。
list() 应该只用于获取用户列表,而不是它的参数
results = self.directory.users().list(customer="my_customer", query="orgUnitPath=/no2fa", maxResults=500).execute()
不幸的是 get() 需要每个用户一个请求。
getuser = self.directory.users().get(userKey=element['primaryEmail'], projection="full").execute()
我有大约 2 周的奇怪问题。我的 python 脚本重复(每 5 分钟)为 gsuite 用户询问 google 目录 api。 A 想找到已启用 2 因素身份验证 (isEnrolledIn2Sv) 的用户 不幸的是,当用户打开 2FA 时,我的脚本 returns isEnrolledIn2Sv=True 仅在几个小时后。
当我通过 gam ( https://github.com/jay0lee/GAM ) 询问时,立即得到正确答案。
这是怎么回事?某种缓存?为什么google return给我几个小时没有实际数据?可能是我的 python 库版本有错误?
我的python代码:
from google.oauth2 import service_account
import googleapiclient.discovery
...
...
...
#inside class:
def run(self):
log("Start no2faMonitor ")
while (True):
log("checking no2fa list")
self.get_google_token()
self.ask_google_user()
log("Users in no2fa with 2-step verification: {}".format(len(self.users)))
for u in self.users:
self.send_notify(u)
time.sleep(274)
#---------------------------------------------------------------------------------
def get_google_token(self):
credentials = service_account.Credentials.from_service_account_file(config.ServiceAccountFile, scopes=config.GoogleScopes).with_subject(config.SubjectAccount)
self.directory = googleapiclient.discovery.build('admin', 'directory_v1', credentials=credentials)
#---------------------------------------------------------------------------------
def ask_google_user(self):
results = self.directory.users().list(customer="my_customer", query="orgUnitPath=/no2fa", maxResults=500).execute()
self.userdata = json.loads(json.dumps(results))
for element in self.userdata['users']:
log("user: {}, 2fa: {}".format(element['primaryEmail'], element['isEnrolledIn2Sv']))
...
...
...
元素['isEnrolledIn2Sv'] 包含 "False" 用于启用 2FA 的用户。
**pip3 list | grep google**
google 2.0.1
google-api-python-client 1.7.4
google-auth 1.5.1
google-auth-httplib2 0.0.3
大约 2 周前,everythink 工作正常,我在 5 分钟后收到了很好的答案
我在 python 库中找到了缓存参数。 (默认为真)
build(serviceName, version, http=None, discoveryServiceUrl=DISCOVERY_URI, developerKey=None, model=None, requestBuilder=HttpRequest, credentials=None, cache_discovery=True, cache=None)
Construct a Resource for interacting with an API.
已验证补丁:
- self.directory = googleapiclient.discovery.build('admin', 'directory_v1', credentials=credentials)
+ self.directory = googleapiclient.discovery.build('admin', 'directory_v1', credentials=credentials, cache_discovery=False)
不幸的是,我最后的回答是不正确的。 我找到了解决这个问题的正确方法。
将方法从 list() 更改为 get() 后,所有返回的数据都是最新的。
list() 应该只用于获取用户列表,而不是它的参数
results = self.directory.users().list(customer="my_customer", query="orgUnitPath=/no2fa", maxResults=500).execute()
不幸的是 get() 需要每个用户一个请求。
getuser = self.directory.users().get(userKey=element['primaryEmail'], projection="full").execute()