我有一个奇怪的问题,大约有两个星期。我的python脚本反复(每5分钟一次)向gsuite用户询问google目录api。 A希望查找启用了2因子身份验证(isEnrolledIn2Sv)的用户不幸的是,当用户打开2FA时,我的脚本仅在几个小时后返回isEnrolledIn2Sv = True。
当我用gam(https://github.com/jay0lee/GAM)询问时,可以立即正确回答。
发生了什么事?某种缓存?为什么Google几个小时都没有向我返回实际数据?我的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']))
...
...
...
对于打开2FA的用户,element ['isEnrolledIn2Sv']包含“ False”。
**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
[大约两周前,一切都正常,在5分钟后我收到了很好的答案
我在python库中找到了缓存参数。 (默认为True)
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()
[unfortunley get()每个用户需要一个需求集。
getuser = self.directory.users().get(userKey=element['primaryEmail'], projection="full").execute()