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()