在我的 GSuite 日历上创建活动并使用服务帐户邀请与会者
Create event on my GSuite Calendar and inviting attendees using Service Account
我不知道我做错了什么。尝试通过 google 服务帐户邀请某人参加活动。
第一步 - 我去了开发者控制台并添加了一个服务帐户,得到了密钥(存储在下面代码中的 better.json 中),给了它日历API 权限,它有 oath2 权限:
第二步-我给了我的服务账号'GSuite Domain-wide Delegation'
第三步 - 在 GSuite 方面,我登录到我的管理面板,找到了这个小家伙并进行了适当的更新。我认为?范围? :
最后但同样重要的是,这是我 运行 的代码。
require 'googleauth'
scope = 'https://www.googleapis.com/auth/calendar'
authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: File.open('better.json'),
scope: scope)
authorizer.fetch_access_token!
service = Google::Apis::CalendarV3::CalendarService.new
service.authorization = authorizer
calendar_id = 'primary'
event = Google::Apis::CalendarV3::Event.new(
summary: 'douchin',
location: '800 Howard St., San Francisco, CA 94103',
description: 'A chance to hear more about Google\'s developer products.',
start: Google::Apis::CalendarV3::EventDateTime.new(
date_time: '2020-04-06T09:00:00-07:00',
time_zone: 'America/New_York'
),
end: Google::Apis::CalendarV3::EventDateTime.new(
date_time: '2020-04-06T10:00:00-07:00',
time_zone: 'America/New_York'
),
recurrence: [
'RRULE:FREQ=DAILY;COUNT=2'
],
guestsCanModify: 'TRUE',
attendees: [
Google::Apis::CalendarV3::EventAttendee.new(
email: 'brianthebiologist@gmail.com'
)
],
reminders: Google::Apis::CalendarV3::Event::Reminders.new(
use_default: false,
overrides: [
Google::Apis::CalendarV3::EventReminder.new(
reminder_method: 'email',
minutes: 24 * 60
),
Google::Apis::CalendarV3::EventReminder.new(
reminder_method: 'popup',
minutes: 10
)
]
)
)
result = service.insert_event('primary', event)
puts "Event created: #{result.html_link}"
response = service.list_events(calendar_id,
max_results: 10,
single_events: true,
order_by: 'startTime',
time_min: Time.now.iso8601)
puts 'Upcoming events:'
puts 'No upcoming events found' if response.items.empty?
response.items.each do |event|
start = event.start.date || event.start.date_time
puts "- #{event.summary} (#{event.html_link})"
end
我有两个问题。
1) 如果我尝试创建一个有参与者的活动(这才是我真正想要的),我会得到错误:forbiddenForServiceAccounts:如果没有 Domain-Wide 授权,服务帐户无法邀请与会者。 (Google::Apis::ClientError)
2)如果我尝试创建一个没有任何与会者的活动,它说它有效,并将信息存储在一些神奇的某个地方的日历...但是当我在 Google 上登录我的管理员帐户时,它没有显示在我的 GSuite 日历中。所以我的身份验证工作了..我认为..它回滚了一个事件link,但是当我尝试去它时我得到另一个错误:"could not find requested event" on the google calendar ui.
好的 - 解决了这个问题。我只需要使用 Signet 来生成令牌而不是我正在使用的任何东西,下面的示例其中 privatekey = my service accounts private key cred:
signing_key = OpenSSL::PKey::RSA.new(privatekey.gsub("\n", "\n"), 'notasecret')
authorizer = Signet::OAuth2::Client.new(
{
signing_key: signing_key,
token_credential_uri: "https://accounts.google.com/o/oauth2/token",
audience: "https://accounts.google.com/o/oauth2/token",
issuer: ENV['service_account_email'],
person: ENV['email_on_my_domain_i_want_to_impersonate'],
scope: scope
})
token = authorizer.fetch_access_token!
希望有一天这对某人有所帮助!如果有,请点赞。
我不知道我做错了什么。尝试通过 google 服务帐户邀请某人参加活动。
第一步 - 我去了开发者控制台并添加了一个服务帐户,得到了密钥(存储在下面代码中的 better.json 中),给了它日历API 权限,它有 oath2 权限:
第二步-我给了我的服务账号'GSuite Domain-wide Delegation'
第三步 - 在 GSuite 方面,我登录到我的管理面板,找到了这个小家伙并进行了适当的更新。我认为?范围? :
最后但同样重要的是,这是我 运行 的代码。
require 'googleauth'
scope = 'https://www.googleapis.com/auth/calendar'
authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: File.open('better.json'),
scope: scope)
authorizer.fetch_access_token!
service = Google::Apis::CalendarV3::CalendarService.new
service.authorization = authorizer
calendar_id = 'primary'
event = Google::Apis::CalendarV3::Event.new(
summary: 'douchin',
location: '800 Howard St., San Francisco, CA 94103',
description: 'A chance to hear more about Google\'s developer products.',
start: Google::Apis::CalendarV3::EventDateTime.new(
date_time: '2020-04-06T09:00:00-07:00',
time_zone: 'America/New_York'
),
end: Google::Apis::CalendarV3::EventDateTime.new(
date_time: '2020-04-06T10:00:00-07:00',
time_zone: 'America/New_York'
),
recurrence: [
'RRULE:FREQ=DAILY;COUNT=2'
],
guestsCanModify: 'TRUE',
attendees: [
Google::Apis::CalendarV3::EventAttendee.new(
email: 'brianthebiologist@gmail.com'
)
],
reminders: Google::Apis::CalendarV3::Event::Reminders.new(
use_default: false,
overrides: [
Google::Apis::CalendarV3::EventReminder.new(
reminder_method: 'email',
minutes: 24 * 60
),
Google::Apis::CalendarV3::EventReminder.new(
reminder_method: 'popup',
minutes: 10
)
]
)
)
result = service.insert_event('primary', event)
puts "Event created: #{result.html_link}"
response = service.list_events(calendar_id,
max_results: 10,
single_events: true,
order_by: 'startTime',
time_min: Time.now.iso8601)
puts 'Upcoming events:'
puts 'No upcoming events found' if response.items.empty?
response.items.each do |event|
start = event.start.date || event.start.date_time
puts "- #{event.summary} (#{event.html_link})"
end
我有两个问题。
1) 如果我尝试创建一个有参与者的活动(这才是我真正想要的),我会得到错误:forbiddenForServiceAccounts:如果没有 Domain-Wide 授权,服务帐户无法邀请与会者。 (Google::Apis::ClientError)
2)如果我尝试创建一个没有任何与会者的活动,它说它有效,并将信息存储在一些神奇的某个地方的日历...但是当我在 Google 上登录我的管理员帐户时,它没有显示在我的 GSuite 日历中。所以我的身份验证工作了..我认为..它回滚了一个事件link,但是当我尝试去它时我得到另一个错误:"could not find requested event" on the google calendar ui.
好的 - 解决了这个问题。我只需要使用 Signet 来生成令牌而不是我正在使用的任何东西,下面的示例其中 privatekey = my service accounts private key cred:
signing_key = OpenSSL::PKey::RSA.new(privatekey.gsub("\n", "\n"), 'notasecret')
authorizer = Signet::OAuth2::Client.new(
{
signing_key: signing_key,
token_credential_uri: "https://accounts.google.com/o/oauth2/token",
audience: "https://accounts.google.com/o/oauth2/token",
issuer: ENV['service_account_email'],
person: ENV['email_on_my_domain_i_want_to_impersonate'],
scope: scope
})
token = authorizer.fetch_access_token!
希望有一天这对某人有所帮助!如果有,请点赞。