Google Directory API返回过时的值

问题描述 投票:1回答:2

我有一个奇怪的问题,大约有两个星期。我的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 python-3.x google-directory-api
2个回答
0
投票

我在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)

0
投票

不幸的是我的最后一个答案不正确。我找到了解决此问题的正确方法。

将方法从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()
© www.soinside.com 2019 - 2024. All rights reserved.