【问题标题】:How to create a Google calendar event for non-workspace-google account, if the event was created through Service Account(Google Calendar API)?如果活动是通过服务帐户(Google 日历 API)创建的,如何为非工作区 Google 帐户创建 Google 日历活动?
【发布时间】:2021-12-08 21:03:47
【问题描述】:

我可以使用服务帐户和 Google 日历 API 在 Google 日历中创建一个活动,其中项目和服务帐户是在 Google Workspace 管理员帐户中创建的,并且在同一个帐户中,我启用了域范围的委派属性。我没有创建单独的日历,也没有授予对服务帐户的访问权限。如果我在 createDelegated() 中使用我的 Workspace-google 帐户,则此活动将在“abc@myworkspace.com”日历中创建,并且“创建者”属性对于我添加的每个与会者也是相同的。

GoogleCredentials googleCredentials = GoogleCredentials
                    .fromStream(new FileInputStream(CREDENTIALS_FILE_PATH)).createScoped(SCOPES)
                    .createDelegated("abc@myworkspace.com");

所以我的问题是如果我需要为非工作区谷歌帐户创建事件怎么办(比如说 def@gmail.com)

我可以将“def@gmail.com”传递给 createDelegated() 吗?如果我这样做,我会得到,

Error getting access token for service account: 400 Bad Request

那么如何为非工作区的谷歌帐户创建活动?

注意:OAuth 同意屏幕中的应用类型仍为“内部”。

有人能解释一下我在这里缺少什么吗?

【问题讨论】:

    标签: google-api google-calendar-api service-accounts google-api-java-client


    【解决方案1】:

    具有域范围委派的服务帐户只能用于域

    Google Workspace 帐户是一个域,个人消费者帐户不是一个域。

    因此,您无法通过服务帐户代表消费者帐户用户执行请求。

    相反,您需要将事件直接创建为def@gmail.com,类似于documentation sample

    【讨论】:

    • 您能告诉我service 对象是如何创建的吗?我的意思是说它是通过哪种方式创建的?它不是使用服务帐户密钥创建的吗?
    • @TheSagya 实现服务帐户授权的实际机制比服务帐户密钥要复杂一些 尝试阅读此Using OAuth 2.0 for Server to Server Applications 密切注意 JWT 是如何创建的。跨度>
    • 不,当使用this 工作流时,服务对象是按照here 的解释创建的。对于此流程,您需要下载并使用与服务帐户密钥相对的用户凭证 json。用户需要按照here 的说明手动授权应用程序。
    【解决方案2】:

    不,您只能委托给您域中的帐户

    createDelegated("abc@myworkspace.com");
    

    您无法使用标准的 google 帐户,因为您无法配置权限

    perform-google-workspace-domain-wide-delegation-of-authority

    Perform Google Workspace Domain-Wide Delegation of Authority

    注意:只有有权访问 Admin API 的用户才能访问 Admin SDK Directory API,因此您的服务帐号需要模拟其中一位用户才能访问 Admin SDK Directory API。此外,用户必须至少登录一次并接受 Google Workspace 服务条款。

    所有者与参与者。

    正确委派的服务帐户。将有权代表域中已被委派权限的用户创建事件。

    示例:我已将我的服务帐户的权限委托给用户 User1@myDomain.com。对于所有密集型目的,服务帐户现在拥有 User1 的所有权限。因此,服务帐号可以代表 user1 创建一个新活动,并邀请任何人参加他们选择的活动。

    由于无法设置对 user2@gmail.com 的委托,因此服务帐户无法像该用户一样行事,因为它是标准 gmail 用户。

    应用程序代表 user2@gmail.com 创建事件的唯一方法是使用 Oauth2 并请求 User2@gmail.com 同意访问他们的私人数据。然后应用程序将能够代表 User2@gmail.com 创建一个新事件。

    记住这是在创建一个事件。没有什么可以阻止委派为 user1@mydomain.com 的服务帐户邀请 user2@gmail.com 参加活动。然后 user2@gmail.com 将收到通知,他们已被邀请参加该活动,然后他们可以决定是否要参加,如果他们接受,那么它将出现在他们的谷歌日历帐户中。请注意 user2@gmail.com 如何必须手动接受这一点。 User1@mydomain.com 不必手动接受该事件是在他们的谷歌日历中创建的,因为服务帐户代表他们行事。

    【讨论】:

    • 您能否参考我可以使用 API 为标准 google 帐户创建事件的链接?哪个应该是服务器到服务器的通信,标准谷歌帐户不应该有同意屏幕?
    • 你不能。服务帐户仅适用于 Workspace 帐户。如果您想在我的 Google 日历帐户中创建一个活动,您需要获得我的许可才能获得该许可,您需要通过 Oauth2 授权并请求许可。 Google calendar java Oauth2 sample
    • 好的,现在我创建了一个服务帐户,并使用它的 JSON 密钥进行授权,并且我可以在我的日历中创建事件(这是我的工作区帐户)。在此活动中,我已将我的标准 google 帐户(非工作区帐户)添加为与会者,并且我可以在我的标准 google 帐户的日历中看到由属性创建的特定事件是我的工作区帐户。我的标准 Google 帐户也没有获得任何许可。
    • 那是因为您已将标准用户添加为与会者。该用户可能收到一封电子邮件并且必须接受该事件。参加者和活动的所有者之间是有区别的。未经我的许可,您不能直接在我是所有者的 Google 日历帐户中创建活动。您可以邀请我参加您拥有的活动,如果我接受,我将被添加。
    • 是的,首先我使用标准 google 帐户 (A) 作为参与者,并且没有接受过程,仍然在日历中创建事件作为事件的参与者。这件事没关系,实际上我想你现在明白了我的问题,我需要创建一个事件,它只能(或必须)在我的工作区帐户日历中创建,但它应该以其他与会者的方式创建(除了标准account(A)) 应该只以参与者的身份在他们的日历中创建活动,但它会显示所有者是标准 Google 帐户(A),这可能吗?
    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 2021-10-31
    • 2020-08-27
    • 1970-01-01
    • 2023-04-04
    • 2019-10-24
    • 2017-01-24
    • 2022-11-19
    相关资源
    最近更新 更多