使用服务账号获取Google Calendar资源列表提示未授权如何解决
问题1:使用了错误的API Scope
你当前使用的https://apps-apis.google.com/a/feeds/calendar/resource/是旧版日历资源API的Scope,适配当前调用的Directory API v1资源日历接口的Scope应为:
- 只读权限:
https://www.googleapis.com/auth/admin.directory.resource.calendar.readonly - 读写权限:
https://www.googleapis.com/auth/admin.directory.resource.calendar
替换正确Scope后需要重新在Google Admin控制台的「API权限」页面对服务账号授予对应Scope的全域访问权限。
问题2:未配置服务账号的管理员身份模拟
Directory API的资源日历查询接口需要域管理员权限,服务账号本身没有对应权限,你需要在生成凭证时指定要模拟的域管理员账号,Ruby代码调整如下:
scope = 'https://www.googleapis.com/auth/admin.directory.resource.calendar.readonly' authorizer = Google::Auth::ServiceAccountCredentials.make_creds( json_key_io: File.open('path-to-service-account.json'), scope: scope, # 新增此行,填写你的域内拥有资源日历管理权限的管理员邮箱 subject: 'admin@your-domain.com' ) authorizer.fetch_access_token!
注意:使用该功能前必须先在Google Cloud控制台为对应服务账号开启「全域权限委托」开关。
问题3:请求参数和鉴权配置错误
key参数:该参数是未使用OAuth2鉴权时才需要传递的公开API密钥,你已经携带Authorization请求头的情况下,完全不需要传递key参数,该参数也和服务账号密钥ID没有任何关系。access_token使用:接口返回的完整access_token直接填写到Authorization: Bearer后即可,不需要省略任何字符,也不需要转换为JWT格式,你看到的省略号是输出时的截断内容,实际调用使用完整返回值即可。CUSTOMER参数:不需要填写控制台获取的C开头字符串,直接填写固定值my_customer即可自动匹配当前服务账号所属的域,降低参数填写错误概率。
内容的提问来源于stack exchange,提问作者Tomasz Cieńciała
相关产品推荐
相关产品推荐

