我正在使用设备的序列号作为参考,通过Google管理员目录API检索ChromeOS设备的MAC地址,我正在通过
apiclient
。
service = discovery.build('admin', 'directory_v1', developerKey=settings.API_KEY)
Here是适用于ChromeOS设备的电话;我的问题是我需要一个设备ID才能执行以下操作:
service.chromeosdevices().get(customerId=settings.CID, deviceId=obtained_id, projection=None).execute()
我可以通过以下格式发送GET查询:
https://www.googleapis.com/admin/directory/v1/customer/my_customer/devices/chromeos?projection=full&query=id:" + serial + "&orderBy=status&sortOrder=ascending&maxResults=10", "GET")
...但我试图避免使用OAuth2并只使用我的API密钥。在key
请求中传递GET
也不起作用,因为它仍然会返回"需要登录" 通知。
如何将上述查询压缩为apiclient
友好格式?我通过上述调用找到的唯一选项是请求我们拥有的每个设备(通过list
),然后筛选匹配序列号的大量数据,这看似愚蠢和过度
我注意到我可以致电apiclient.http.HttpRequests
,但我也找不到通过它传递API密钥的方法。有new_batch_http_request
,但我无法从文档中看出如何简单地将URL传递给它。
谢谢!
答案 0 :(得分:0)
您不能只使用目录API查询的密钥,而是需要服务帐户。
我使用google-auth
(see here),因为oauth2client
已被弃用。
您还需要:
为您的服务帐户委派必要的权限(我的角色为Viewer
,并且可以访问https://www.googleapis.com/auth/admin.directory.device.chromeos.readonly
在管理控制台中单独委派API访问权限(安全性 - >高级设置 - >身份验证)
获取json
客户端密钥并将其与您的应用放在一起(不要将其包含在您的VCS中)
获取您的凭据:
credentials = service_account.Credentials.from_service_account_file(
settings.CLIENT_KEY,
scopes=settings.SCOPES,
subject=settings.ADMIN_USER)
其中ADMIN_USER是授权域管理员的电子邮件地址。
然后你发送一个GET请求:
authed_session = AuthorizedSession(credentials)
response = authed_session.get(request_id_url)
这会返回您可以通过response.content
阅读的请求对象。
希望它可以帮助别人!